Prism rollback fixes

This commit is contained in:
2026-07-09 17:24:04 -04:00
parent 3178b330d1
commit 156e0add31
2 changed files with 58 additions and 55 deletions
@@ -1,17 +1,30 @@
package dev.plex.hook; package dev.plex.hook;
import dev.plex.Plex; 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.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider; 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.PrismPaperApi;
import org.prism_mc.prism.paper.api.activities.PaperActivityQuery;
public class PrismHook public class PrismHook
{ {
private static final List<String> ROLLBACK_ACTIONS = List.of("block-place", "block-break", "block-burn", "entity-spawn", "entity-kill", "entity-explode");
private final Plex plex;
private RegisteredServiceProvider<PrismPaperApi> provider; private RegisteredServiceProvider<PrismPaperApi> provider;
public PrismHook(Plex plex) public PrismHook(Plex plex)
{ {
this.plex = plex;
Plugin plugin = plex.getServer().getPluginManager().getPlugin("Prism"); Plugin plugin = plex.getServer().getPluginManager().getPlugin("Prism");
// Check that Prism is loaded // Check that Prism is loaded
@@ -32,5 +45,49 @@ public class PrismHook
{ {
return provider.getProvider(); 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);
}
} }
@@ -2,23 +2,13 @@ package dev.plex.hook;
import dev.plex.Plex; import dev.plex.Plex;
import dev.plex.api.rollback.RollbackApi; 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.Collections;
import java.util.List;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender; 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 public class RollbackManager implements RollbackApi
{ {
private static final List<String> ROLLBACK_ACTIONS = List.of("block-place", "block-break", "block-burn", "entity-spawn", "entity-kill", "entity-explode");
private final Plex plugin; private final Plex plugin;
public RollbackManager(Plex plugin) public RollbackManager(Plex plugin)
@@ -38,7 +28,7 @@ public class RollbackManager implements RollbackApi
{ {
if (plugin.getPrismHook() != null && plugin.getPrismHook().hasPrism()) 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; return true;
} }
@@ -51,53 +41,9 @@ public class RollbackManager implements RollbackApi
return false; 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) private void rollbackWithCoreProtect(String playerName, int seconds)
{ {
plugin.getApi().scheduler().runAsync(() -> plugin.getApi().scheduler().runAsync(() ->
plugin.getCoreProtectHook().coreProtectAPI().performRollback(seconds, Collections.singletonList(playerName), null, null, null, null, 0, null)); 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);
}
} }