Finished Report false positive feature, and rounded the anti-spam (finally!)

Version 0.2.0
This commit is contained in:
obvWolf
2023-10-13 22:21:43 -05:00
parent 84fa24aeb8
commit 87bc979ea5
8 changed files with 60 additions and 36 deletions

View File

@@ -1,7 +1,7 @@
# Plugin # Plugin
group = 'io.github.thetrouper' group = 'io.github.thetrouper'
version = 0.1.9 version = 0.2.0
# Minecraft # Minecraft
mc_version = 1.19.4 mc_version = 1.19.4

View File

@@ -43,7 +43,6 @@ public final class Sentinel extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
log.info("\n]======------ Pre-load started! ------======["); log.info("\n]======------ Pre-load started! ------======[");
String hook = Telemetry.loadTelemetryHook();
instance = this; instance = this;
Config.loadConfiguration(); Config.loadConfiguration();
String serverID = Authenticator.getServerID(); String serverID = Authenticator.getServerID();

View File

@@ -21,7 +21,7 @@ import java.util.UUID;
* Example command * Example command
*/ */
public class ChatClickCallback extends CustomCommand { public class ChatClickCallback extends CustomCommand {
public static Cooldown<UUID> fpReportCooldown; public static Cooldown<UUID> fpReportCooldown = new Cooldown<>();
public ChatClickCallback() { public ChatClickCallback() {
super("sentinelcallback"); super("sentinelcallback");
this.setPrintStacktrace(true); this.setPrintStacktrace(true);
@@ -44,13 +44,6 @@ public class ChatClickCallback extends CustomCommand {
@Override @Override
public void registerCompletions(CompletionBuilder builder) { public void registerCompletions(CompletionBuilder builder) {
builder.addCompletion(1,"you"); builder.addCompletion(1,"a_you","b_must","c_be","d_called","e_before","f_running","g_a","h_callback");
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");
} }
} }

View File

@@ -13,6 +13,7 @@ import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.AsyncPlayerChatEvent;
import java.text.DecimalFormat;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -63,11 +64,13 @@ public class AntiSpam {
public static void alertSpam(Player p, String message1, String message2) { public static void alertSpam(Player p, String message1, String message2) {
TextComponent text = new TextComponent(); 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.")); p.sendMessage(TextUtils.prefix("Do not spam in chat! Please wait before sending another message."));
String hover ="§8]==-- §d§lSentinel §8--==[" + String hover ="§8]==-- §d§lSentinel §8--==[" +
"\n§bPrevious: §f" + message2 + "\n§bPrevious: §f" + message2 +
"\n§bCurrent: §f" + message1 + "\n§bCurrent: §f" + message1 +
"\n§bSimilarity §f" + GPTUtils.calculateSimilarity(message1,message2 + "%"); "\n§bSimilarity §f" + fs.format(similarity);
text.setText(TextUtils.prefix( text.setText(TextUtils.prefix(
"§b§n" + p.getName() + "§7 might be spamming! §8(§c" + heatMap.get(p) + "§7/§4" + Config.punishHeat + "§8)")); "§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))); text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover)));

View File

@@ -34,7 +34,7 @@ public class ProfanityFilter {
Player p = e.getPlayer(); Player p = e.getPlayer();
String message = TextUtils.removeFirstColor(e.getMessage()); String message = TextUtils.removeFirstColor(e.getMessage());
if (!scoreMap.containsKey(p)) scoreMap.put(p, 0); 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); String severity = ProfanityFilter.checkSeverity(message);
switch (severity) { switch (severity) {
case "low" -> { 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); 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); scoreMap.put(p, scoreMap.get(p) + Config.highScore);
e.setCancelled(true); 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())); ServerUtils.sendCommand(Config.swearPunishCommand.replace("%player%", player.getName()));
player.sendMessage(TextUtils.prefix(("§cYou have been auto-muted for violating the anti-swear repetitively!"))); ServerUtils.sendCommand(Config.strictPunishCommand.replace("%player%", player.getName()));
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 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(); TextComponent text = new TextComponent();
text.setText(TextUtils.prefix( 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)"))); ("§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.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 -> { ServerUtils.forEachStaff(staff -> {
staff.spigot().sendMessage(text); staff.spigot().sendMessage(text);
}); });
if (Config.logSwear) WebhookSender.sendSwearLog(player,origMessage,scoreMap.get(player)); 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; if (!Config.strictInstaPunish) return;
ServerUtils.sendCommand(Config.strictPunishCommand.replace("%player%", player.getName())); ServerUtils.sendCommand(Config.strictPunishCommand.replace("%player%", player.getName()));
player.sendMessage(TextUtils.prefix(("§cYou have been insta-muted for saying a slur!"))); String fpreport = ReportFalsePositives.generateReport(e);
String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§7§o(click to copy)"); 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(); TextComponent text = new TextComponent();
text.setText(TextUtils.prefix( 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)"))); ("§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.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 -> { ServerUtils.forEachStaff(staff -> {
staff.spigot().sendMessage(text); staff.spigot().sendMessage(text);
@@ -108,16 +124,23 @@ public class ProfanityFilter {
if (Config.logSwear) WebhookSender.sendSlurLog(player,origMessage,scoreMap.get(player)); if (Config.logSwear) WebhookSender.sendSlurLog(player,origMessage,scoreMap.get(player));
} }
public static void blockSwear(Player player, String highlightedMSG, String origMessage, String severity, AsyncPlayerChatEvent e) { 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 FPReport = ReportFalsePositives.generateReport(e);
String hover = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§bSeverity: §c" + severity + "\n§7§o(click to report false positive)"); TextComponent offender = new TextComponent();
TextComponent text = 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)");
text.setText(TextUtils.prefix( 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)")));
("§b§n" + player.getName() + "§7 has triggered the anti-swear! §8(§c" + scoreMap.get(player) + "§7/§4" + Config.punishScore + "§8)"))); offender.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover)));
text.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(hover))); offender.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sentinelcallback fpreport " + FPReport));
text.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "sentinelcallback fpreport " + ReportFalsePositives.generateReport(e))); player.spigot().sendMessage(offender);
ServerUtils.forEachStaff(staff -> { String hoverStaff = ("§bOriginal: §f" + origMessage + "\n§bSanitized: §f" + highlightedMSG + "\n§bSeverity: §c" + severity + "\n§7§o(click to report false positive)");
staff.spigot().sendMessage(text); 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);
}); });
} }

