From c4bd65e7e0e7fcca0cda04f12488825d38c597a1 Mon Sep 17 00:00:00 2001 From: Nathan Curran <30569566+ncurran02@users.noreply.github.com> Date: Mon, 18 May 2026 06:03:45 +1000 Subject: [PATCH] Utilise the new Prism API (#101) * Start changes to use the new Prism API Currently, the Prism API doesn't support rollback so pushing the changes until such time the API allows you to rollback and/or restore modifications * Modified the API to use the new modification services * Only rollback activities that has occurred in previous 24 hours upon ban * code formatting [skip-ci] --- server/build.gradle.kts | 5 +- .../java/dev/plex/command/impl/BanCMD.java | 48 +++++++++++-------- .../main/java/dev/plex/hook/PrismHook.java | 15 +++--- server/src/main/resources/messages.yml | 7 ++- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/server/build.gradle.kts b/server/build.gradle.kts index ef4cebb..7439b28 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -15,6 +15,7 @@ plugins { repositories { maven(url = uri("https://maven.playpro.com")) maven(url = uri("https://nexus.telesphoreo.me/repository/plex-modules/")) + maven(url = uri("https://nexus.prism-mc.org/repository/maven-snapshots/")) } dependencies { @@ -29,7 +30,7 @@ dependencies { exclude("org.bukkit", "bukkit") } compileOnly("net.coreprotect:coreprotect:23.2") - compileOnly("network.darkhelmet.prism:Prism-Api:1.0.0") + compileOnly("org.prism_mc.prism:prism-paper-api:4.3-SNAPSHOT") compileOnly("com.github.LeonMangler:SuperVanish:6.2.19") implementation("org.bstats:bstats-base:3.2.1") implementation("org.bstats:bstats-bukkit:3.2.1") @@ -65,7 +66,7 @@ paper { required = false load = PaperPluginDescription.RelativeLoadOrder.BEFORE } - register("Prism") { + register("prism") { required = false load = PaperPluginDescription.RelativeLoadOrder.BEFORE } diff --git a/server/src/main/java/dev/plex/command/impl/BanCMD.java b/server/src/main/java/dev/plex/command/impl/BanCMD.java index c0a626c..0034e51 100644 --- a/server/src/main/java/dev/plex/command/impl/BanCMD.java +++ b/server/src/main/java/dev/plex/command/impl/BanCMD.java @@ -14,8 +14,10 @@ import dev.plex.util.PlexLog; import dev.plex.util.PlexUtils; import dev.plex.util.TimeUtils; +import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -26,6 +28,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +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; @CommandParameters(name = "ban", usage = "/ [reason] [-rb]", aliases = "offlineban,gtfo", description = "Bans a player, offline or online") @CommandPermissions(permission = "plex.ban", source = RequiredCommandSource.ANY) @@ -90,33 +95,38 @@ public class BanCMD extends PlexCommand if (rollBack) { - /*if (plugin.getPrismHook() != null && plugin.getPrismHook().hasPrism()) + if (plugin.getPrismHook() != null && plugin.getPrismHook().hasPrism()) { - PrismParameters parameters = plugin.getPrismHook().prismApi().createParameters(); - parameters.addActionType("block-place"); - parameters.addActionType("block-break"); - parameters.addActionType("block-burn"); - parameters.addActionType("entity-spawn"); - parameters.addActionType("entity-kill"); - parameters.addActionType("entity-explode"); - parameters.addPlayerName(plexPlayer.getName()); - parameters.setBeforeTime(Instant.now().toEpochMilli()); - parameters.setProcessType(PrismProcessType.ROLLBACK); - final Future result = plugin.getPrismHook().prismApi().performLookup(parameters, sender); - Bukkit.getAsyncScheduler().runNow(plugin, scheduledTask -> + PrismPaperApi prism = plugin.getPrismHook().getPrism(); + ActivityQuery query = PaperActivityQuery.builder() + .actionTypeKeys(Arrays.asList("block-place", "block-break", "block-burn", "entity-spawn", "entity-kill", "entity-explode")) + .causePlayerName(plexPlayer.getName()) + .before(Instant.now().getEpochSecond()) + .after(Instant.now().getEpochSecond() - 86400) + .rollback() + .build(); + prism.rollback(sender, query).whenCompleteAsync((result, error) -> { - try + if (error != null) { - final Result done = result.get(); + send(sender, messageComponent("prismRollbackError", error.getMessage())); + PlexLog.error("Unable to rollback: {0}", error); + return; } - catch (InterruptedException | ExecutionException e) + + int count = result.applied(); + if (count == 0) { - throw new RuntimeException(e); + send(sender, messageComponent("prismNoResult", count)); + PlexLog.debug("No activities are available to rollback"); + return; } + + send(sender, messageComponent("prismRollbackMessage", count)); + PlexLog.debug("Rolled back {0} activities", count); }); } - else */ - if (plugin.getCoreProtectHook() != null && plugin.getCoreProtectHook().hasCoreProtect()) + else if (plugin.getCoreProtectHook() != null && plugin.getCoreProtectHook().hasCoreProtect()) { Bukkit.getAsyncScheduler().runNow(plugin, scheduledTask -> { diff --git a/server/src/main/java/dev/plex/hook/PrismHook.java b/server/src/main/java/dev/plex/hook/PrismHook.java index 88b9845..9ffc3d2 100644 --- a/server/src/main/java/dev/plex/hook/PrismHook.java +++ b/server/src/main/java/dev/plex/hook/PrismHook.java @@ -1,12 +1,14 @@ package dev.plex.hook; import dev.plex.Plex; -import network.darkhelmet.prism.api.PrismApi; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.prism_mc.prism.paper.api.PrismPaperApi; public class PrismHook { - private PrismApi prismApi; + private RegisteredServiceProvider provider; public PrismHook(Plex plex) { @@ -18,18 +20,17 @@ public class PrismHook return; } - // Check that the API is enabled - this.prismApi = (PrismApi) plugin; + provider = Bukkit.getServicesManager().getRegistration(PrismPaperApi.class); } public boolean hasPrism() { - return prismApi != null; + return provider != null; } - public PrismApi prismApi() + public PrismPaperApi getPrism() { - return prismApi; + return provider.getProvider(); } } diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index 8fc1054..4314a41 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -279,4 +279,9 @@ reappliedGamerules: "All game rules have been re-applied!" commandNotFound: "That command could not be found!" # 0 - The command # 1 - A list of aliases found -commandAliases: "Aliases for {0} are: {1}" \ No newline at end of file +commandAliases: "Aliases for {0} are: {1}" +# 0 - Number of activities found to rollback +prismRollbackMessage: "Rolled back {0} activities" +# 0 - Error message returned from Prism +prismRollbackError: "Rollback failed: {0}" +prismNoResult: "No activities have been rolled back" \ No newline at end of file