diff --git a/server/src/main/java/dev/plex/hook/PrismHook.java b/server/src/main/java/dev/plex/hook/PrismHook.java index 9ffc3d2..d45c273 100644 --- a/server/src/main/java/dev/plex/hook/PrismHook.java +++ b/server/src/main/java/dev/plex/hook/PrismHook.java @@ -1,17 +1,30 @@ package dev.plex.hook; import dev.plex.Plex; +import dev.plex.util.PlexLog; +import dev.plex.util.PlexUtils; +import java.time.Instant; +import java.util.List; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; +import org.prism_mc.prism.api.activities.ActivityQuery; import org.prism_mc.prism.paper.api.PrismPaperApi; +import org.prism_mc.prism.paper.api.activities.PaperActivityQuery; public class PrismHook { + private static final List ROLLBACK_ACTIONS = List.of("block-place", "block-break", "block-burn", "entity-spawn", "entity-kill", "entity-explode"); + + private final Plex plex; private RegisteredServiceProvider provider; public PrismHook(Plex plex) { + this.plex = plex; Plugin plugin = plex.getServer().getPluginManager().getPlugin("Prism"); // Check that Prism is loaded @@ -32,5 +45,49 @@ public class PrismHook { return provider.getProvider(); } + + public void rollback(CommandSender sender, String playerName, int seconds) + { + long now = Instant.now().getEpochSecond(); + ActivityQuery query = PaperActivityQuery.builder() + .actionTypeKeys(ROLLBACK_ACTIONS) + .causePlayerName(playerName) + .before(now) + .after(now - seconds) + .rollback() + .build(); + + getPrism().rollback(sender, query).whenComplete((result, error) -> + plex.getApi().scheduler().runGlobal(() -> + { + if (error != null) + { + sendMessage(sender, PlexUtils.messageComponent("prismRollbackError", error.getMessage())); + PlexLog.error("Unable to rollback: {0}", error); + return; + } + + int count = result.applied(); + if (count == 0) + { + sendMessage(sender, PlexUtils.messageComponent("prismNoResult", count)); + PlexLog.debug("No activities are available to rollback"); + return; + } + + sendMessage(sender, PlexUtils.messageComponent("prismRollbackMessage", count)); + PlexLog.debug("Rolled back {0} activities", count); + })); + } + + private void sendMessage(CommandSender sender, Component message) + { + if (sender instanceof Player player) + { + plex.getApi().scheduler().runEntity(player, () -> sender.sendMessage(message)); + return; + } + sender.sendMessage(message); + } } diff --git a/server/src/main/java/dev/plex/hook/RollbackManager.java b/server/src/main/java/dev/plex/hook/RollbackManager.java index b51f2ca..107db45 100644 --- a/server/src/main/java/dev/plex/hook/RollbackManager.java +++ b/server/src/main/java/dev/plex/hook/RollbackManager.java @@ -2,23 +2,13 @@ package dev.plex.hook; import dev.plex.Plex; import dev.plex.api.rollback.RollbackApi; -import dev.plex.util.PlexLog; -import dev.plex.util.PlexUtils; -import java.time.Instant; import java.util.Collections; -import java.util.List; -import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.prism_mc.prism.api.activities.ActivityQuery; -import org.prism_mc.prism.paper.api.activities.PaperActivityQuery; public class RollbackManager implements RollbackApi { - private static final List ROLLBACK_ACTIONS = List.of("block-place", "block-break", "block-burn", "entity-spawn", "entity-kill", "entity-explode"); - private final Plex plugin; public RollbackManager(Plex plugin) @@ -38,7 +28,7 @@ public class RollbackManager implements RollbackApi { if (plugin.getPrismHook() != null && plugin.getPrismHook().hasPrism()) { - plugin.getApi().scheduler().runGlobal(() -> rollbackWithPrism(sender, playerName, seconds)); + plugin.getApi().scheduler().runGlobal(() -> plugin.getPrismHook().rollback(sender, playerName, seconds)); return true; } @@ -51,53 +41,9 @@ public class RollbackManager implements RollbackApi return false; } - private void rollbackWithPrism(CommandSender sender, String playerName, int seconds) - { - long now = Instant.now().getEpochSecond(); - ActivityQuery query = PaperActivityQuery.builder() - .actionTypeKeys(ROLLBACK_ACTIONS) - .causePlayerName(playerName) - .before(now) - .after(now - seconds) - .rollback() - .build(); - - plugin.getPrismHook().getPrism().rollback(sender, query).whenComplete((result, error) -> - plugin.getApi().scheduler().runGlobal(() -> - { - if (error != null) - { - sendMessage(sender, PlexUtils.messageComponent("prismRollbackError", error.getMessage())); - PlexLog.error("Unable to rollback: {0}", error); - return; - } - - int count = result.applied(); - if (count == 0) - { - sendMessage(sender, PlexUtils.messageComponent("prismNoResult", count)); - PlexLog.debug("No activities are available to rollback"); - return; - } - - sendMessage(sender, PlexUtils.messageComponent("prismRollbackMessage", count)); - PlexLog.debug("Rolled back {0} activities", count); - })); - } - private void rollbackWithCoreProtect(String playerName, int seconds) { plugin.getApi().scheduler().runAsync(() -> plugin.getCoreProtectHook().coreProtectAPI().performRollback(seconds, Collections.singletonList(playerName), null, null, null, null, 0, null)); } - - private void sendMessage(CommandSender sender, Component message) - { - if (sender instanceof Player player) - { - plugin.getApi().scheduler().runEntity(player, () -> sender.sendMessage(message)); - return; - } - sender.sendMessage(message); - } }