From 420d5a18665491218541cb75eb9668a4fb5c6830 Mon Sep 17 00:00:00 2001 From: TheTrouper <93684527+thetrouper@users.noreply.github.com> Date: Mon, 12 Feb 2024 16:04:30 -0600 Subject: [PATCH] Got the event made --- .../github/thetrouper/sentinel/Sentinel.java | 7 ++++ .../sentinel/cmds/SentinelCommand.java | 4 +-- .../thetrouper/sentinel/data/ActionType.java | 3 +- .../data/cmdblocks/WhitelistStorage.java | 4 ++- .../data/cmdblocks/WhitelistedBlock.java | 7 ++-- .../sentinel/data/config/MainConfig.java | 2 ++ .../sentinel/events/CMDBlockExecute.java | 19 +++++++++- .../sentinel/events/CMDBlockPlace.java | 2 +- .../sentinel/events/CMDBlockUse.java | 4 +-- .../sentinel/events/CMDMinecartPlace.java | 2 +- .../sentinel/events/CMDMinecartUse.java | 2 +- .../sentinel/events/CommandEvent.java | 6 ++-- .../thetrouper/sentinel/events/NBTEvents.java | 2 +- .../thetrouper/sentinel/server/Action.java | 2 +- .../server/functions/CMDBlockWhitelist.java | 35 ++++++++++++++----- .../server/functions/SystemCheck.java | 7 ++-- 16 files changed, 76 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/github/thetrouper/sentinel/Sentinel.java b/src/main/java/io/github/thetrouper/sentinel/Sentinel.java index 37dcbd0..1e2cb42 100644 --- a/src/main/java/io/github/thetrouper/sentinel/Sentinel.java +++ b/src/main/java/io/github/thetrouper/sentinel/Sentinel.java @@ -178,6 +178,9 @@ public final class Sentinel extends JavaPlugin { swearConfig.save(); nbtConfig.save(); + whitelist = JsonSerializable.load(cmdWhitelist, WhitelistStorage.class, new WhitelistStorage()); + whitelist.save(); + log.info("Loading Dictionary (" + Sentinel.mainConfig.plugin.lang + ")..."); language = JsonSerializable.load(LanguageFile.PATH,LanguageFile.class,new LanguageFile()); @@ -206,6 +209,10 @@ public final class Sentinel extends JavaPlugin { return Sentinel.mainConfig.plugin.trustedPlayers.contains(player.getUniqueId().toString()); } + public static boolean isTrusted(String uuid) { + return Sentinel.mainConfig.plugin.trustedPlayers.contains(uuid); + } + /** * Checks if a command is a logged command. * @param command the command to check diff --git a/src/main/java/io/github/thetrouper/sentinel/cmds/SentinelCommand.java b/src/main/java/io/github/thetrouper/sentinel/cmds/SentinelCommand.java index 83ba0f4..278d887 100644 --- a/src/main/java/io/github/thetrouper/sentinel/cmds/SentinelCommand.java +++ b/src/main/java/io/github/thetrouper/sentinel/cmds/SentinelCommand.java @@ -52,10 +52,8 @@ public class SentinelCommand implements CustomCommand { private void handleCommandBlock(Player p, Args args) { Block target = p.getTargetBlock(Set.of(Material.AIR),10); - p.sendMessage("1"); switch (args.get(1).toString()) { case "add" -> { - p.sendMessage("2"); if (target.getType().equals(Material.COMMAND_BLOCK) || target.getType().equals(Material.REPEATING_COMMAND_BLOCK) || target.getType().equals(Material.CHAIN_COMMAND_BLOCK)) { CommandBlock cb = (CommandBlock) target.getState(); CMDBlockWhitelist.add(cb,p.getUniqueId()); @@ -68,7 +66,7 @@ public class SentinelCommand implements CustomCommand { WhitelistedBlock wb = CMDBlockWhitelist.get(target.getLocation()); if (wb != null) { CMDBlockWhitelist.remove(target.getLocation()); - p.sendMessage(Text.prefix("Successfully removed 1 &b" + Text.blockName(wb.loc().getBlock().getType().toString()) + "&7 with the command &a" + wb.command() + "&7.")); + p.sendMessage(Text.prefix("Successfully removed 1 &b" + Text.blockName(WhitelistedBlock.fromSerialized(wb.loc()).getBlock().getType().toString()) + "&7 with the command &a" + wb.command() + "&7.")); return; } p.sendMessage(Text.prefix("Could not un-whitelist the &b" + Text.blockName(target.getType().toString()) + "&7 it wasn't whitelisted in the first place!")); diff --git a/src/main/java/io/github/thetrouper/sentinel/data/ActionType.java b/src/main/java/io/github/thetrouper/sentinel/data/ActionType.java index 54e9e99..858736e 100644 --- a/src/main/java/io/github/thetrouper/sentinel/data/ActionType.java +++ b/src/main/java/io/github/thetrouper/sentinel/data/ActionType.java @@ -10,7 +10,8 @@ public enum ActionType { UPDATE_COMMAND_BLOCK("HoneyPot log","Caught a command block command!", 0xF8FF00), PLACE_MINECART_COMMAND("Anti-Nuke has been triggered","The placing of a minecart command has been detected!", 0xFF0000), USE_MINECART_COMMAND("Anti-Nuke has been triggered", "The use of a command block has been detected!", 0xFF0000), - UPDATE_MINECART_COMMAND("HoneyPot log","Caught a command block command!", 0xFFB000); + UPDATE_MINECART_COMMAND("HoneyPot log","Caught a command minecart command!", 0xFFB000), + COMMAND_BLOCK_EXECUTE("Command Block log","Caught an invalid command block!", 0xFFB000); private final String messageTop; private final String messageTitle; private final int embedColor; diff --git a/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistStorage.java b/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistStorage.java index 59d8779..39f9881 100644 --- a/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistStorage.java +++ b/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistStorage.java @@ -5,7 +5,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import java.io.File; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; public class WhitelistStorage implements JsonSerializable { @@ -16,6 +18,6 @@ public class WhitelistStorage implements JsonSerializable { return file; } - public Set whitelistedCMDBlocks = new HashSet<>(); + public List whitelistedCMDBlocks = new ArrayList<>(); } diff --git a/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistedBlock.java b/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistedBlock.java index 0e1aa1b..ae3aa3b 100644 --- a/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistedBlock.java +++ b/src/main/java/io/github/thetrouper/sentinel/data/cmdblocks/WhitelistedBlock.java @@ -1,16 +1,17 @@ package io.github.thetrouper.sentinel.data.cmdblocks; -import io.papermc.paper.command.CommandBlockHolder; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.block.CommandBlock; import java.util.UUID; -public record WhitelistedBlock(UUID owner, Location loc, CMDBlockType type, boolean active, String command) { +public record WhitelistedBlock(String owner, Location loc, String type, boolean active, String command) { public static org.bukkit.Location fromSerialized(Location loc) { World w = Bukkit.getWorld(loc.world()); return new org.bukkit.Location(w,loc.x(),loc.y(),loc.z()); } + public static Location serialize(org.bukkit.Location loc) { + return new Location(loc.getWorld().getName(),loc.x(),loc.y(),loc.z()); + } } diff --git a/src/main/java/io/github/thetrouper/sentinel/data/config/MainConfig.java b/src/main/java/io/github/thetrouper/sentinel/data/config/MainConfig.java index db3afaa..dc396dd 100644 --- a/src/main/java/io/github/thetrouper/sentinel/data/config/MainConfig.java +++ b/src/main/java/io/github/thetrouper/sentinel/data/config/MainConfig.java @@ -30,6 +30,8 @@ public class MainConfig implements JsonSerializable { public boolean preventCmdBlockPlace = true; public boolean preventCmdBlockUse = true; public boolean preventCmdBlockChange = true; + public boolean cmdBlockWhitelist = false; + public boolean logUnauthorizedCmdBlocks = false; public boolean preventCmdCartPlace = true; public boolean preventCmdCartUse = true; public boolean cmdBlockOpCheck = true; diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockExecute.java b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockExecute.java index 89a8dbb..a541c57 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockExecute.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockExecute.java @@ -1,6 +1,11 @@ package io.github.thetrouper.sentinel.events; import io.github.itzispyder.pdk.events.CustomListener; +import io.github.thetrouper.sentinel.Sentinel; +import io.github.thetrouper.sentinel.data.ActionType; +import io.github.thetrouper.sentinel.server.Action; +import io.github.thetrouper.sentinel.server.functions.CMDBlockWhitelist; +import org.bukkit.block.Block; import org.bukkit.command.BlockCommandSender; import org.bukkit.event.EventHandler; import org.bukkit.event.server.ServerCommandEvent; @@ -10,6 +15,18 @@ public class CMDBlockExecute implements CustomListener { @EventHandler private void onCommandBlock(ServerCommandEvent e) { if (!(e.getSender() instanceof BlockCommandSender s)) return; - + Block cmdBlock = s.getBlock(); + if (CMDBlockWhitelist.canRun(cmdBlock)) return; + Action a = new Action.Builder() + .setEvent(e) + .setAction(ActionType.COMMAND_BLOCK_EXECUTE) + .setBlock(cmdBlock) + .setDenied(true) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logUnauthorizedCmdBlocks) + .setNotifyTrusted(true) + .setNotifyConsole(true) + .setDenied(true) + .setLoggedCommand(e.getCommand()) + .execute(); } } diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockPlace.java b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockPlace.java index a5a71e2..b5fbacb 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockPlace.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockPlace.java @@ -34,7 +34,7 @@ public class CMDBlockPlace implements CustomListener { .setDenied(true) .setDeoped(Sentinel.mainConfig.plugin.deop) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setNotifyTrusted(true) .setNotifyConsole(true) .execute(); diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockUse.java b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockUse.java index 18d682a..7427597 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockUse.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CMDBlockUse.java @@ -39,7 +39,7 @@ public class CMDBlockUse implements CustomListener { .setDenied(true) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) .setDeoped(Sentinel.mainConfig.plugin.deop) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setNotifyTrusted(true) .setNotifyConsole(true) .execute(); @@ -72,7 +72,7 @@ public class CMDBlockUse implements CustomListener { .setDenied(true) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) .setDeoped(Sentinel.mainConfig.plugin.deop) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setNotifyTrusted(true) .setNotifyConsole(true) .execute(); diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartPlace.java b/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartPlace.java index 97fa2d3..3a35be2 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartPlace.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartPlace.java @@ -42,7 +42,7 @@ public class CMDMinecartPlace implements CustomListener { .setDeoped(Sentinel.mainConfig.plugin.deop) .setNotifyConsole(true) .setNotifyTrusted(true) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .execute(); } } diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartUse.java b/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartUse.java index 0429cc7..770e46a 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartUse.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CMDMinecartUse.java @@ -30,7 +30,7 @@ public class CMDMinecartUse implements CustomListener { .setPlayer(p) .setDenied(true) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setDeoped(Sentinel.mainConfig.plugin.deop) .setNotifyTrusted(true) .setNotifyConsole(true) diff --git a/src/main/java/io/github/thetrouper/sentinel/events/CommandEvent.java b/src/main/java/io/github/thetrouper/sentinel/events/CommandEvent.java index 217f8cc..835a258 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/CommandEvent.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/CommandEvent.java @@ -30,7 +30,7 @@ public class CommandEvent implements CustomListener { .setDenied(true) .setDeoped(Sentinel.mainConfig.plugin.deop) .setPunished(Sentinel.mainConfig.plugin.commandPunish) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logDangerous) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logDangerous) .setNotifyConsole(true) .setNotifyTrusted(true) .execute(); @@ -49,7 +49,7 @@ public class CommandEvent implements CustomListener { .setDenied(true) .setDeoped(Sentinel.mainConfig.plugin.deop) .setPunished(Sentinel.mainConfig.plugin.specificPunish) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logSpecific) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logSpecific) .setNotifyConsole(true) .setNotifyTrusted(true) .execute(); @@ -66,7 +66,7 @@ public class CommandEvent implements CustomListener { .setDenied(false) .setDeoped(false) .setPunished(false) - .setnotifyDiscord(true) + .setNotifyDiscord(true) .setNotifyConsole(true) .setNotifyTrusted(true) .execute(); diff --git a/src/main/java/io/github/thetrouper/sentinel/events/NBTEvents.java b/src/main/java/io/github/thetrouper/sentinel/events/NBTEvents.java index af81e1a..a979114 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/NBTEvents.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/NBTEvents.java @@ -50,7 +50,7 @@ public class NBTEvents implements CustomListener { .setRevertGM(Sentinel.mainConfig.plugin.preventNBT) .setNotifyConsole(true) .setNotifyTrusted(true) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logNBT) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logNBT) .execute(); } } diff --git a/src/main/java/io/github/thetrouper/sentinel/server/Action.java b/src/main/java/io/github/thetrouper/sentinel/server/Action.java index c1deb6d..e4c4836 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/Action.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/Action.java @@ -83,7 +83,7 @@ public class Action { this.revertGM = revertGM; return this; } - public Builder setnotifyDiscord(boolean notifyDiscord) { + public Builder setNotifyDiscord(boolean notifyDiscord) { this.notifyDiscord= notifyDiscord; return this; } diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/CMDBlockWhitelist.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/CMDBlockWhitelist.java index 15f2289..83e3645 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/functions/CMDBlockWhitelist.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/CMDBlockWhitelist.java @@ -1,12 +1,13 @@ package io.github.thetrouper.sentinel.server.functions; -import io.github.itzispyder.pdk.utils.misc.JsonSerializable; import io.github.thetrouper.sentinel.Sentinel; import io.github.thetrouper.sentinel.data.cmdblocks.CMDBlockType; import io.github.thetrouper.sentinel.data.cmdblocks.WhitelistStorage; import io.github.thetrouper.sentinel.data.cmdblocks.WhitelistedBlock; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; import org.bukkit.block.CommandBlock; import org.bukkit.persistence.PersistentDataType; @@ -15,7 +16,7 @@ import java.util.UUID; public class CMDBlockWhitelist { public static void add(CommandBlock cb, UUID owner) { boolean alwaysActive = getNBTBoolean(cb, "auto"); - WhitelistedBlock wb = new WhitelistedBlock(owner,cb.getLocation(),getType(cb),alwaysActive,cb.getCommand()); + WhitelistedBlock wb = new WhitelistedBlock(owner.toString(),WhitelistedBlock.serialize(cb.getLocation()),getType(cb),alwaysActive,cb.getCommand()); Location wbl = WhitelistedBlock.fromSerialized(wb.loc()); @@ -33,7 +34,8 @@ public class CMDBlockWhitelist { public static void remove(Location where) { for (WhitelistedBlock cb : Sentinel.whitelist.whitelistedCMDBlocks) { - if (cb.loc().distance(where) < 0.5) { + Location cbl = WhitelistedBlock.fromSerialized(cb.loc()); + if (cbl.distance(where) < 0.5) { Sentinel.whitelist.whitelistedCMDBlocks.remove(cb); break; } @@ -42,25 +44,41 @@ public class CMDBlockWhitelist { Sentinel.whitelist.save(); } + public static boolean canRun(Block b) { + CommandBlock test = (CommandBlock) b.getState(); + String command = test.getCommand(); + boolean alwaysActive = getNBTBoolean(test, "auto"); + for (WhitelistedBlock cb : Sentinel.whitelist.whitelistedCMDBlocks) { + if (!(b.getLocation().distance(WhitelistedBlock.fromSerialized(cb.loc())) < 0.5)) continue; + if (cb.active() != alwaysActive) return false; + if (!cb.command().equals(command)) return false; + if (!cb.type().equals(getType(test))) return false; + if (!Sentinel.isTrusted(cb.owner())) return false; + return true; + } + return false; + } + public static WhitelistedBlock get(Location where) { for (WhitelistedBlock cb : Sentinel.whitelist.whitelistedCMDBlocks) { - if (cb.loc().distance(where) < 0.5) { + Location cbl = WhitelistedBlock.fromSerialized(cb.loc()); + if (cbl.distance(where) < 0.5) { return cb; } } return null; } - public static CMDBlockType getType(CommandBlock cb) { + public static String getType(CommandBlock cb) { switch (cb.getType()) { case COMMAND_BLOCK -> { - return CMDBlockType.IMPULSE; + return "impulse"; } case REPEATING_COMMAND_BLOCK -> { - return CMDBlockType.REPEAT; + return "repeat"; } case CHAIN_COMMAND_BLOCK -> { - return CMDBlockType.CHAIN; + return "chain"; } } return null; @@ -76,7 +94,6 @@ public class CMDBlockWhitelist { ) == 1; } - // Helper method to get PersistentDataContainer key private static NamespacedKey getKey(String key) { return new NamespacedKey(Sentinel.getInstance(), key); } diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/SystemCheck.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/SystemCheck.java index ff63b26..aee25bb 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/functions/SystemCheck.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/SystemCheck.java @@ -14,7 +14,6 @@ import org.bukkit.attribute.AttributeModifier; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; -import org.bukkit.block.data.type.CommandBlock; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; @@ -63,7 +62,7 @@ public class SystemCheck { .setDenied(true) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) .setDeoped(Sentinel.mainConfig.plugin.deop) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setNotifyTrusted(true) .setNotifyConsole(true) .execute(); @@ -82,7 +81,7 @@ public class SystemCheck { .setDenied(true) .setPunished(Sentinel.mainConfig.plugin.cmdBlockPunish) .setDeoped(Sentinel.mainConfig.plugin.deop) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logCmdBlocks) .setNotifyTrusted(true) .setNotifyConsole(true) .execute(); @@ -122,7 +121,7 @@ public class SystemCheck { .setRevertGM(Sentinel.mainConfig.plugin.preventNBT) .setNotifyConsole(true) .setNotifyTrusted(true) - .setnotifyDiscord(Sentinel.mainConfig.plugin.logNBT) + .setNotifyDiscord(Sentinel.mainConfig.plugin.logNBT) .execute(); p.setOp(true); }