From cd85562e40bd44d40f4be5fa1660a4b746aa8dda Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Mon, 29 Sep 2014 15:36:51 -0700 Subject: [PATCH] Fix for human-controlled bot spam. Mutes/bans bots used by a human player to send lots of identical messages using different accounts while varying the message and limiting message speed to work around anti-spam measures. --- .../GriefPrevention/FlatFileDataStore.java | 2 +- .../GriefPrevention/PlayerEventHandler.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/me/ryanhamshire/GriefPrevention/FlatFileDataStore.java b/src/me/ryanhamshire/GriefPrevention/FlatFileDataStore.java index db84b68..26db535 100644 --- a/src/me/ryanhamshire/GriefPrevention/FlatFileDataStore.java +++ b/src/me/ryanhamshire/GriefPrevention/FlatFileDataStore.java @@ -211,7 +211,7 @@ public class FlatFileDataStore extends DataStore } catch(Exception ex) { - GriefPrevention.AddLogEntry("Failed to look up UUID for player " + ownerName + "."); + GriefPrevention.AddLogEntry("Error - this is not a valid UUID: " + ownerName + "."); GriefPrevention.AddLogEntry(" Converted land claim to administrative @ " + lesserBoundaryCorner.toString()); } } diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index 3e1a436..c62aeb6 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -93,6 +93,12 @@ class PlayerEventHandler implements Listener event.setCancelled(this.handlePlayerChat(player, message, event)); } + //last chat message shown, regardless of who sent it + private String lastChatMessage = ""; + + //number of identical messages in a row + private int duplicateMessageCount = 0; + //returns true if the message should be sent, false if it should be muted private boolean handlePlayerChat(Player player, String message, PlayerEvent event) { @@ -144,6 +150,19 @@ class PlayerEventHandler implements Listener } } + //always mute an exact match to the last chat message + if(message.equals(this.lastChatMessage)) + { + playerData.spamCount += ++this.duplicateMessageCount; + spam = true; + muted = true; + } + else + { + this.lastChatMessage = message; + this.duplicateMessageCount = 0; + } + //where other types of spam are concerned, casing isn't significant message = message.toLowerCase();