View File

@@ -13,19 +13,20 @@ import org.bukkit.event.player.AsyncPlayerChatEvent;
import java.awt.*; import java.awt.*;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class ReportFalsePositives { public class ReportFalsePositives {
public static Map<String,AsyncPlayerChatEvent> reportMap; public static Map<String,AsyncPlayerChatEvent> reportMap = new HashMap<>();
public static String generateReport(AsyncPlayerChatEvent e) { public static String generateReport(AsyncPlayerChatEvent e) {
final long reportLong = Randomizer.generateID(); final long reportLong = Randomizer.generateID();
final String reportID = Long.toString(reportLong); final String reportID = Long.toString(reportLong);
ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Generating chat filter report")); ServerUtils.sendDebugMessage(TextUtils.prefix("DEBUG: Generating chat filter report"));
reportMap.put(reportID,e); 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(),()->{ Bukkit.getScheduler().runTaskLater(Sentinel.getInstance(),()->{
reportMap.remove(reportID); 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); },60000);
return reportID; return reportID;
} }

View File

@@ -1,4 +1,4 @@
# Sentinel 0.1.8 # Sentinel 0.2.0
# ____ __ ___ # ____ __ ___
#/\ _`\ /\ \__ __ /\_ \ #/\ _`\ /\ \__ __ /\_ \
#\ \,\L\_\ __ ___\ \ ,_\/\_\ ___ __\//\ \ #\ \,\L\_\ __ ___\ \ ,_\/\_\ ___ __\//\ \

View File

@@ -89,3 +89,8 @@ commands:
- sr - sr
- sreply - sreply
- sentinelreply - 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!