Anti-Spam has been finished and the Anti-Swear got an upgrade!
This commit is contained in:
@@ -12,6 +12,7 @@ import io.github.thetrouper.sentinel.events.CmdBlockEvents;
|
|||||||
import io.github.thetrouper.sentinel.events.CommandEvent;
|
import io.github.thetrouper.sentinel.events.CommandEvent;
|
||||||
import io.github.thetrouper.sentinel.events.NBTEvents;
|
import io.github.thetrouper.sentinel.events.NBTEvents;
|
||||||
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
||||||
|
import io.github.thetrouper.sentinel.server.functions.ProfanityFilter;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@@ -32,19 +33,7 @@ public final class Sentinel extends JavaPlugin {
|
|||||||
public static final PluginManager manager = Bukkit.getPluginManager();
|
public static final PluginManager manager = Bukkit.getPluginManager();
|
||||||
public static String prefix = "";
|
public static String prefix = "";
|
||||||
public static final Logger log = Bukkit.getLogger();
|
public static final Logger log = Bukkit.getLogger();
|
||||||
public static String webhook;
|
|
||||||
public static List<String> trustedPlayers;
|
|
||||||
public static boolean blockSpecificCommands;
|
|
||||||
public static boolean preventNBT;
|
|
||||||
public static boolean logNBT;
|
|
||||||
public static boolean preventCmdBlocks;
|
|
||||||
public static boolean logCmdBlocks;
|
|
||||||
public static List<String> dangerousCommands;
|
|
||||||
public static boolean logDangerousCommands;
|
|
||||||
public static List<String> loggedCommands;
|
|
||||||
public static boolean deop;
|
|
||||||
public static boolean ban;
|
|
||||||
public static boolean reopCommand;
|
|
||||||
/**
|
/**
|
||||||
* Plugin startup logic
|
* Plugin startup logic
|
||||||
*/
|
*/
|
||||||
@@ -56,10 +45,12 @@ public final class Sentinel extends JavaPlugin {
|
|||||||
saveDefaultConfig();
|
saveDefaultConfig();
|
||||||
|
|
||||||
// Plugin startup logic
|
// Plugin startup logic
|
||||||
loadConfiguration();
|
Config.loadConfiguration();
|
||||||
log.info("Sentinel has loaded! (" + getDescription().getVersion() + ")");
|
log.info("Sentinel has loaded! (" + getDescription().getVersion() + ")");
|
||||||
|
|
||||||
// Enable Functions
|
// Enable Functions
|
||||||
AntiSpam.enableAntiSpam();
|
AntiSpam.enableAntiSpam();
|
||||||
|
ProfanityFilter.enableAntiSwear();
|
||||||
|
|
||||||
prefix = Config.Plugin.getPrefix();
|
prefix = Config.Plugin.getPrefix();
|
||||||
|
|
||||||
@@ -95,54 +86,15 @@ public final class Sentinel extends JavaPlugin {
|
|||||||
// Plugin shutdown logic
|
// Plugin shutdown logic
|
||||||
log.info("Sentinel has disabled! (" + getDescription().getVersion() + ") Your server is now no longer protected!");
|
log.info("Sentinel has disabled! (" + getDescription().getVersion() + ") Your server is now no longer protected!");
|
||||||
}
|
}
|
||||||
private void loadConfiguration() {
|
|
||||||
saveDefaultConfig();
|
|
||||||
FileConfiguration config = getConfig();
|
|
||||||
|
|
||||||
// Load prefix
|
|
||||||
prefix = config.getString("config.plugin.prefix");
|
|
||||||
|
|
||||||
// Load webhook
|
|
||||||
webhook = config.getString("config.plugin.webhook");
|
|
||||||
|
|
||||||
// Load trusted players
|
|
||||||
trustedPlayers = config.getStringList("config.plugin.trusted");
|
|
||||||
|
|
||||||
// Load block-specific commands
|
|
||||||
blockSpecificCommands = config.getBoolean("config.plugin.block-specific");
|
|
||||||
|
|
||||||
// Load prevent NBT
|
|
||||||
preventNBT = config.getBoolean("config.plugin.prevent-nbt");
|
|
||||||
|
|
||||||
// Load log NBT
|
|
||||||
logNBT = config.getBoolean("config.plugin.log-nbt");
|
|
||||||
|
|
||||||
// Load prevent command blocks
|
|
||||||
preventCmdBlocks = config.getBoolean("config.plugin.prevent-cmdblocks");
|
|
||||||
|
|
||||||
// Load log command blocks
|
|
||||||
logCmdBlocks = config.getBoolean("config.plugin.log-cmdblocks");
|
|
||||||
|
|
||||||
// Load dangerous commands
|
|
||||||
dangerousCommands = config.getStringList("config.plugin.dangerous");
|
|
||||||
|
|
||||||
// Load log protected commands
|
|
||||||
logDangerousCommands = config.getBoolean("config.plugin.log-dangerous");
|
|
||||||
|
|
||||||
// Load logged commands
|
|
||||||
loggedCommands = config.getStringList("config.plugin.logged");
|
|
||||||
|
|
||||||
deop = config.getBoolean("config.plugin.deop");
|
|
||||||
ban = config.getBoolean("config.plugin.ban");
|
|
||||||
reopCommand = config.getBoolean("config.plugin.reop-command");
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Checks if a player is trusted.
|
* Checks if a player is trusted.
|
||||||
* @param player the player to check
|
* @param player the player to check
|
||||||
* @return true if the player is trusted, false otherwise
|
* @return true if the player is trusted, false otherwise
|
||||||
*/
|
*/
|
||||||
public static boolean isTrusted(Player player) {
|
public static boolean isTrusted(Player player) {
|
||||||
return trustedPlayers.contains(player.getUniqueId().toString());
|
return Config.trustedPlayers.contains(player.getUniqueId().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +103,7 @@ public final class Sentinel extends JavaPlugin {
|
|||||||
* @return true if the command is logged, false otherwise
|
* @return true if the command is logged, false otherwise
|
||||||
*/
|
*/
|
||||||
public static boolean isLoggedCommand(String command) {
|
public static boolean isLoggedCommand(String command) {
|
||||||
return loggedCommands.contains(command);
|
return Config.loggedCommands.contains(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -160,7 +112,7 @@ public final class Sentinel extends JavaPlugin {
|
|||||||
* @return true if the command is dangerous, false otherwise
|
* @return true if the command is dangerous, false otherwise
|
||||||
*/
|
*/
|
||||||
public static boolean isDangerousCommand(String command) {
|
public static boolean isDangerousCommand(String command) {
|
||||||
return dangerousCommands.contains(command);
|
return Config.dangerousCommands.contains(command);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Returns an instance of this plugin
|
* Returns an instance of this plugin
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ package io.github.thetrouper.sentinel.commands;
|
|||||||
import io.github.thetrouper.sentinel.discord.WebhookSender;
|
import io.github.thetrouper.sentinel.discord.WebhookSender;
|
||||||
import io.github.thetrouper.sentinel.exceptions.CmdExHandler;
|
import io.github.thetrouper.sentinel.exceptions.CmdExHandler;
|
||||||
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
||||||
|
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
||||||
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.*;
|
import org.bukkit.command.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -38,6 +40,10 @@ public class InfoCommand implements TabExecutor {
|
|||||||
case "checkheat" -> {
|
case "checkheat" -> {
|
||||||
sender.sendMessage(TextUtils.prefix("Your heat is §e" + AntiSpam.heatMap.get(sender).toString()));
|
sender.sendMessage(TextUtils.prefix("Your heat is §e" + AntiSpam.heatMap.get(sender).toString()));
|
||||||
}
|
}
|
||||||
|
case "dispatchtest" -> {
|
||||||
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "say " + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting a dangerous command. Contact an administrator if you believe this to be a mistake.");
|
||||||
|
ServerUtils.sendCommand("say test complete!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
@@ -54,7 +60,8 @@ public class InfoCommand implements TabExecutor {
|
|||||||
.add(1,new String[]{
|
.add(1,new String[]{
|
||||||
"debugmode",
|
"debugmode",
|
||||||
"webhooktest",
|
"webhooktest",
|
||||||
"checkheat"
|
"checkheat",
|
||||||
|
"dispatchtest"
|
||||||
}).build();
|
}).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.github.thetrouper.sentinel.commands;
|
package io.github.thetrouper.sentinel.commands;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.exceptions.CmdExHandler;
|
import io.github.thetrouper.sentinel.exceptions.CmdExHandler;
|
||||||
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -17,7 +18,7 @@ public class ReopCommand implements CommandExecutor {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
try {
|
try {
|
||||||
if (Sentinel.reopCommand) {
|
if (Config.reopCommand) {
|
||||||
String name = sender.getName().toString();
|
String name = sender.getName().toString();
|
||||||
Player p = sender.getServer().getPlayer(name);
|
Player p = sender.getServer().getPlayer(name);
|
||||||
if (Sentinel.isTrusted(p)) {
|
if (Sentinel.isTrusted(p)) {
|
||||||
|
|||||||
@@ -5,13 +5,17 @@
|
|||||||
package io.github.thetrouper.sentinel.data;
|
package io.github.thetrouper.sentinel.data;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Config loader
|
* Config loader
|
||||||
*/
|
*/
|
||||||
public abstract class Config {
|
public abstract class Config {
|
||||||
|
|
||||||
private static final FileConfiguration config = Sentinel.getInstance().getConfig();
|
private static final FileConfiguration config = Sentinel.getInstance().getConfig();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -22,4 +26,101 @@ public abstract class Config {
|
|||||||
return config.getString("config.plugin.prefix");
|
return config.getString("config.plugin.prefix");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public static String webhook;
|
||||||
|
public static List<String> trustedPlayers;
|
||||||
|
public static boolean blockSpecificCommands;
|
||||||
|
public static boolean preventNBT;
|
||||||
|
public static boolean logNBT;
|
||||||
|
public static boolean preventCmdBlocks;
|
||||||
|
public static boolean logCmdBlocks;
|
||||||
|
public static List<String> dangerousCommands;
|
||||||
|
public static boolean logDangerousCommands;
|
||||||
|
public static List<String> loggedCommands;
|
||||||
|
public static boolean deop;
|
||||||
|
public static boolean ban;
|
||||||
|
public static boolean reopCommand;
|
||||||
|
|
||||||
|
public static boolean antiSpamEnabled;
|
||||||
|
public static int defaultGain;
|
||||||
|
public static int lowGain;
|
||||||
|
public static int mediumGain;
|
||||||
|
public static int highGain;
|
||||||
|
public static int heatDecay;
|
||||||
|
public static int blockHeat;
|
||||||
|
public static int punishHeat;
|
||||||
|
public static String punishSpamCommand;
|
||||||
|
public static boolean logSpam;
|
||||||
|
public static boolean antiSwearEnabled;
|
||||||
|
public static int lowScore;
|
||||||
|
public static int mediumLowScore;
|
||||||
|
public static int mediumScore;
|
||||||
|
public static int mediumHighScore;
|
||||||
|
public static int highScore;
|
||||||
|
public static int punishScore;
|
||||||
|
public static String swearPunishCommand;
|
||||||
|
public static boolean slurInstaPunish;
|
||||||
|
public static String slurPunishCommand;
|
||||||
|
public static List<String> swearWhitelist;
|
||||||
|
public static List<String> swearBlacklist;
|
||||||
|
public static List<String> slurs;
|
||||||
|
public static Map<String, String> leetPatterns;
|
||||||
|
public static boolean logSwear;
|
||||||
|
|
||||||
|
public static void loadConfiguration() {
|
||||||
|
|
||||||
|
Sentinel.prefix = config.getString("config.plugin.prefix");
|
||||||
|
// antiNuke
|
||||||
|
webhook = config.getString("config.plugin.webhook");
|
||||||
|
trustedPlayers = config.getStringList("config.plugin.trusted");
|
||||||
|
blockSpecificCommands = config.getBoolean("config.plugin.block-specific");
|
||||||
|
preventNBT = config.getBoolean("config.plugin.prevent-nbt");
|
||||||
|
logNBT = config.getBoolean("config.plugin.log-nbt");
|
||||||
|
preventCmdBlocks = config.getBoolean("config.plugin.prevent-cmdblocks");
|
||||||
|
logCmdBlocks = config.getBoolean("config.plugin.log-cmdblocks");
|
||||||
|
dangerousCommands = config.getStringList("config.plugin.dangerous");
|
||||||
|
logDangerousCommands = config.getBoolean("config.plugin.log-dangerous");
|
||||||
|
loggedCommands = config.getStringList("config.plugin.logged");
|
||||||
|
deop = config.getBoolean("config.plugin.deop");
|
||||||
|
ban = config.getBoolean("config.plugin.ban");
|
||||||
|
reopCommand = config.getBoolean("config.plugin.reop-command");
|
||||||
|
// antiSpam
|
||||||
|
antiSpamEnabled = config.getBoolean("config.chat.anti-spam.enabled");
|
||||||
|
defaultGain = config.getInt("config.chat.anti-spam.default-gain");
|
||||||
|
lowGain = config.getInt("config.chat.anti-spam.low-gain");
|
||||||
|
mediumGain = config.getInt("config.chat.anti-spam.medium-gain");
|
||||||
|
highGain = config.getInt("config.chat.anti-spam.high-gain");
|
||||||
|
heatDecay = config.getInt("config.chat.anti-spam.heat-decay");
|
||||||
|
blockHeat = config.getInt("config.chat.anti-spam.block-heat");
|
||||||
|
punishHeat = config.getInt("config.chat.anti-spam.punish-heat");
|
||||||
|
punishSpamCommand = config.getString("config.chat.anti-spam.punish-command");
|
||||||
|
logSpam = config.getBoolean("config.chat.anti-swear.log-swear");
|
||||||
|
// antiSwear
|
||||||
|
antiSwearEnabled = config.getBoolean("config.chat.anti-swear.enabled");
|
||||||
|
lowScore = config.getInt("config.chat.anti-swear.low-gain");
|
||||||
|
mediumLowScore = config.getInt("config.chat.anti-swear.medium-low-gain");
|
||||||
|
mediumScore = config.getInt("config.chat.anti-swear.medium-gain");
|
||||||
|
mediumHighScore = config.getInt("config.chat.anti-swear.medium-high-gain");
|
||||||
|
highScore = config.getInt("config.chat.anti-swear.high-gain");
|
||||||
|
punishScore = config.getInt("config.chat.anti-swear.punish-score");
|
||||||
|
swearPunishCommand = config.getString("config.chat.anti-swear.punish-command");
|
||||||
|
slurInstaPunish = config.getBoolean("config.chat.anti-swear.slur-insta-punish");
|
||||||
|
slurPunishCommand = config.getString("config.chat.anti-swear.slur-command");
|
||||||
|
swearWhitelist = config.getStringList("config.chat.anti-swear.whitelisted");
|
||||||
|
swearBlacklist = config.getStringList("config.chat.anti-swear.blacklisted");
|
||||||
|
slurs = config.getStringList("config.chat.anti-swear.slurs");
|
||||||
|
leetPatterns = loadLeetPatterns();
|
||||||
|
logSwear = config.getBoolean("config.chat.anti-swear.log-swear");
|
||||||
|
}
|
||||||
|
private static Map<String, String> loadLeetPatterns() {
|
||||||
|
Map<String, String> dictionary = new HashMap<>();
|
||||||
|
ConfigurationSection section = config.getConfigurationSection("config.chat.anti-swear.leet-patterns");
|
||||||
|
|
||||||
|
if (section != null) {
|
||||||
|
for (String key : section.getKeys(false)) {
|
||||||
|
dictionary.put(key, section.getString(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dictionary;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,32 @@
|
|||||||
package io.github.thetrouper.sentinel.data;
|
package io.github.thetrouper.sentinel.data;
|
||||||
|
|
||||||
public class Emojis {
|
public class Emojis {
|
||||||
public static String success = "<:success:1125240412081238066>";
|
public static String rightSort = "<:rightSort:1125785837255270520>";
|
||||||
|
public static String arrowRight = "<:arrowRight:1125785471520354304>";
|
||||||
|
public static String rightDoubleArrow = "<:rightDoubleArrow:1125785800353783868>";
|
||||||
|
public static String activity = "<:activity:1125785527468167178>";
|
||||||
|
public static String alarm = "<:alarm:1125790301873770606>";
|
||||||
|
public static String target = "<:target:1125788461371232307>";
|
||||||
|
public static String bot = "<:bot:1125791121851826206>";
|
||||||
|
public static String cancel = "<:cancel:1125785769471127694>";
|
||||||
|
public static String creation = "<:creation:1125790610729730109>";
|
||||||
|
public static String date = "<:date:1125790434443145297>";
|
||||||
|
public static String kick = "<:kick:1125785612595761212>";
|
||||||
|
public static String members = "<:members:1125791101199077426>";
|
||||||
|
public static String mute = "<:mute:1125789032937435247>";
|
||||||
|
public static String noDM = "<:noDM:1125790359423824022>";
|
||||||
|
public static String owner = "<:owner:1125791175559876669>";
|
||||||
|
public static String potentialDanger = "<:potentialDanger:1125788513971998741>";
|
||||||
|
public static String roles = "<:roles:1125790513933594645>";
|
||||||
|
public static String separator = "<:separator:1125790817626357861>";
|
||||||
|
public static String splash = "<:splash:1125791213933563905>";
|
||||||
|
public static String success = "<:success:1125785728161419356>";
|
||||||
|
public static String suspicious = "<:suspicious:1125790709371371682>";
|
||||||
|
public static String trustedAdmin = "<:trustedAdmin:1125785574591180822>";
|
||||||
|
public static String upvoter = "<:upvoter:1125790659735977994>";
|
||||||
|
public static String vanity = "<:vanity:1125791060594004039>";
|
||||||
|
public static String webhook = "<:webhook:1125790545638330388>";
|
||||||
public static String failure = "<:failure:1125241087909429369>";
|
public static String failure = "<:failure:1125241087909429369>";
|
||||||
public static String rightArrow = "<:rightArrow:1125241843597189160>";
|
|
||||||
public static String nuke = "<:nuke:1125244368807280702>";
|
public static String nuke = "<:nuke:1125244368807280702>";
|
||||||
public static String member = "<:member:1125244044407218176>";
|
public static String member = "<:member:1125244044407218176>";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package io.github.thetrouper.sentinel.discord;
|
|||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
import io.github.thetrouper.sentinel.commands.InfoCommand;
|
import io.github.thetrouper.sentinel.commands.InfoCommand;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.data.Emojis;
|
import io.github.thetrouper.sentinel.data.Emojis;
|
||||||
import io.github.thetrouper.sentinel.discord.DiscordWebhook;
|
import io.github.thetrouper.sentinel.discord.DiscordWebhook;
|
||||||
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
||||||
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
@@ -15,7 +17,7 @@ import java.io.IOException;
|
|||||||
public class WebhookSender {
|
public class WebhookSender {
|
||||||
|
|
||||||
public static void sendHelloWorldEmbed() {
|
public static void sendHelloWorldEmbed() {
|
||||||
String webhookUrl = Sentinel.webhook;
|
String webhookUrl = Config.webhook;
|
||||||
|
|
||||||
// Create a new DiscordWebhook instance
|
// Create a new DiscordWebhook instance
|
||||||
DiscordWebhook webhook = new DiscordWebhook(webhookUrl);
|
DiscordWebhook webhook = new DiscordWebhook(webhookUrl);
|
||||||
@@ -36,6 +38,7 @@ public class WebhookSender {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String successOrFail(boolean bool) {
|
public static String successOrFail(boolean bool) {
|
||||||
if (bool) {
|
if (bool) {
|
||||||
return Emojis.success;
|
return Emojis.success;
|
||||||
@@ -46,13 +49,13 @@ public class WebhookSender {
|
|||||||
public static void sendEmbedWarning(String player, String command, boolean denied, boolean removedOp, boolean banned) {
|
public static void sendEmbedWarning(String player, String command, boolean denied, boolean removedOp, boolean banned) {
|
||||||
ServerUtils.sendDebugMessage("Creating Command Webhook...");
|
ServerUtils.sendDebugMessage("Creating Command Webhook...");
|
||||||
final String description =
|
final String description =
|
||||||
Emojis.rightArrow + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
Emojis.arrowRight + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
||||||
Emojis.rightArrow + " **Command:** " + command + " " + Emojis.nuke + "\\n" +
|
Emojis.arrowRight + " **Command:** " + command + " " + Emojis.nuke + "\\n" +
|
||||||
Emojis.rightArrow + " **Denied:** " + successOrFail(denied) + "\\n" +
|
Emojis.arrowRight + " **Denied:** " + successOrFail(denied) + "\\n" +
|
||||||
Emojis.rightArrow + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
Emojis.arrowRight + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
||||||
Emojis.rightArrow + " **Banned:** " + successOrFail(banned) + "\\n";
|
Emojis.arrowRight + " **Banned:** " + successOrFail(banned) + "\\n";
|
||||||
|
|
||||||
DiscordWebhook webhook = new DiscordWebhook(Sentinel.webhook);
|
DiscordWebhook webhook = new DiscordWebhook(Config.webhook);
|
||||||
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
||||||
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
||||||
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
||||||
@@ -72,13 +75,13 @@ public class WebhookSender {
|
|||||||
public static void sendEmbedWarning(String player, Block b, boolean denied, boolean removedOp, boolean banned) {
|
public static void sendEmbedWarning(String player, Block b, boolean denied, boolean removedOp, boolean banned) {
|
||||||
ServerUtils.sendDebugMessage("Creating Block Webhook...");
|
ServerUtils.sendDebugMessage("Creating Block Webhook...");
|
||||||
final String description =
|
final String description =
|
||||||
Emojis.rightArrow + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
Emojis.arrowRight + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
||||||
Emojis.rightArrow + " **Block:** " + b.getType() + " " + Emojis.nuke + "\\n" +
|
Emojis.arrowRight + " **Block:** " + b.getType() + " " + Emojis.nuke + "\\n" +
|
||||||
Emojis.rightArrow + " **Denied:** " + successOrFail(denied) + "\\n" +
|
Emojis.arrowRight + " **Denied:** " + successOrFail(denied) + "\\n" +
|
||||||
Emojis.rightArrow + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
Emojis.arrowRight + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
||||||
Emojis.rightArrow + " **Banned:** " + successOrFail(banned) + "\\n";
|
Emojis.arrowRight + " **Banned:** " + successOrFail(banned) + "\\n";
|
||||||
|
|
||||||
DiscordWebhook webhook = new DiscordWebhook(Sentinel.webhook);
|
DiscordWebhook webhook = new DiscordWebhook(Config.webhook);
|
||||||
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
||||||
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
||||||
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
||||||
@@ -99,13 +102,13 @@ public class WebhookSender {
|
|||||||
public static void sendEmbedWarning(String player, ItemStack item, boolean denied, boolean removedOp, boolean banned) {
|
public static void sendEmbedWarning(String player, ItemStack item, boolean denied, boolean removedOp, boolean banned) {
|
||||||
ServerUtils.sendDebugMessage("Creating Webhook...");
|
ServerUtils.sendDebugMessage("Creating Webhook...");
|
||||||
final String description =
|
final String description =
|
||||||
Emojis.rightArrow + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
Emojis.arrowRight + " **Player:** " + player + " " + Emojis.member + "\\n" +
|
||||||
Emojis.rightArrow + " **Item:** " + item.getType() + " " + Emojis.nuke + "\\n" +
|
Emojis.arrowRight + " **Item:** " + item.getType() + " " + Emojis.nuke + "\\n" +
|
||||||
Emojis.rightArrow + " **Denied:** " + successOrFail(denied) + "\\n" +
|
Emojis.arrowRight + " **Denied:** " + successOrFail(denied) + "\\n" +
|
||||||
Emojis.rightArrow + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
Emojis.arrowRight + " **Removed OP:** " + successOrFail(removedOp) + "\\n" +
|
||||||
Emojis.rightArrow + " **Banned:** " + successOrFail(banned) + "\\n";
|
Emojis.arrowRight + " **Banned:** " + successOrFail(banned) + "\\n";
|
||||||
|
|
||||||
DiscordWebhook webhook = new DiscordWebhook(Sentinel.webhook);
|
DiscordWebhook webhook = new DiscordWebhook(Config.webhook);
|
||||||
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
webhook.setAvatarUrl("https://r2.e-z.host/d440b58a-ba90-4839-8df6-8bba298cf817/3lwit5nt.png");
|
||||||
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
webhook.setUsername("Sentinel Anti-Nuke | Logs");
|
||||||
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
DiscordWebhook.EmbedObject embed = new DiscordWebhook.EmbedObject()
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
package io.github.thetrouper.sentinel.events;
|
package io.github.thetrouper.sentinel.events;
|
||||||
|
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
import io.github.thetrouper.sentinel.server.functions.AntiSpam;
|
||||||
|
import io.github.thetrouper.sentinel.server.functions.ProfanityFilter;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
|
||||||
public class ChatEvent implements Listener {
|
public class ChatEvent implements Listener {
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public static void onChat(AsyncPlayerChatEvent e) {
|
public static void onChat(AsyncPlayerChatEvent e) {
|
||||||
AntiSpam.handleAntiSpam(e);
|
if (Config.antiSwearEnabled) ProfanityFilter.handleProfanityFilter(e);
|
||||||
|
if (Config.antiSpamEnabled) AntiSpam.handleAntiSpam(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.github.thetrouper.sentinel.events;
|
package io.github.thetrouper.sentinel.events;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.server.util.DeniedActions;
|
import io.github.thetrouper.sentinel.server.util.DeniedActions;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@@ -15,7 +16,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
|
|||||||
public class CmdBlockEvents implements Listener {
|
public class CmdBlockEvents implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
private void onCMDBlockUse(PlayerInteractEvent e) {
|
private void onCMDBlockUse(PlayerInteractEvent e) {
|
||||||
if (!Sentinel.preventCmdBlocks) return;
|
if (!Config.preventCmdBlocks) return;
|
||||||
if (e.getClickedBlock() == null) return;
|
if (e.getClickedBlock() == null) return;
|
||||||
Block b = e.getClickedBlock();
|
Block b = e.getClickedBlock();
|
||||||
if (b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK) {
|
if (b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK) {
|
||||||
@@ -28,7 +29,7 @@ public class CmdBlockEvents implements Listener {
|
|||||||
}
|
}
|
||||||
@EventHandler
|
@EventHandler
|
||||||
private void onCMDBlockPlace(BlockPlaceEvent e) {
|
private void onCMDBlockPlace(BlockPlaceEvent e) {
|
||||||
if (!Sentinel.preventCmdBlocks) return;
|
if (!Config.preventCmdBlocks) return;
|
||||||
Block b = e.getBlockPlaced();
|
Block b = e.getBlockPlaced();
|
||||||
if (b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK ) {
|
if (b.getType() == Material.COMMAND_BLOCK || b.getType() == Material.CHAIN_COMMAND_BLOCK || b.getType() == Material.REPEATING_COMMAND_BLOCK ) {
|
||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
@@ -40,7 +41,7 @@ public class CmdBlockEvents implements Listener {
|
|||||||
}
|
}
|
||||||
@EventHandler
|
@EventHandler
|
||||||
private void onCMDBlockMinecartUse(PlayerInteractEntityEvent e) {
|
private void onCMDBlockMinecartUse(PlayerInteractEntityEvent e) {
|
||||||
if (!Sentinel.preventCmdBlocks) return;
|
if (!Config.preventCmdBlocks) return;
|
||||||
if (e.getRightClicked().getType() == EntityType.MINECART_COMMAND) {
|
if (e.getRightClicked().getType() == EntityType.MINECART_COMMAND) {
|
||||||
Player p = e.getPlayer();
|
Player p = e.getPlayer();
|
||||||
if (!Sentinel.isTrusted(p)) {
|
if (!Sentinel.isTrusted(p)) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.github.thetrouper.sentinel.events;
|
package io.github.thetrouper.sentinel.events;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.server.util.DeniedActions;
|
import io.github.thetrouper.sentinel.server.util.DeniedActions;
|
||||||
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
||||||
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
@@ -24,7 +25,7 @@ public class CommandEvent implements Listener {
|
|||||||
DeniedActions.handleDeniedAction(p,e.getMessage());
|
DeniedActions.handleDeniedAction(p,e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Sentinel.blockSpecificCommands) {
|
if (Config.blockSpecificCommands) {
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("Checking command for specific"));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("Checking command for specific"));
|
||||||
if (command.contains(":")) {
|
if (command.contains(":")) {
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("Checking is specific"));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("Checking is specific"));
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
package io.github.thetrouper.sentinel.server.functions;
|
package io.github.thetrouper.sentinel.server.functions;
|
||||||
|
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.server.util.GPTUtils;
|
import io.github.thetrouper.sentinel.server.util.GPTUtils;
|
||||||
|
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
||||||
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
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;
|
||||||
@@ -19,29 +25,58 @@ public class AntiSpam {
|
|||||||
heatMap = new HashMap<>();
|
heatMap = new HashMap<>();
|
||||||
lastMessageMap = new HashMap<>();
|
lastMessageMap = new HashMap<>();
|
||||||
}
|
}
|
||||||
public static void handleAntiSpam(AsyncPlayerChatEvent event) {
|
public static void handleAntiSpam(AsyncPlayerChatEvent e) {
|
||||||
Player player = event.getPlayer();
|
Player p = e.getPlayer();
|
||||||
String message = event.getMessage();
|
String message = e.getMessage();
|
||||||
if (!heatMap.containsKey(player)) heatMap.put(player, 0);
|
if (!heatMap.containsKey(p)) heatMap.put(p, 0);
|
||||||
if (heatMap.get(player) > 10) {
|
if (heatMap.get(p) > Config.punishHeat) {
|
||||||
event.setCancelled(true);
|
e.setCancelled(true);
|
||||||
player.sendMessage(TextUtils.prefix("Rate limit exceeded! Please wait before sending another message."));
|
punishSpam(p,message, lastMessageMap.get(p));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (lastMessageMap.containsKey(player)) {
|
if (heatMap.get(p) > Config.blockHeat) {
|
||||||
String lastMessage = lastMessageMap.get(player);
|
e.setCancelled(true);
|
||||||
double similarity = calculateSimilarity(message, lastMessage);
|
alertSpam(p, message, lastMessageMap.get(p));
|
||||||
if (similarity > 0.5) heatMap.put(player, heatMap.get(player) + 3);
|
return;
|
||||||
if (similarity > 0.9) heatMap.put(player, heatMap.get(player) + 6);
|
|
||||||
}
|
}
|
||||||
lastMessageMap.put(player, message);
|
if (lastMessageMap.containsKey(p)) {
|
||||||
|
String lastMessage = lastMessageMap.get(p);
|
||||||
|
double similarity = calculateSimilarity(message, lastMessage);
|
||||||
|
if (similarity > 0.25) heatMap.put(p, heatMap.get(p) + Config.lowGain);
|
||||||
|
if (similarity > 0.5) heatMap.put(p, heatMap.get(p) + Config.mediumGain);
|
||||||
|
if (similarity > 0.9) heatMap.put(p, heatMap.get(p) + Config.highGain);
|
||||||
|
}
|
||||||
|
lastMessageMap.put(p, message);
|
||||||
}
|
}
|
||||||
public static void decayHeat() {
|
public static void decayHeat() {
|
||||||
for (Player player : heatMap.keySet()) {
|
for (Player p : heatMap.keySet()) {
|
||||||
int heat = heatMap.get(player);
|
int heat = heatMap.get(p);
|
||||||
if (heat > 0) {
|
if (heat > 0) {
|
||||||
heatMap.put(player, heat - 1);
|
heat = heat - Config.heatDecay;
|
||||||
|
heatMap.put(p, Math.max(0, heat));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void alertSpam(Player p, String message1, String message2) {
|
||||||
|
TextComponent text = new TextComponent();
|
||||||
|
p.sendMessage(TextUtils.prefix("Do not spam in chat! Please wait before sending another message."));
|
||||||
|
String hover = TextUtils.color("&bPrevious: &f" + message2 + "\n&bCurrent: &f" + message1 + "\n&bSimilarity &f" + GPTUtils.calculateSimilarity(message1,message2 + "%"));
|
||||||
|
text.setText(TextUtils.prefix(TextUtils.color
|
||||||
|
("&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)));
|
||||||
|
ServerUtils.forEachStaff(staff -> {
|
||||||
|
staff.spigot().sendMessage(text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void punishSpam(Player player, String message1, String message2) {
|
||||||
|
ServerUtils.sendCommand(Config.punishSpamCommand.replace("%player%", player.getName()));
|
||||||
|
player.sendMessage(TextUtils.prefix(TextUtils.color("&cYou have been auto-punished for violating the anti-spam repetitively!")));
|
||||||
|
TextComponent text = new TextComponent();
|
||||||
|
text.setText(TextUtils.prefix(TextUtils.color
|
||||||
|
("&b&n" + player.getName() + "&7 has been auto-muted by the anti-spam! &8(&c" + heatMap.get(player) + "&7/&4" + Config.punishHeat + "&8)")));
|
||||||
|
ServerUtils.forEachStaff(staff -> {
|
||||||
|
staff.spigot().sendMessage(text);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
package io.github.thetrouper.sentinel.server.functions;
|
||||||
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
|
import io.github.thetrouper.sentinel.server.util.ServerUtils;
|
||||||
|
import io.github.thetrouper.sentinel.server.util.TextUtils;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ProfanityFilter {
|
||||||
|
public static Map<Player, Integer> scoreMap;
|
||||||
|
private static final List<String> swearBlacklist = Config.swearBlacklist;
|
||||||
|
private static final List<String> swearWhitelist = Config.swearWhitelist;
|
||||||
|
private static final List<String> slurs = Config.slurs;
|
||||||
|
|
||||||
|
public static void enableAntiSwear() {
|
||||||
|
scoreMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
public static void handleProfanityFilter(AsyncPlayerChatEvent e) {
|
||||||
|
Player p = e.getPlayer();
|
||||||
|
String message = e.getMessage();
|
||||||
|
if (!scoreMap.containsKey(p)) scoreMap.put(p, 0);
|
||||||
|
if (scoreMap.get(p) > Config.punishScore) punishSwear(p,highlightProfanity(message),message);
|
||||||
|
switch (ProfanityFilter.checkSeverity(message)) {
|
||||||
|
case "low" -> {
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.lowScore);
|
||||||
|
p.sendMessage(TextUtils.prefix("§cPlease do not swear in chat! Attempting to bypass this filter will result in a mute!"));
|
||||||
|
}
|
||||||
|
case "medium-low" -> {
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.mediumLowScore);
|
||||||
|
blockSwear(p,highlightProfanity(message),message);
|
||||||
|
}
|
||||||
|
case "medium" -> {
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.mediumScore);
|
||||||
|
blockSwear(p,highlightProfanity(message),message);
|
||||||
|
}
|
||||||
|
case "medium-high" -> {
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.mediumHighScore);
|
||||||
|
blockSwear(p,highlightProfanity(message),message);
|
||||||
|
}
|
||||||
|
case "high" -> {
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.highScore);
|
||||||
|
blockSwear(p,highlightProfanity(message),message);
|
||||||
|
}
|
||||||
|
case "slur" -> {
|
||||||
|
// Insta-Punish
|
||||||
|
e.setCancelled(true);
|
||||||
|
scoreMap.put(p, scoreMap.get(p) + Config.highScore);
|
||||||
|
punishSlur(p,highlightProfanity(message),message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void punishSwear(Player player, String highlightedMSG, String origMessage) {
|
||||||
|
ServerUtils.sendCommand(Config.swearPunishCommand.replace("%player%", player.getName()));
|
||||||
|
player.sendMessage(TextUtils.prefix(TextUtils.color("&cYou have been auto-muted for violating the anti-swear repetitively!")));
|
||||||
|
String hover = TextUtils.color("&bOriginal: &f" + origMessage + "\n&bSanitized: &f" + highlightedMSG + "\n&7&o(click to copy)");
|
||||||
|
TextComponent text = new TextComponent();
|
||||||
|
text.setText(TextUtils.prefix(TextUtils.color
|
||||||
|
("&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));
|
||||||
|
|
||||||
|
ServerUtils.forEachStaff(staff -> {
|
||||||
|
staff.spigot().sendMessage(text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void punishSlur(Player player, String highlightedMSG, String origMessage) {
|
||||||
|
if (!Config.slurInstaPunish) return;
|
||||||
|
ServerUtils.sendCommand(Config.slurPunishCommand.replace("%player%", player.getName()));
|
||||||
|
player.sendMessage(TextUtils.prefix(TextUtils.color("&cYou have been insta-muted for saying a slur!")));
|
||||||
|
String hover = TextUtils.color("&bOriginal: &f" + origMessage + "\n&bSanitized: &f" + highlightedMSG + "\n&7&o(click to copy)");
|
||||||
|
TextComponent text = new TextComponent();
|
||||||
|
text.setText(TextUtils.prefix(TextUtils.color
|
||||||
|
("&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));
|
||||||
|
|
||||||
|
ServerUtils.forEachStaff(staff -> {
|
||||||
|
staff.spigot().sendMessage(text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void blockSwear(Player player, String highlightedMSG, String origMessage) {
|
||||||
|
player.sendMessage(TextUtils.prefix(TextUtils.color("&cPlease do not swear in chat! Attempting to bypass this filter will result in a mute!")));
|
||||||
|
String hover = TextUtils.color("&bOriginal: &f" + origMessage + "\n&bSanitized: &f" + highlightedMSG + "\n&7&o(click to copy)");
|
||||||
|
TextComponent text = new TextComponent();
|
||||||
|
text.setText(TextUtils.prefix(TextUtils.color
|
||||||
|
("&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.COPY_TO_CLIPBOARD, origMessage));
|
||||||
|
|
||||||
|
ServerUtils.forEachStaff(staff -> {
|
||||||
|
staff.spigot().sendMessage(text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String highlightProfanity(String text) {
|
||||||
|
String lowercasedText = text.toLowerCase();
|
||||||
|
String highlightedSwears = highlightSwears(lowercasedText, "§c", "§f");
|
||||||
|
String highlightedText = highlightSlurs(highlightedSwears, "§e", "§f");
|
||||||
|
return highlightedText;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String highlightSwears(String text, String start, String end) {
|
||||||
|
for (String swear : swearBlacklist) {
|
||||||
|
if (text.contains(swear)) {text = text.replace(swear, start + swear + end);}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String highlightSlurs(String text, String start, String end) {
|
||||||
|
for (String slur : slurs) {
|
||||||
|
if (text.contains(slur)) {
|
||||||
|
text = text.replace(slur, start + slur + end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1: lowercase the text
|
||||||
|
* 2: remove the known false positives
|
||||||
|
* 3: Check for swears and return "low" if true
|
||||||
|
* 4: Convert LeetSpeak Characters
|
||||||
|
* 5: Check for swears and return "medium-low" if true
|
||||||
|
* 6: Strip all special characters
|
||||||
|
* 7: Check for swears and return "medium" if true
|
||||||
|
* 8: simplify repeating letters
|
||||||
|
* 9: Check for swears and return "medium-high" if true
|
||||||
|
* 10: remove periods and spaces
|
||||||
|
* 11: Check for swears and return "high" if true
|
||||||
|
*/
|
||||||
|
public static String checkSeverity(String text) {
|
||||||
|
// 1:
|
||||||
|
String lowercasedText = text.toLowerCase();
|
||||||
|
|
||||||
|
// 2:
|
||||||
|
String cleanedText = removeFalsePositives(lowercasedText);
|
||||||
|
|
||||||
|
// 3:
|
||||||
|
if (containsSwears(cleanedText)) return "low";
|
||||||
|
if (containsSlurs(cleanedText)) return "slur";
|
||||||
|
|
||||||
|
// 4:
|
||||||
|
String convertedText = convertLeetSpeakCharacters(cleanedText);
|
||||||
|
|
||||||
|
// 5:
|
||||||
|
if (containsSwears(convertedText)) return "medium-low";
|
||||||
|
if (containsSlurs(cleanedText)) return "slur";
|
||||||
|
|
||||||
|
// 6:
|
||||||
|
String strippedText = stripSpecialCharacters(convertedText);
|
||||||
|
|
||||||
|
// 7:
|
||||||
|
if (containsSwears(strippedText)) return "medium";
|
||||||
|
if (containsSlurs(strippedText)) return "slur";
|
||||||
|
|
||||||
|
// 8:
|
||||||
|
String simplifiedText = simplifyRepeatingLetters(strippedText);
|
||||||
|
|
||||||
|
// 9:
|
||||||
|
if (containsSwears(simplifiedText)) return "medium-high";
|
||||||
|
if (containsSlurs(simplifiedText)) return "slur";
|
||||||
|
|
||||||
|
// 10:
|
||||||
|
String finalText = removePeriodsAndSpaces(simplifiedText);
|
||||||
|
|
||||||
|
// 11:
|
||||||
|
if (containsSwears(finalText)) return "high";
|
||||||
|
if (containsSlurs(finalText)) return "slur";
|
||||||
|
|
||||||
|
return "safe";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String removeFalsePositives(String text) {
|
||||||
|
for (String falsePositive : swearWhitelist) {
|
||||||
|
text = text.replace(falsePositive, "");
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean containsSwears(String text) {
|
||||||
|
for (String swear : swearBlacklist) {
|
||||||
|
if (text.contains(swear)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
private static boolean containsSlurs(String text) {
|
||||||
|
for (String slur : slurs) {
|
||||||
|
if (text.contains(slur)) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String convertLeetSpeakCharacters(String text) {
|
||||||
|
text = TextUtils.fromLeetString(text);
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String stripSpecialCharacters(String text) {
|
||||||
|
text = text.replaceAll("[^A-Za-z0-9]", "").trim();
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String simplifyRepeatingLetters(String text) {
|
||||||
|
text = TextUtils.replaceRepeatingLetters(text);
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String removePeriodsAndSpaces(String text) {
|
||||||
|
return text.replace(".", "").replace(" ", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package io.github.thetrouper.sentinel.server.util;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public final class ArrayUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transforms an array to another one
|
||||||
|
* @param e iterable list
|
||||||
|
* @param a action
|
||||||
|
* @return new transformed list
|
||||||
|
* @param <I> input
|
||||||
|
* @param <O> output
|
||||||
|
*/
|
||||||
|
public static <I,O> List<O> toNewList(Iterable<I> e, Function<I,O> a) {
|
||||||
|
List<O> list = new ArrayList<>();
|
||||||
|
e.forEach(i -> list.add(a.apply(i)));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> String list2string(List<T> list) {
|
||||||
|
return TextUtils.color("&7[&e" + String.join("&7, &e", ArrayUtils.toNewList(list, Object::toString)) + "&7]");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> List<T> bind(Iterable<T> tList, T... ts) {
|
||||||
|
List<T> list = Arrays.asList(ts);
|
||||||
|
tList.forEach(list::add);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Constants {
|
||||||
|
public static final List<String> MATERIAL_NAMES = toNewList(Arrays.stream(Material.values()).toList(),m -> m.name().toLowerCase());
|
||||||
|
public static final List<String> ENTITY_NAMES = toNewList(Arrays.stream(EntityType.values()).toList(),e -> e.name().toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.github.thetrouper.sentinel.server.util;
|
package io.github.thetrouper.sentinel.server.util;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
import io.github.thetrouper.sentinel.discord.WebhookSender;
|
import io.github.thetrouper.sentinel.discord.WebhookSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.chat.HoverEvent;
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
@@ -18,15 +19,19 @@ public class DeniedActions {
|
|||||||
private static boolean opRemoved;
|
private static boolean opRemoved;
|
||||||
private static boolean denied;
|
private static boolean denied;
|
||||||
|
|
||||||
|
public static void logPunishment(Player p, String type, String reason) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public static void handleDeniedAction(Player p, String command) {
|
public static void handleDeniedAction(Player p, String command) {
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("Handling denied command..."));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("Handling denied command..."));
|
||||||
if (!Sentinel.logDangerousCommands) return;
|
if (!Config.logDangerousCommands) return;
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("LDC is enabled"));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("LDC is enabled"));
|
||||||
logMessage = "]==-- Sentinel --==[\n" +
|
logMessage = "]==-- Sentinel --==[\n" +
|
||||||
"A Dangerous command has been attempted!\n" +
|
"A Dangerous command has been attempted!\n" +
|
||||||
"Player: " + p.getName() + "\n" +
|
"Player: " + p.getName() + "\n" +
|
||||||
"Command: " + command + "\n";
|
"Command: " + command + "\n";
|
||||||
if (Sentinel.deop) {
|
if (Config.deop) {
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("Deoping player"));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("Deoping player"));
|
||||||
p.setOp(false);
|
p.setOp(false);
|
||||||
logMessage = logMessage + "Operator Removed: ✔\n";
|
logMessage = logMessage + "Operator Removed: ✔\n";
|
||||||
@@ -35,7 +40,7 @@ public class DeniedActions {
|
|||||||
logMessage = logMessage + "Operator Removed: ✘\n";
|
logMessage = logMessage + "Operator Removed: ✘\n";
|
||||||
opRemoved = false;
|
opRemoved = false;
|
||||||
}
|
}
|
||||||
if (Sentinel.ban) {
|
if (Config.ban) {
|
||||||
ServerUtils.sendDebugMessage(TextUtils.prefix("Banning player"));
|
ServerUtils.sendDebugMessage(TextUtils.prefix("Banning player"));
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting a dangerous command. Contact an administrator if you believe this to be a mistake.");
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting a dangerous command. Contact an administrator if you believe this to be a mistake.");
|
||||||
logMessage = logMessage + "Banned: ✔\n";
|
logMessage = logMessage + "Banned: ✔\n";
|
||||||
@@ -52,12 +57,12 @@ public class DeniedActions {
|
|||||||
WebhookSender.sendEmbedWarning(p.getName(),command,denied,opRemoved,banned);
|
WebhookSender.sendEmbedWarning(p.getName(),command,denied,opRemoved,banned);
|
||||||
}
|
}
|
||||||
public static void handleDeniedAction(Player p, Block block) {
|
public static void handleDeniedAction(Player p, Block block) {
|
||||||
if (!Sentinel.logCmdBlocks) return;
|
if (!Config.logCmdBlocks) return;
|
||||||
logMessage = "]==-- Sentinel --==[\n" +
|
logMessage = "]==-- Sentinel --==[\n" +
|
||||||
"A Dangerous block usage has been detected!\n" +
|
"A Dangerous block usage has been detected!\n" +
|
||||||
"Player: " + p.getName() + "\n" +
|
"Player: " + p.getName() + "\n" +
|
||||||
"BlockType: " + block.getType() + "\n";
|
"BlockType: " + block.getType() + "\n";
|
||||||
if (Sentinel.deop) {
|
if (Config.deop) {
|
||||||
p.setOp(false);
|
p.setOp(false);
|
||||||
logMessage = logMessage + "Operator Removed: ✔\n";
|
logMessage = logMessage + "Operator Removed: ✔\n";
|
||||||
opRemoved = true;
|
opRemoved = true;
|
||||||
@@ -65,7 +70,7 @@ public class DeniedActions {
|
|||||||
logMessage = logMessage + "Operator Removed: ✘\n";
|
logMessage = logMessage + "Operator Removed: ✘\n";
|
||||||
opRemoved = false;
|
opRemoved = false;
|
||||||
}
|
}
|
||||||
if (Sentinel.ban) {
|
if (Config.ban) {
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting to use dangerous blocks. Contact an administrator if you believe this to be a mistake.");
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting to use dangerous blocks. Contact an administrator if you believe this to be a mistake.");
|
||||||
logMessage = logMessage + "Banned: ✔\n";
|
logMessage = logMessage + "Banned: ✔\n";
|
||||||
banned = true;
|
banned = true;
|
||||||
@@ -80,12 +85,12 @@ public class DeniedActions {
|
|||||||
WebhookSender.sendEmbedWarning(p.getName(),block,denied,opRemoved,banned);
|
WebhookSender.sendEmbedWarning(p.getName(),block,denied,opRemoved,banned);
|
||||||
}
|
}
|
||||||
public static void handleDeniedAction(Player p, ItemStack i) {
|
public static void handleDeniedAction(Player p, ItemStack i) {
|
||||||
if (!Sentinel.logNBT) return;
|
if (!Config.logNBT) return;
|
||||||
logMessage = "]==-- Sentinel --==[\n" +
|
logMessage = "]==-- Sentinel --==[\n" +
|
||||||
"A Dangerous item has been detected!\n" +
|
"A Dangerous item has been detected!\n" +
|
||||||
"Player: " + p.getName() + "\n" +
|
"Player: " + p.getName() + "\n" +
|
||||||
"ItemType: " + i.getType() + "\n";
|
"ItemType: " + i.getType() + "\n";
|
||||||
if (Sentinel.deop) {
|
if (Config.deop) {
|
||||||
p.setOp(false);
|
p.setOp(false);
|
||||||
logMessage = logMessage + "Operator Removed: ✔\n";
|
logMessage = logMessage + "Operator Removed: ✔\n";
|
||||||
opRemoved = true;
|
opRemoved = true;
|
||||||
@@ -93,7 +98,7 @@ public class DeniedActions {
|
|||||||
logMessage = logMessage + "Operator Removed: ✘\n";
|
logMessage = logMessage + "Operator Removed: ✘\n";
|
||||||
opRemoved = false;
|
opRemoved = false;
|
||||||
}
|
}
|
||||||
if (Sentinel.ban) {
|
if (Config.ban) {
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting to use an NBT item. Contact an administrator if you believe this to be a mistake.");
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + p.getName() + " ]=- Sentinel Anti-Grief -=[ You have been banned for attempting to use an NBT item. Contact an administrator if you believe this to be a mistake.");
|
||||||
logMessage = logMessage + "Banned: ✔\n";
|
logMessage = logMessage + "Banned: ✔\n";
|
||||||
banned = true;
|
banned = true;
|
||||||
|
|||||||
@@ -1,23 +1,33 @@
|
|||||||
/**
|
|
||||||
* This file is for tutorial purposes made by ImproperIssues. Distribute if you want :)
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.github.thetrouper.sentinel.server.util;
|
package io.github.thetrouper.sentinel.server.util;
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
import io.github.thetrouper.sentinel.commands.InfoCommand;
|
import io.github.thetrouper.sentinel.commands.InfoCommand;
|
||||||
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.Server;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Objects;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
public class ServerUtils {
|
||||||
* Server utils
|
public static void sendCommand(String command) {
|
||||||
*/
|
ServerUtils.sendDebugMessage("Getting scheduler");
|
||||||
public abstract class ServerUtils {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(Sentinel.getInstance(), () -> {
|
||||||
|
try {
|
||||||
|
ServerUtils.sendDebugMessage("Attempting to run command...");
|
||||||
|
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), command);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
},1);
|
||||||
|
}
|
||||||
public static void sendDebugMessage(String message) {
|
public static void sendDebugMessage(String message) {
|
||||||
if (InfoCommand.debugmode) {
|
if (InfoCommand.debugmode) {
|
||||||
Sentinel.log.info(message);
|
Sentinel.log.info(message);
|
||||||
@@ -28,37 +38,57 @@ public abstract class ServerUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* List of names of online players
|
public static List<Player> getPlayers() {
|
||||||
* @return list of names
|
return new ArrayList<>(Bukkit.getOnlinePlayers());
|
||||||
*/
|
|
||||||
public static List<String> listPlayers() {
|
|
||||||
List<String> list =new ArrayList<>();
|
|
||||||
Bukkit.getOnlinePlayers().forEach(p -> list.add(p.getName()));
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static List<Player> getStaff() {
|
||||||
* List of names of online staff
|
return getPlayers().stream().filter(Player -> Player.hasPermission("sentinel.staff")).toList();
|
||||||
* @return list of names
|
|
||||||
*/
|
|
||||||
public static List<String> listStaff() {
|
|
||||||
List<String> list =new ArrayList<>();
|
|
||||||
Bukkit.getOnlinePlayers().forEach(p -> {
|
|
||||||
if (p.isOp()) list.add(p.getName());
|
|
||||||
});
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static void forEachPlayer(Consumer<Player> consumer) {
|
||||||
* List of names of online staff
|
getPlayers().forEach(consumer);
|
||||||
* @return list of staff
|
}
|
||||||
*/
|
|
||||||
public static Set<Player> getStaff() {
|
public static void forEachStaff(Consumer<Player> consumer) {
|
||||||
Set<Player> list = new HashSet<>();
|
getStaff().forEach(consumer);
|
||||||
Bukkit.getOnlinePlayers().forEach(p -> {
|
}
|
||||||
if (p.isOp()) list.add(p);
|
|
||||||
|
public static void dmEachPlayer(Predicate<Player> condition, String dm) {
|
||||||
|
forEachPlayer(p -> {
|
||||||
|
if (condition.test(p)) p.sendMessage(dm);
|
||||||
});
|
});
|
||||||
return list;
|
}
|
||||||
|
|
||||||
|
public static void dmEachPlayer(String dm) {
|
||||||
|
forEachPlayer(p -> p.sendMessage(dm));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void forEachSpecified(Iterable<Player> players, Consumer<Player> consumer) {
|
||||||
|
players.forEach(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void forEachSpecified(Consumer<Player> consumer, Player... players) {
|
||||||
|
Arrays.stream(players).forEach(consumer);
|
||||||
|
}
|
||||||
|
public static void forEachPlayerRun(Predicate<Player> condition, Consumer<Player> task) {
|
||||||
|
forEachPlayer(p -> {
|
||||||
|
if (condition.test(p)) {
|
||||||
|
task.accept(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
public static void sendActionBar(Player p, String msg) {
|
||||||
|
p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasBlockBelow(Player player, Material material) {
|
||||||
|
for (int y = player.getLocation().getBlockY() - 1; y >= player.getLocation().getBlockY() - 12; y--) {
|
||||||
|
if (player.getWorld().getBlockAt(player.getLocation().getBlockX(), y, player.getLocation().getBlockZ()).getType() == material) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,58 @@ package io.github.thetrouper.sentinel.server.util;
|
|||||||
|
|
||||||
|
|
||||||
import io.github.thetrouper.sentinel.Sentinel;
|
import io.github.thetrouper.sentinel.Sentinel;
|
||||||
|
import io.github.thetrouper.sentinel.data.Config;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
public class TextUtils {
|
public class TextUtils {
|
||||||
|
public static String color(String s) {
|
||||||
|
return s.replaceAll("&","§");
|
||||||
|
}
|
||||||
public static String prefix(String text) {
|
public static String prefix(String text) {
|
||||||
String prefix = Sentinel.prefix;
|
String prefix = Sentinel.prefix;
|
||||||
return prefix + text;
|
return prefix + text;
|
||||||
}
|
}
|
||||||
|
public static String replaceRepeatingLetters(String message) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
char prevChar = '\0';
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (char c : message.toCharArray()) {
|
||||||
|
if (c == prevChar) {
|
||||||
|
count++;
|
||||||
|
if (count <= 3) {
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
prevChar = c;
|
||||||
|
count = 1;
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
public static String fromLeetString(String s) {
|
||||||
|
Map<String, String> dictionary = Config.leetPatterns;
|
||||||
|
String msg = s;
|
||||||
|
|
||||||
|
for (String key : dictionary.keySet()) {
|
||||||
|
if (!s.contains(key)) continue;
|
||||||
|
try {
|
||||||
|
if (key.equals("$")) {
|
||||||
|
msg = msg.replaceAll("\\$", "s");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg = msg.replaceAll(key, dictionary.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (PatternSyntaxException ex) {
|
||||||
|
String regex = "[" + key + "]";
|
||||||
|
msg = msg.replaceAll(regex, dictionary.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,39 +11,73 @@
|
|||||||
# Be sure to check out their amazing discord bot!
|
# Be sure to check out their amazing discord bot!
|
||||||
config :
|
config :
|
||||||
plugin:
|
plugin:
|
||||||
# -------------------------------
|
# --------------------------------
|
||||||
# Important Setup (Do this first)
|
# Anti-Nuke Setup (Do this first)
|
||||||
# -------------------------------
|
# --------------------------------
|
||||||
prefix: "§d§lSentinel §8» §7" # Prefix of the plugin. Line below is the discord webhook for logs to be sent to
|
prefix: "§d§lSentinel §8» §7" # Prefix of the plugin. Line below is the discord webhook for logs to be sent to
|
||||||
webhook: "https://discord.com/api/webhooks/1124908469842096211/7NGOeFvtmxQ4n0_hSvbqhZUjnzRHIicLpHKETYU92n9JaLUPPsueBSn7w4wUfAnhjlLF"
|
webhook: "https://discord.com/api/webhooks/1124908469842096211/7NGOeFvtmxQ4n0_hSvbqhZUjnzRHIicLpHKETYU92n9JaLUPPsueBSn7w4wUfAnhjlLF"
|
||||||
trusted: # List the UUIDs of players who are trusted, will bypass the plugin and be immune to logs and are able to re-op themeselves
|
trusted: # List the UUIDs of players who are trusted, will bypass the plugin and be immune to logs and are able to re-op themeselves
|
||||||
- "049460f7-21cb-42f5-8059-d42752bf406f" # obvWolf
|
- "049460f7-21cb-42f5-8059-d42752bf406f" # obvWolf
|
||||||
block-specific: true # Defaulted true | Weather or not to block ALL plugin specific commands from non-trusted members (EX: minecraft:ban) these will not be logged.
|
block-specific: true # Defaulted true | Weather or not to block ALL plugin specific commands from non-trusted members (EX: minecraft:ban) these will not be logged.
|
||||||
prevent-nbt: true # Defaulted true | Should NBT items be blocked from the creative hotbar
|
prevent-nbt: true # Defaulted true | Should NBT items be blocked from the creative hotbar
|
||||||
log-nbt: true # Defaulted true | Should items and their NBT's be logged
|
|
||||||
prevent-cmdblocks: true # Defaulted true | Should all command block actions be blocked
|
prevent-cmdblocks: true # Defaulted true | Should all command block actions be blocked
|
||||||
log-cmdblocks: true # Defaulted true | Log attempts of command-block place-ery
|
|
||||||
dangerous: # These commands can only be run by "trusted" users
|
dangerous: # These commands can only be run by "trusted" users
|
||||||
- "op"
|
- "op"
|
||||||
- "deop"
|
- "deop"
|
||||||
- "stop"
|
- "stop"
|
||||||
- "execute"
|
- "execute"
|
||||||
- "sudo"
|
- "sudo"
|
||||||
- ""
|
|
||||||
log-dangerous: true # Default true | Weather or not to log when a dangerous command is executed
|
log-dangerous: true # Default true | Weather or not to log when a dangerous command is executed
|
||||||
|
log-cmdblocks: true # Defaulted true | Log attempts of command-block place-ery
|
||||||
|
log-nbt: true # Defaulted true | Should items and their NBT's be logged
|
||||||
logged: # Commands that will always be logged when executed.
|
logged: # Commands that will always be logged when executed.
|
||||||
- "gamemode"
|
- "gamemode"
|
||||||
- "give"
|
- "give"
|
||||||
deop: true # Defaulted true | This will remove an untrusted player's operator permissions whenever they attempt dangerous actions
|
deop: true # Defaulted true | This will remove an untrusted player's operator permissions whenever they attempt dangerous actions
|
||||||
ban: false # Defaulted false | This will ban a player when they attempt dangerous actions
|
ban: false
|
||||||
|
nbt-punish: false # Defaulted false | This will ban a player when they attempt to use an NBT item
|
||||||
|
cmdblock-punish: false # Defaulted false | This will ban a player when they attempt to use a command block
|
||||||
|
command-punish: true # Defaulted true | This will ban a player when they attempt to use a dangerous command
|
||||||
reop-command: false # Defaulted false | This enables the command allowing trusted players to op themselves if they get deoped.
|
reop-command: false # Defaulted false | This enables the command allowing trusted players to op themselves if they get deoped.
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
# Chat Filter Setup & AntiSpam
|
# Chat Filter Setup & AntiSpam
|
||||||
# -------------------------------
|
# -------------------------------
|
||||||
chat:
|
chat:
|
||||||
|
anti-unicode: true # Default true | Prevents all non A-Z 0-9 + specials from being sent in chat
|
||||||
|
anti-spam:
|
||||||
# AntiSpam Heat system
|
# AntiSpam Heat system
|
||||||
anti-spam: true # Default true | Enables the anti-spam
|
enabled: true # Default true | Enables/disables the entire anti-spam
|
||||||
default-gain: 1 # Heat gained as base for every message
|
default-gain: 1 # Default 1 | Heat gained as base for every message
|
||||||
medium-gain: 3 # Heat gained when your message is 50% similar
|
low-gain: 2 # Default 2 | Heat gained when message is >25% similar
|
||||||
high-gain: 6 # Heat gained for
|
medium-gain: 4 # Default 4 | Heat gained when message is >50% similar
|
||||||
max-heat: 15 # Highest value of heat a player can reach
|
high-gain: 6 # Default 6 | Heat gained for >90% similarity
|
||||||
|
heat-decay: 1 # Default 1 | Heat lost every second
|
||||||
|
block-heat: 10 # Default 10 | The heat required to block the message
|
||||||
|
punish-heat: 15 # Default 15 | The heat required to punish the player
|
||||||
|
punish-command: "mute %player% 1m Please refrain from spamming!" # (Use %player% for the player's name placeholder)
|
||||||
|
log-spam: true # Default true | logs spam punishments to the webhook
|
||||||
|
anti-swear:
|
||||||
|
enabled: true # Default true | Enables/disables the entire anti-swear
|
||||||
|
low-score: 0 # Default 0 | How much score should you gain for not attempting a bypass
|
||||||
|
medium-low-score: 0 # Default 0 | How much score should you gain for "bad "bypass attempt
|
||||||
|
medium-score: 1 # Default 1 | How much score should you gain for "ok" bypass attempt
|
||||||
|
medium-high-score: 3 # Default 3 | How much score should you gain for "good" bypass attempt
|
||||||
|
high-score: 5 # Default 5 | How much score should be gained for "extreme" attempt to bypass
|
||||||
|
punish-score: 20 # Default 20 | how much score is required to get punished
|
||||||
|
slur-insta-punish: true # Default true | Should players get insta punished for any words on the "slurs" list?
|
||||||
|
punish-command: "mute %player% 15m Please refrain from excessive use of profanity!"
|
||||||
|
slur-command: "mute %player% 1h Discriminatory speech is not tolerated on this server!"
|
||||||
|
log-swear: true # Default true | Logs swear punishments to the webhook
|
||||||
|
whitelisted: # List known false positives here
|
||||||
|
- glass
|
||||||
|
blacklisted: # list all the swears you wish to blacklist here
|
||||||
|
- ass
|
||||||
|
slurs: # List slurs here that you wish to insta-punish for attempting
|
||||||
|
- nigg
|
||||||
|
leet-patterns:
|
||||||
|
'0': o
|
||||||
|
'1': i
|
||||||
|
'3': e
|
||||||
|
'4': a
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,29 @@ permissions:
|
|||||||
sentinel.info:
|
sentinel.info:
|
||||||
description: Permission to view sentinel info
|
description: Permission to view sentinel info
|
||||||
default: op
|
default: op
|
||||||
|
sentinel.staff:
|
||||||
|
description: Receive anti-swear and anti-spam warnings
|
||||||
|
default: op
|
||||||
|
sentinel.chat.antiswear.flags:
|
||||||
|
description: See antiSwear flags
|
||||||
|
default: op
|
||||||
|
sentinel.chat.antiswear.bypass:
|
||||||
|
description: Bypass the antiSwear
|
||||||
|
default: op
|
||||||
|
sentinel.chat.antispam.flags:
|
||||||
|
description: See antispam flags
|
||||||
|
default: op
|
||||||
|
sentinel.chat.antispam.bypass:
|
||||||
|
description: Bypass the antispam
|
||||||
|
default: op
|
||||||
|
sentinel.chat.*:
|
||||||
|
description: bypass all chat rules and see all flags
|
||||||
|
default: op
|
||||||
|
children:
|
||||||
|
sentinel.chat.antiswear.flags: true
|
||||||
|
sentinel.chat.antiswear.bypass: true
|
||||||
|
sentinel.chat.antispam.flags: true
|
||||||
|
sentinel.chat.antispam.bypass: true
|
||||||
commands:
|
commands:
|
||||||
sentinel:
|
sentinel:
|
||||||
description: An info command.
|
description: An info command.
|
||||||
|
|||||||
Reference in New Issue
Block a user