Finished Report false positive feature, and rounded the anti-spam (finally!)
Version 0.2.0
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)));
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Sentinel 0.1.8
|
# Sentinel 0.2.0
|
||||||
# ____ __ ___
|
# ____ __ ___
|
||||||
#/\ _`\ /\ \__ __ /\_ \
|
#/\ _`\ /\ \__ __ /\_ \
|
||||||
#\ \,\L\_\ __ ___\ \ ,_\/\_\ ___ __\//\ \
|
#\ \,\L\_\ __ ___\ \ ,_\/\_\ ___ __\//\ \
|
||||||
|
|||||||
@@ -88,4 +88,9 @@ commands:
|
|||||||
- ereply
|
- ereply
|
||||||
- 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!
|
||||||
Reference in New Issue
Block a user