From 31b3f65a72a78efd5fa5c199d6d30026f13154d7 Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:01:08 -0400 Subject: [PATCH 1/7] punctuation changes --- .../chatguard/core/security/filter/FilterFinalizer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/filter/FilterFinalizer.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/filter/FilterFinalizer.java index a1e687b..37f6f59 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/filter/FilterFinalizer.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/filter/FilterFinalizer.java @@ -32,10 +32,10 @@ public static void finalizeActions(LogType logType, Player player, String conten final String flaggedSection = trigger.getSection(); player.sendMessage(ColorUtil.translateColorCodes( - String.format("&cYour message contains the flagged word: '%s'.", badWord) + String.format("&cYour message contains the flagged word: '%s'", badWord) )); player.sendMessage(ColorUtil.translateColorCodes( - String.format("&cSection flagged: '%s'.", flaggedSection) + String.format("&cSection flagged: '%s'", flaggedSection) )); } From 7900c0d0bee50de97ec6216fd985104e4cfab3af Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:01:18 -0400 Subject: [PATCH 2/7] add my name to the credits --- .../chatguard/command/subcommand/AboutCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/AboutCommand.java b/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/AboutCommand.java index 1af79b7..db4c093 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/AboutCommand.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/AboutCommand.java @@ -21,7 +21,7 @@ public AboutCommand(ChatGuard plugin) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { // Contributors: If you've contributed code, you can add your name here to be credited. List contributors = Arrays.asList( - "moderator_man", "zavdav" + "moderator_man", "zavdav", "RitzKid76" ); AboutUtil.aboutPlugin(sender, plugin, contributors); return true; From 5a047cab9c719f76d7f12d9c4a8e93f6944eb04b Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:01:49 -0400 Subject: [PATCH 3/7] strike decay feedback this tells the player how many strike points they have remaining, and how many were decayed --- .../security/penalty/PenaltyEnforcer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java index ffc5f3c..20d0b99 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java @@ -77,20 +77,33 @@ public static void updatePlayerStrikes(Player player) { if(!FilterConfig.getStrikeDecayEnabled()) return; + + final int playerStrikeCount = PenaltyConfig.getPlayerStrike(player); + if(playerStrikeCount <= 0) + return; // player has no strikes + final long lastMuteTime = PenaltyConfig.getLastMuteTime(player); - if(lastMuteTime == -1) // player has no strikes - return; final long timePassed = System.currentTimeMillis() - lastMuteTime; final long decayPeriod = FilterConfig.getStrikeDecayPeriod(); - final int strikesToRevoke = (int) (timePassed / decayPeriod); + final int strikesToRevoke = Math.min( + (int) (timePassed / decayPeriod), + playerStrikeCount + ); // this is only really done to prevent longer decay times than would normally happen under the config final long totalRevokePeriod = strikesToRevoke * decayPeriod; final long newPlayerUpdatedTime = lastMuteTime + totalRevokePeriod; PenaltyConfig.decrementPlayerStrike(player, strikesToRevoke, newPlayerUpdatedTime); + + String pointsString = "point"; + if(strikesToRevoke != 1) + pointsString += "s"; + + final String coloredMessage = ColorUtil.translateColorCodes(String.format("&aYour ChatGuard strike count has been reduced by %d %s! You have %d remaining", strikesToRevoke, pointsString, playerStrikeCount - strikesToRevoke)); + player.sendMessage(coloredMessage); } public static void handleWarning(Player player) { From e91e79300eff3cdc9ed8ba11e8f70f7a0b6ac96d Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:13:04 -0400 Subject: [PATCH 4/7] update function name for consistency --- .../command/subcommand/StrikeCommand.java | 2 +- .../chatguard/core/config/PenaltyConfig.java | 18 +++++++++--------- .../chatguard/core/log/embed/ChatEmbed.java | 2 +- .../chatguard/core/log/embed/SignEmbed.java | 2 +- .../core/security/spam/ChatRateLimiter.java | 2 +- .../core/security/spam/CommandRateLimiter.java | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/StrikeCommand.java b/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/StrikeCommand.java index 8d7dc97..e42385d 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/StrikeCommand.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/command/subcommand/StrikeCommand.java @@ -29,7 +29,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St .filter(key -> key.equalsIgnoreCase(playerName)) .findFirst() .orElse(null); - int playerStrikeTier = foundKey != null ? PenaltyConfig.getPlayerStrike(foundKey) : -1; + int playerStrikeTier = foundKey != null ? PenaltyConfig.getPlayerStrikes(foundKey) : -1; if (foundKey == null) { sender.sendMessage(ColorUtil.translateColorCodes(String.format( diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java index 5dd6079..3cfb749 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java @@ -15,11 +15,11 @@ public static List getStrikesKeys() { return ChatGuard.getStrikes().getKeys(); } - public static int getPlayerStrike(Player player) { - return getPlayerStrike(player.getName()); + public static int getPlayerStrikes(Player player) { + return getPlayerStrikes(player.getName()); } - public static int getPlayerStrike(String playerName) { + public static int getPlayerStrikes(String playerName) { return ChatGuard.getStrikes().getInt(playerName + ".strikes", 0); } @@ -31,23 +31,23 @@ public static int getPlayerWarnings(String playerName) { return ChatGuard.getStrikes().getInt(playerName + ".warnings", 0); } - public static void setPlayerStrike(Player player, int newStrike) { + public static void setPlayerStrikes(Player player, int newStrike) { setPlayerStrike(player.getName(), newStrike); } public static void decrementPlayerStrike(Player player, int amount, long updateTime) { - setPlayerStrike(player.getName(), getPlayerStrike(player) - amount, updateTime); + setPlayerStrikes(player.getName(), getPlayerStrikes(player) - amount, updateTime); } public static void incrementPlayerStrike(Player player, int amount) { - setPlayerStrike(player, getPlayerStrike(player) + amount); + setPlayerStrikes(player, getPlayerStrikes(player) + amount); } public static void setPlayerStrike(String playerName, int newStrike) { - setPlayerStrike(playerName, newStrike, System.currentTimeMillis()); + setPlayerStrikes(playerName, newStrike, System.currentTimeMillis()); } - public static void setPlayerStrike(String playerName, int newStrike, long updateTime) { + public static void setPlayerStrikes(String playerName, int newStrike, long updateTime) { ConfigUtil strikes = ChatGuard.getStrikes(); newStrike = Math.max(newStrike, 0); @@ -78,7 +78,7 @@ public static String getAutoMuteDuration(Player player) { final List penalties = FilterConfig.getAutoMuteDurations(); final int maxPenalty = penalties.size() - 1; - int playerPenalty = getPlayerStrike(player); + int playerPenalty = getPlayerStrikes(player); if (playerPenalty > maxPenalty) return penalties.get(maxPenalty); diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/ChatEmbed.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/ChatEmbed.java index 7cfb444..49b2fdb 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/ChatEmbed.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/ChatEmbed.java @@ -33,7 +33,7 @@ protected void setupEmbedDetails() { else { embed.setDescription(String.format( "Strike: %d - Mute Duration: %s", - PenaltyConfig.getPlayerStrike(player) + severity, + PenaltyConfig.getPlayerStrikes(player) + severity, PenaltyConfig.getAutoMuteDuration(player) )); } diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/SignEmbed.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/SignEmbed.java index d56bd6e..5a635c6 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/SignEmbed.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/log/embed/SignEmbed.java @@ -24,7 +24,7 @@ public SignEmbed(JavaPlugin plugin, Player player, String content, String trigge protected void setupEmbedDetails() { embed.setDescription(String.format( "Strike: %d", - PenaltyConfig.getPlayerStrike(player) + 1 + PenaltyConfig.getPlayerStrikes(player) + 1 )); embed.setTitle("Sign Filter") diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/ChatRateLimiter.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/ChatRateLimiter.java index a1e91b4..b64a79b 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/ChatRateLimiter.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/ChatRateLimiter.java @@ -18,7 +18,7 @@ public static boolean isPlayerChatSpamming(Player player) { if (lastTimestamp != 0) { long elapsed = timestamp - lastTimestamp; - int cooldown = SpamPreventionConfig.getCooldownMsChat().get(PenaltyConfig.getPlayerStrike(player)); + int cooldown = SpamPreventionConfig.getCooldownMsChat().get(PenaltyConfig.getPlayerStrikes(player)); if (elapsed <= cooldown) { if (SpamPreventionConfig.getWarnPlayerEnabled()) { diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/CommandRateLimiter.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/CommandRateLimiter.java index 484986a..fcac8c6 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/CommandRateLimiter.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/spam/CommandRateLimiter.java @@ -23,7 +23,7 @@ public static boolean isPlayerCommandSpamming(Player player, String message) { if (lastTimestamp != 0) { long elapsed = timestamp - lastTimestamp; - int cooldown = SpamPreventionConfig.getCooldownMsCommand().get(PenaltyConfig.getPlayerStrike(player)); + int cooldown = SpamPreventionConfig.getCooldownMsCommand().get(PenaltyConfig.getPlayerStrikes(player)); if (elapsed <= cooldown) { if (SpamPreventionConfig.getWarnPlayerEnabled()) { From e3c9633f888effd871f4bc644231832a59de2187 Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:22:46 -0400 Subject: [PATCH 5/7] add warning decay --- .../chatguard/core/config/FilterConfig.java | 16 +++++++ .../chatguard/core/config/PenaltyConfig.java | 41 ++++++++++++++++-- .../security/penalty/PenaltyEnforcer.java | 42 ++++++++++++++++--- src/main/resources/config.yml | 3 ++ 4 files changed, 94 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/FilterConfig.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/FilterConfig.java index 96855d2..a86787a 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/FilterConfig.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/FilterConfig.java @@ -45,6 +45,10 @@ public static boolean getStrikeDecayEnabled() { return ChatGuard.getConfig().getBoolean("filter.auto-mute.strike-decay.enabled", true); } + public static boolean getWarningDecayEnabled() { + return ChatGuard.getConfig().getBoolean("filter.auto-mute.warning-decay.enabled", true); + } + public static long getStrikeDecayPeriod() { final String configString = ChatGuard.getConfig().getString("filter.auto-mute.strike-decay.period"); @@ -57,6 +61,18 @@ public static long getStrikeDecayPeriod() { } } + public static long getWarningDecayPeriod() { + final String configString = ChatGuard.getConfig().getString("filter.auto-mute.warning-decay.period"); + + try { + final long futureTime = TimeFormatter.parseDateDiff(configString, true); + + return futureTime - System.currentTimeMillis(); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + public static int getWarningcount() { return ChatGuard.getConfig().getInt("filter.auto-mute.warnings.warning-count", 0); } diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java index 3cfb749..cc326b3 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java @@ -56,12 +56,16 @@ public static void setPlayerStrikes(String playerName, int newStrike, long updat strikes.removeProperty(playerName); else { strikes.setProperty(playerName + ".strikes", newStrike); - strikes.setProperty(playerName + ".updated", updateTime); + strikes.setProperty(playerName + ".muteUpdated", updateTime); } ChatGuard.getStrikes().save(); } + public static void decrementPlayerWarning(Player player, int amount, long updateTime) { + setPlayerWarnings(player.getName(), amount, updateTime); + } + public static void incrementPlayerWarnings(Player player) { setPlayerWarnings(player, getPlayerWarnings(player) + 1); } @@ -71,7 +75,22 @@ public static void setPlayerWarnings(Player player, int warnings) { } public static void setPlayerWarnings(String playerName, int warnings) { - ChatGuard.getStrikes().setProperty(playerName + ".warnings", warnings); + setPlayerWarnings(playerName, warnings, System.currentTimeMillis()); + } + + public static void setPlayerWarnings(String playerName, int newWarning, long updateTime) { + ConfigUtil strikes = ChatGuard.getStrikes(); + + newWarning = Math.max(newWarning, 0); + + if(newWarning == 0 && getPlayerWarnings(playerName) <= 0) + strikes.removeProperty(playerName); + else { + strikes.setProperty(playerName + ".warnings", newWarning); + strikes.setProperty(playerName + ".warnUpdated", updateTime); + } + + ChatGuard.getStrikes().save(); } public static String getAutoMuteDuration(Player player) { @@ -91,7 +110,23 @@ public static long getLastMuteTime(Player player) { } public static long getLastMuteTime(String playerName) { - final String lastUpdatedString = ChatGuard.getStrikes().getString(playerName + ".updated"); + final String lastUpdatedString = ChatGuard.getStrikes().getString(playerName + ".muteUpdated"); + if(lastUpdatedString == null) + return -1; + + try { + return Long.parseLong(lastUpdatedString); + } catch (NumberFormatException e) { + throw new RuntimeException(e); + } + } + + public static long getLastWarnTime(Player player) { + return getLastWarnTime(player.getName()); + } + + public static long getLastWarnTime(String playerName) { + final String lastUpdatedString = ChatGuard.getStrikes().getString(playerName + ".warnUpdated"); if(lastUpdatedString == null) return -1; diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java index 20d0b99..20a4ee2 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/security/penalty/PenaltyEnforcer.java @@ -73,12 +73,15 @@ public static IMuteHandler getMuteHandler() { return muteHandler; } - public static void updatePlayerStrikes(Player player) { - if(!FilterConfig.getStrikeDecayEnabled()) - return; + public static void updatePlayerData(Player player) { + if(FilterConfig.getStrikeDecayEnabled()) + updatePlayerStrikes(player); + if(FilterConfig.getWarningDecayEnabled()) + updatePlayerWarnings(player); + } - - final int playerStrikeCount = PenaltyConfig.getPlayerStrike(player); + private static void updatePlayerStrikes(Player player) { + final int playerStrikeCount = PenaltyConfig.getPlayerStrikes(player); if(playerStrikeCount <= 0) return; // player has no strikes @@ -106,6 +109,35 @@ public static void updatePlayerStrikes(Player player) { player.sendMessage(coloredMessage); } + private static void updatePlayerWarnings(Player player) { + final int playerWarningCount = PenaltyConfig.getPlayerWarnings(player); + if(playerWarningCount <= 0) + return; // player has no warnings + + final long lastWarnTime = PenaltyConfig.getLastWarnTime(player); + + final long timePassed = System.currentTimeMillis() - lastWarnTime; + final long decayPeriod = FilterConfig.getWarningDecayPeriod(); + + final int warningsToRevoke = Math.min( + (int) (timePassed / decayPeriod), + playerWarningCount + ); + + // this is only really done to prevent longer decay times than would normally happen under the config + final long totalRevokePeriod = warningsToRevoke * decayPeriod; + final long newPlayerUpdatedTime = lastWarnTime + totalRevokePeriod; + + PenaltyConfig.decrementPlayerWarning(player, warningsToRevoke, newPlayerUpdatedTime); + + String pointsString = "point"; + if(warningsToRevoke != 1) + pointsString += "s"; + + final String coloredMessage = ColorUtil.translateColorCodes(String.format("&aYour ChatGuard warning count has been reduced by %d %s! You have %d remaining", warningsToRevoke, pointsString, playerWarningCount - warningsToRevoke)); + player.sendMessage(coloredMessage); + } + public static void handleWarning(Player player) { PenaltyConfig.incrementPlayerWarnings(player); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4a1d2b7..75a325d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -51,6 +51,9 @@ filter: strike-decay: enabled: true period: 1w + warning-decay: + enabled: true + period: 2w warnings: warning-count: 3 severity-bypass-threshold: 3 From 8be52125af04d40a11a298dfa39515a827b35ed2 Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:24:06 -0400 Subject: [PATCH 6/7] forgot to use new updater function --- .../chatguard/listener/player/PlayerJoinListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/listener/player/PlayerJoinListener.java b/src/main/java/io/github/aleksandarharalanov/chatguard/listener/player/PlayerJoinListener.java index eb1de18..f68901c 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/listener/player/PlayerJoinListener.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/listener/player/PlayerJoinListener.java @@ -20,6 +20,6 @@ public void onPlayerJoin(PlayerJoinEvent event) { return; } - PenaltyEnforcer.updatePlayerStrikes(player); + PenaltyEnforcer.updatePlayerData(player); } } From ff61ba2abc264abe631acd6b0efc11109957f1c4 Mon Sep 17 00:00:00 2001 From: RitzKid76 Date: Sat, 12 Apr 2025 21:28:06 -0400 Subject: [PATCH 7/7] fix bug with warning decrementing --- .../chatguard/core/config/PenaltyConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java index cc326b3..7beab3b 100644 --- a/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java +++ b/src/main/java/io/github/aleksandarharalanov/chatguard/core/config/PenaltyConfig.java @@ -63,7 +63,7 @@ public static void setPlayerStrikes(String playerName, int newStrike, long updat } public static void decrementPlayerWarning(Player player, int amount, long updateTime) { - setPlayerWarnings(player.getName(), amount, updateTime); + setPlayerWarnings(player.getName(), getPlayerWarnings(player) - amount, updateTime); } public static void incrementPlayerWarnings(Player player) { @@ -83,7 +83,7 @@ public static void setPlayerWarnings(String playerName, int newWarning, long upd newWarning = Math.max(newWarning, 0); - if(newWarning == 0 && getPlayerWarnings(playerName) <= 0) + if(newWarning == 0 && getPlayerStrikes(playerName) <= 0) strikes.removeProperty(playerName); else { strikes.setProperty(playerName + ".warnings", newWarning);