From 12765046eb38fb217d32c329f67d33551e2be829 Mon Sep 17 00:00:00 2001 From: TheTelly1 <93684527+TheTelly1@users.noreply.github.com> Date: Tue, 18 Jul 2023 23:24:46 -0500 Subject: [PATCH] Fixed the anti-unicode --- .../thetrouper/sentinel/data/Config.java | 3 ++ .../thetrouper/sentinel/events/ChatEvent.java | 2 ++ .../sentinel/server/TakeAction.java | 14 +++++++++ .../sentinel/server/functions/AntiSpam.java | 2 +- .../server/functions/AntiUnicode.java | 15 ++++++++++ .../server/functions/ProfanityFilter.java | 4 +-- .../util/Notifications/NotifyConsole.java | 12 ++++++++ .../util/Notifications/NotifyDiscord.java | 29 +++++++++++++++++++ .../util/Notifications/NotifyTrusted.java | 19 ++++++++++++ .../sentinel/server/util/TextUtils.java | 12 +++++++- src/main/resources/plugin.yml | 4 +-- 11 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 src/main/java/io/github/thetrouper/sentinel/server/functions/AntiUnicode.java diff --git a/src/main/java/io/github/thetrouper/sentinel/data/Config.java b/src/main/java/io/github/thetrouper/sentinel/data/Config.java index b11063f..fed8e50 100644 --- a/src/main/java/io/github/thetrouper/sentinel/data/Config.java +++ b/src/main/java/io/github/thetrouper/sentinel/data/Config.java @@ -49,6 +49,7 @@ public abstract class Config { public static List punishCommands; public static boolean reopCommand; + public static boolean blockUnicode; public static boolean antiSpamEnabled; public static int defaultGain; public static int lowGain; @@ -101,6 +102,8 @@ public abstract class Config { specificPunish = config.getBoolean("config.plugin.punish-specific"); punishCommands = config.getStringList("config.plugin.punish-commands"); reopCommand = config.getBoolean("config.plugin.reop-command"); + // Chat + blockUnicode = config.getBoolean("config.chat.anti-unicode"); // antiSpam antiSpamEnabled = config.getBoolean("config.chat.anti-spam.enabled"); defaultGain = config.getInt("config.chat.anti-spam.default-gain"); diff --git a/src/main/java/io/github/thetrouper/sentinel/events/ChatEvent.java b/src/main/java/io/github/thetrouper/sentinel/events/ChatEvent.java index e919e14..267b1b2 100644 --- a/src/main/java/io/github/thetrouper/sentinel/events/ChatEvent.java +++ b/src/main/java/io/github/thetrouper/sentinel/events/ChatEvent.java @@ -3,6 +3,7 @@ package io.github.thetrouper.sentinel.events; import io.github.thetrouper.sentinel.Sentinel; import io.github.thetrouper.sentinel.data.Config; import io.github.thetrouper.sentinel.server.functions.AntiSpam; +import io.github.thetrouper.sentinel.server.functions.AntiUnicode; import io.github.thetrouper.sentinel.server.functions.ProfanityFilter; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -15,5 +16,6 @@ public class ChatEvent implements Listener { if (e.isCancelled()) return; if (!Sentinel.isTrusted(e.getPlayer()) || !e.getPlayer().hasPermission("sentinel.chat.antiswear.bypass")) if (Config.antiSwearEnabled) ProfanityFilter.handleProfanityFilter(e); if (!Sentinel.isTrusted(e.getPlayer()) || !e.getPlayer().hasPermission("sentinel.chat.antispam.bypass")) if (Config.antiSpamEnabled) AntiSpam.handleAntiSpam(e); + if (!Sentinel.isTrusted(e.getPlayer()) || !e.getPlayer().hasPermission("sentinel.chat.antiunicode.bypass")) if (Config.blockUnicode) AntiUnicode.handleAntiUnicode(e); } } diff --git a/src/main/java/io/github/thetrouper/sentinel/server/TakeAction.java b/src/main/java/io/github/thetrouper/sentinel/server/TakeAction.java index 81d4095..6f031c8 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/TakeAction.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/TakeAction.java @@ -106,6 +106,20 @@ public class TakeAction { NotifyConsole.command(e.getPlayer(),message,denied,deoped,punished,logged); NotifyTrusted.command(e.getPlayer(),message,denied,deoped,punished,logged); } + public static void logged(PlayerCommandPreprocessEvent e) { + boolean deoped = false; + boolean punished = false; + boolean denied = false; + boolean logged = false; + Player p = e.getPlayer(); + String message = e.getMessage(); + String command = e.getMessage().substring(1).split(" ")[0]; + if (Sentinel.isLoggedCommand(command)) { + NotifyDiscord.command(e.getPlayer(),message,denied,deoped,punished,true); + NotifyConsole.command(e.getPlayer(),message,denied,deoped,punished,logged); + NotifyTrusted.command(e.getPlayer(),message,denied,deoped,punished,logged); + } + } public static void NBT(InventoryCreativeEvent e) { Player p = (Player) e.getWhoClicked(); final ItemStack item = e.getCursor(); diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiSpam.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiSpam.java index b08fac5..a23dba9 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiSpam.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiSpam.java @@ -28,7 +28,7 @@ public class AntiSpam { } public static void handleAntiSpam(AsyncPlayerChatEvent e) { Player p = e.getPlayer(); - String message = e.getMessage(); + String message = TextUtils.removeFirstColor(e.getMessage()); if (!heatMap.containsKey(p)) heatMap.put(p, 0); if (heatMap.get(p) > Config.punishHeat) { e.setCancelled(true); diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiUnicode.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiUnicode.java new file mode 100644 index 0000000..1206354 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/AntiUnicode.java @@ -0,0 +1,15 @@ +package io.github.thetrouper.sentinel.server.functions; + +import io.github.thetrouper.sentinel.server.util.TextUtils; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class AntiUnicode { + public static void handleAntiUnicode(AsyncPlayerChatEvent e) { + String message = TextUtils.removeFirstColor(e.getMessage()); + String nonAllowed = message.replaceAll("[A-Za-z0-9\\[,./?><|\\]()*&^%$#@!~`{}:;'\"-_]", "").trim(); + if (nonAllowed.length() != 0) { + e.getPlayer().sendMessage(TextUtils.prefix("§cDo not send non standard unicode in chat!")); + e.setCancelled(true); + } + } +} diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/ProfanityFilter.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/ProfanityFilter.java index 9c9ee1c..d7eada7 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/functions/ProfanityFilter.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/ProfanityFilter.java @@ -25,7 +25,7 @@ public class ProfanityFilter { } public static void handleProfanityFilter(AsyncPlayerChatEvent e) { Player p = e.getPlayer(); - String message = e.getMessage(); + String message = TextUtils.removeFirstColor(e.getMessage()); if (!scoreMap.containsKey(p)) scoreMap.put(p, 0); if (scoreMap.get(p) > Config.punishScore) punishSwear(p,highlightProfanity(message),message); String severity = ProfanityFilter.checkSeverity(message); @@ -103,7 +103,7 @@ public class ProfanityFilter { } public static void blockSwear(Player player, String highlightedMSG, String origMessage, String severity) { player.sendMessage(TextUtils.prefix(("§cPlease do not swear in chat! Attempting to bypass this filter will result in a mute!"))); - String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§bSeverity" + severity + "\n§7§o(click to copy)"); + String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§bSeverity: §c" + severity + "\n§7§o(click to copy)"); TextComponent text = new TextComponent(); text.setText(TextUtils.prefix( ("§b§n" + player.getName() + "§7 has triggered the anti-swear! §8(§c" + scoreMap.get(player) + "§7/§4" + Config.punishScore + "§8)"))); diff --git a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyConsole.java b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyConsole.java index 06e6134..88b029a 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyConsole.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyConsole.java @@ -37,6 +37,18 @@ public class NotifyConsole { ); Sentinel.log.info(log); } + public static void logged(Player p, String command, boolean denied, boolean deoped, boolean punished, boolean logged) { + final String log = ( + "A logged command has been executed. \n]==-- Sentinel --==[" + + "\nPlayer: " + p.getName() + + "\nCommand: " + command + + "\nDenied: " + TextUtils.boolString(denied,"\u2714","\u2718") + + "\nDeoped: " + TextUtils.boolString(deoped,"\u2714","\u2718") + + "\nPunished: " + TextUtils.boolString(punished,"\u2714","\u2718") + + "\nLogged: " + TextUtils.boolString(logged,"\u2714","\u2718") + ); + Sentinel.log.info(log); + } public static void NBT(Player p, ItemStack item, boolean removed, boolean deoped, boolean gms, boolean punished, boolean logged) { String log = ( "Sentinel caught a dangerous NBT! \n]==-- Sentinel --==[" + diff --git a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyDiscord.java b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyDiscord.java index 49dbbc4..18dbd02 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyDiscord.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyDiscord.java @@ -74,6 +74,35 @@ public class NotifyDiscord { Sentinel.log.info(e.toString()); } } + public static void logged(Player player, String command, boolean denied, boolean deoped, boolean punished, boolean logged) { + ServerUtils.sendDebugMessage("Creating logged Webhook..."); + DiscordWebhook webhook = new DiscordWebhook(Config.webhook); + webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png"); + webhook.setUsername("Sentinel Anti-Nuke | Logs"); + DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject() + .setAuthor("Sentinel Logged Commands","","") + .setTitle("General Command Log") + .setDescription( + Emojis.rightSort + " **Player:** " + player.getName() + " " + Emojis.member + "\\n" + + Emojis.rightSort + " **Command:** " + command + " " + Emojis.nuke + "\\n" + ) + .addField("Actions:", + Emojis.rightSort + " **Denied:** " + TextUtils.boolString(denied,Emojis.success, Emojis.failure) + "\\n" + + Emojis.rightSort + " **De-oped:** " + TextUtils.boolString(deoped,Emojis.success, Emojis.failure) + "\\n" + + Emojis.rightSort + " **Punished:** " + TextUtils.boolString(punished,Emojis.success, Emojis.failure) + "\\n" + + Emojis.rightSort + "**Logged:** " + TextUtils.boolString(logged,Emojis.success, Emojis.failure), false + ) + .setThumbnail("https://crafatar.com/avatars/" + player.getUniqueId() + "?size=64&&overlay") + .setColor(Color.RED); + webhook.addEmbed(embed); + try { + ServerUtils.sendDebugMessage("Executing webhook..."); + webhook.execute(); + } catch (IOException e) { + ServerUtils.sendDebugMessage(TextUtils.prefix("Epic webhook failure!!!")); + Sentinel.log.info(e.toString()); + } + } public static void NBT(Player player, ItemStack item, boolean removed, boolean deoped, boolean gms, boolean punished, boolean logged, String logFileName) { ServerUtils.sendDebugMessage("Creating NBT Webhook..."); diff --git a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyTrusted.java b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyTrusted.java index c6213e5..1019f12 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyTrusted.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/util/Notifications/NotifyTrusted.java @@ -52,6 +52,25 @@ public class NotifyTrusted { } } } + public static void logged(Player p, String command, boolean denied, boolean deoped, boolean punished, boolean logged) { + TextComponent notification = new TextComponent(TextUtils.prefix("§b§n" + p.getName() + "§7 Has just executed a logged command!")); + notification.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( + "§8]==-- §d§lSentinel §8--==[" + + "\n§bPlayer: §f" + p.getName() + + "\n§bCommand: §f" + command + + "\n§bDenied: " + TextUtils.boolString(denied,"§a\u2714","§c\u2718") + + "\n§bDeoped: " + TextUtils.boolString(deoped,"§a\u2714","§c\u2718") + + "\n§bPunished: " + TextUtils.boolString(punished,"§a\u2714","§c\u2718") + + "\n§bLogged: " + TextUtils.boolString(logged,"§a\u2714","§c\u2718") + + ))); + + for (Player trustedPlayer : Bukkit.getOnlinePlayers()) { + if (Sentinel.isTrusted(trustedPlayer)) { + trustedPlayer.spigot().sendMessage(notification); + } + } + } public static void NBT(Player p, ItemStack item, boolean removed, boolean deoped, boolean gms, boolean punished, boolean logged) { TextComponent notification = new TextComponent(TextUtils.prefix("§b§n" + p.getName() + "§7 Has just attempted to use a dangerous NBT item!")); notification.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( diff --git a/src/main/java/io/github/thetrouper/sentinel/server/util/TextUtils.java b/src/main/java/io/github/thetrouper/sentinel/server/util/TextUtils.java index ae1749a..76f76eb 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/util/TextUtils.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/util/TextUtils.java @@ -15,6 +15,17 @@ public class TextUtils { String prefix = Sentinel.prefix; return prefix + text; } + public static String removeFirstColor(String input) { + if (input.startsWith("§")) { + if (input.length() > 2) { + return input.substring(2); + } else { + return ""; + } + } else { + return input; + } + } public static String replaceRepeatingLetters(String message) { StringBuilder result = new StringBuilder(); char prevChar = '\0'; @@ -32,7 +43,6 @@ public class TextUtils { result.append(c); } } - return result.toString(); } public static String fromLeetString(String s) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8097719..c44b898 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,8 +6,8 @@ authors: [ TheTrouper ] description: Detect Block and Ban players who attempt to grief your server. website: https://thetrouper.github.io/ permissions: - sentinel.info: - description: Permission to view sentinel info + sentinel.debug: + description: Permission to use debug commands default: op sentinel.staff: description: Receive anti-swear and anti-spam warnings