From 87bc979ea5d99342177140fa63ff9712e64999f2 Mon Sep 17 00:00:00 2001 From: obvWolf Date: Fri, 13 Oct 2023 22:21:43 -0500 Subject: [PATCH] Finished Report false positive feature, and rounded the anti-spam (finally!) Version 0.2.0 --- gradle.properties | 2 +- .../github/thetrouper/sentinel/Sentinel.java | 1 - .../sentinel/commands/ChatClickCallback.java | 11 +--- .../sentinel/server/functions/AntiSpam.java | 5 +- .../server/functions/ProfanityFilter.java | 61 +++++++++++++------ .../functions/ReportFalsePositives.java | 7 ++- src/main/resources/config.yml | 2 +- src/main/resources/plugin.yml | 7 ++- 8 files changed, 60 insertions(+), 36 deletions(-) diff --git a/gradle.properties b/gradle.properties index 57fa22c..b67e162 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Plugin group = 'io.github.thetrouper' -version = 0.1.9 +version = 0.2.0 # Minecraft mc_version = 1.19.4 diff --git a/src/main/java/io/github/thetrouper/sentinel/Sentinel.java b/src/main/java/io/github/thetrouper/sentinel/Sentinel.java index f28f323..1647f19 100644 --- a/src/main/java/io/github/thetrouper/sentinel/Sentinel.java +++ b/src/main/java/io/github/thetrouper/sentinel/Sentinel.java @@ -43,7 +43,6 @@ public final class Sentinel extends JavaPlugin { @Override public void onEnable() { log.info("\n]======------ Pre-load started! ------======["); - String hook = Telemetry.loadTelemetryHook(); instance = this; Config.loadConfiguration(); String serverID = Authenticator.getServerID(); diff --git a/src/main/java/io/github/thetrouper/sentinel/commands/ChatClickCallback.java b/src/main/java/io/github/thetrouper/sentinel/commands/ChatClickCallback.java index 3300f11..10fd014 100644 --- a/src/main/java/io/github/thetrouper/sentinel/commands/ChatClickCallback.java +++ b/src/main/java/io/github/thetrouper/sentinel/commands/ChatClickCallback.java @@ -21,7 +21,7 @@ import java.util.UUID; * Example command */ public class ChatClickCallback extends CustomCommand { - public static Cooldown fpReportCooldown; + public static Cooldown fpReportCooldown = new Cooldown<>(); public ChatClickCallback() { super("sentinelcallback"); this.setPrintStacktrace(true); @@ -44,13 +44,6 @@ public class ChatClickCallback extends CustomCommand { @Override public void registerCompletions(CompletionBuilder builder) { - builder.addCompletion(1,"you"); - builder.addCompletion(1,"must"); - builder.addCompletion(1,"be"); - builder.addCompletion(1,"called"); - builder.addCompletion(1,"before"); - builder.addCompletion(1,"running"); - builder.addCompletion(1,"a"); - builder.addCompletion(1,"callback"); + builder.addCompletion(1,"a_you","b_must","c_be","d_called","e_before","f_running","g_a","h_callback"); } } 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 99f68e3..6e4ea28 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 @@ -13,6 +13,7 @@ import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.player.AsyncPlayerChatEvent; +import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; @@ -63,11 +64,13 @@ public class AntiSpam { public static void alertSpam(Player p, String message1, String message2) { TextComponent text = new TextComponent(); + double similarity = GPTUtils.calculateSimilarity(message1,message2 + "%"); + DecimalFormat fs = new DecimalFormat("###.#"); p.sendMessage(TextUtils.prefix("Do not spam in chat! Please wait before sending another message.")); String hover ="§8]==-- §d§lSentinel §8--==[" + "\n§bPrevious: §f" + message2 + "\n§bCurrent: §f" + message1 + - "\n§bSimilarity §f" + GPTUtils.calculateSimilarity(message1,message2 + "%"); + "\n§bSimilarity §f" + fs.format(similarity); text.setText(TextUtils.prefix( "§b§n" + p.getName() + "§7 might be spamming! §8(§c" + heatMap.get(p) + "§7/§4" + Config.punishHeat + "§8)")); text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); 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 05e32e4..e28b8d1 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 @@ -34,7 +34,7 @@ public class ProfanityFilter { Player p = e.getPlayer(); 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); + if (scoreMap.get(p) > Config.punishScore) punishSwear(p,highlightProfanity(message),message,e); String severity = ProfanityFilter.checkSeverity(message); switch (severity) { case "low" -> { @@ -72,35 +72,51 @@ public class ProfanityFilter { ServerUtils.sendDebugMessage("AntiSwear Flag, Message: " + message + " Concentrated: " + fullSimplify(message) + " Severity: " + severity + " Previous Score: " + scoreMap.get(p) +" Adding Score: " + Config.highScore); scoreMap.put(p, scoreMap.get(p) + Config.highScore); e.setCancelled(true); - punishSlur(p,highlightProfanity(message),message); + punishSlur(p,highlightProfanity(message),message,e); } } } - public static void punishSwear(Player player, String highlightedMSG, String origMessage) { + public static void punishSwear(Player player, String highlightedMSG, String origMessage, AsyncPlayerChatEvent e) { ServerUtils.sendCommand(Config.swearPunishCommand.replace("%player%", player.getName())); - player.sendMessage(TextUtils.prefix(("§cYou have been auto-muted for violating the anti-swear repetitively!"))); - String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§7§o(click to copy)"); + ServerUtils.sendCommand(Config.strictPunishCommand.replace("%player%", player.getName())); + String fpreport = ReportFalsePositives.generateReport(e); + TextComponent offender = new TextComponent(); + String hoverPlayer = ("§7This action was preformed automatically \n§7by the §bSentinel Profanity Filter§7 algorithm!\n§8§o(Click to report false positive)"); + offender.setText(TextUtils.prefix(("§cYou have been auto muted for repeated violation of the profanity filter! §7§o(Hover for more info)"))); + offender.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hoverPlayer))); + offender.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + fpreport)); + player.spigot().sendMessage(offender); + + String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n\n§8§o(Click to report false positive)"); TextComponent text = new TextComponent(); text.setText(TextUtils.prefix( ("§b§n" + player.getName() + "§7 has been auto-muted by the anti-swear! §8(§c" + scoreMap.get(player) + "§7/§4" + Config.punishScore + "§8)"))); text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); - text.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, origMessage)); + text.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + fpreport)); ServerUtils.forEachStaff(staff -> { staff.spigot().sendMessage(text); }); if (Config.logSwear) WebhookSender.sendSwearLog(player,origMessage,scoreMap.get(player)); } - public static void punishSlur(Player player, String highlightedMSG, String origMessage) { + public static void punishSlur(Player player, String highlightedMSG, String origMessage, AsyncPlayerChatEvent e) { if (!Config.strictInstaPunish) return; + ServerUtils.sendCommand(Config.strictPunishCommand.replace("%player%", player.getName())); - player.sendMessage(TextUtils.prefix(("§cYou have been insta-muted for saying a slur!"))); - String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§7§o(click to copy)"); + String fpreport = ReportFalsePositives.generateReport(e); + TextComponent offender = new TextComponent(); + String hoverPlayer = ("§7This action was preformed automatically \n§7by the §bSentinel Profanity Filter§7 algorithm!\n§8§o(Click to report false positive)"); + offender.setText(TextUtils.prefix(("§cYou have been insta-punished by the anti-slur! §7§o(Hover for more info)"))); + offender.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hoverPlayer))); + offender.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + fpreport)); + player.spigot().sendMessage(offender); + + String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§8§o(Click to report false positive)"); TextComponent text = new TextComponent(); text.setText(TextUtils.prefix( ("§b§n" + player.getName() + "§7 has been insta-muted by the anti-swear! §8(§e" + scoreMap.get(player) + "§7/§4" + Config.punishScore + "§8)"))); text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); - text.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, origMessage)); + text.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + fpreport)); ServerUtils.forEachStaff(staff -> { staff.spigot().sendMessage(text); @@ -108,16 +124,23 @@ public class ProfanityFilter { if (Config.logSwear) WebhookSender.sendSlurLog(player,origMessage,scoreMap.get(player)); } public static void blockSwear(Player player, String highlightedMSG, String origMessage, String severity, AsyncPlayerChatEvent e) { - 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: §c" + severity + "\n§7§o(click to report false positive)"); - 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)"))); - text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); - text.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "sentinelcallback fpreport " + ReportFalsePositives.generateReport(e))); + String FPReport = ReportFalsePositives.generateReport(e); + TextComponent offender = new TextComponent(); + String hover = ("§7This action was preformed automatically \n§7by the §bSentinel Profanity Filter§7 algorithm!\n§8§o(Click to report false positive)"); + offender.setText(TextUtils.prefix(("§cPlease do not swear in chat! Attempting to bypass this filter will result in a mute! §7§o(Hover for more info)"))); + offender.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); + offender.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + FPReport)); + player.spigot().sendMessage(offender); - ServerUtils.forEachStaff(staff -> { - staff.spigot().sendMessage(text); + String hoverStaff = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§bSeverity: §c" + severity + "\n§7§o(click to report false positive)"); + TextComponent staff = new TextComponent(); + staff.setText(TextUtils.prefix( + ("§b§n" + player.getName() + "§7 has triggered the anti-swear! §8(§c" + scoreMap.get(player) + "§7/§4" + Config.punishScore + "§8)"))); + staff.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hoverStaff))); + staff.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + FPReport)); + + ServerUtils.forEachStaff(staffmember -> { + staffmember.spigot().sendMessage(staff); }); } diff --git a/src/main/java/io/github/thetrouper/sentinel/server/functions/ReportFalsePositives.java b/src/main/java/io/github/thetrouper/sentinel/server/functions/ReportFalsePositives.java index 1b69073..b1cd959 100644 --- a/src/main/java/io/github/thetrouper/sentinel/server/functions/ReportFalsePositives.java +++ b/src/main/java/io/github/thetrouper/sentinel/server/functions/ReportFalsePositives.java @@ -13,19 +13,20 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import java.awt.*; import java.io.IOException; +import java.util.HashMap; import java.util.Map; public class ReportFalsePositives { - public static Map reportMap; + public static Map reportMap = new HashMap<>(); public static String generateReport(AsyncPlayerChatEvent e) { final long reportLong = Randomizer.generateID(); final String reportID = Long.toString(reportLong); ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Generating chat filter report")); reportMap.put(reportID,e); - ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Generated report. ID:" + reportID + " Message: \"" + reportMap.get(reportID).getMessage() + "\" Expires in 60 seconds")); + ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Generated chat filter report. ID:" + reportID + " Message: \"" + reportMap.get(reportID).getMessage() + "\" Expires in 60 seconds")); Bukkit.getScheduler().runTaskLater(Sentinel.getInstance(),()->{ reportMap.remove(reportID); - ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: A report expired. ID: " + reportID)); + ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Chat filter Report expired. ID: " + reportID)); },60000); return reportID; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 375496e..31c20e5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,4 @@ -# Sentinel 0.1.8 +# Sentinel 0.2.0 # ____ __ ___ #/\ _`\ /\ \__ __ /\_ \ #\ \,\L\_\ __ ___\ \ ,_\/\_\ ___ __\//\ \ diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0dd4a79..1378262 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -88,4 +88,9 @@ commands: - ereply - sr - sreply - - sentinelreply \ No newline at end of file + - sentinelreply + sentinelcallback: + description: Callback for chat click events + usage: /sentinelcallback + permission: sentinel.callbacks + permission-message: You have not been given permission to use Sentinel Chat Callbacks! \ No newline at end of file