diff options
Diffstat (limited to 'EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/chat/SpamCheck.java')
-rw-r--r-- | EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/chat/SpamCheck.java | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/chat/SpamCheck.java b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/chat/SpamCheck.java new file mode 100644 index 000000000..8bf893091 --- /dev/null +++ b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/chat/SpamCheck.java @@ -0,0 +1,96 @@ +package com.earth2me.essentials.anticheat.checks.chat; + +import com.earth2me.essentials.anticheat.NoCheat; +import com.earth2me.essentials.anticheat.NoCheatPlayer; +import com.earth2me.essentials.anticheat.actions.ParameterName; +import com.earth2me.essentials.anticheat.data.Statistics.Id; +import java.util.Locale; + + +/** + * The SpamCheck will count messages and commands over a short timeframe to see if the player tried to send too many of + * them + * + */ +public class SpamCheck extends ChatCheck +{ + public SpamCheck(NoCheat plugin) + { + super(plugin, "chat.spam"); + } + + public boolean check(NoCheatPlayer player, ChatData data, ChatConfig cc) + { + + boolean cancel = false; + // Maybe it's a command and on the whitelist + for (String s : cc.spamWhitelist) + { + if (data.message.startsWith(s)) + { + // It is + return false; + } + } + + int commandLimit = cc.spamCommandLimit; + int messageLimit = cc.spamMessageLimit; + long timeframe = cc.spamTimeframe; + + final long time = System.currentTimeMillis(); + + // Has enough time passed? Then reset the counters + if (data.spamLastTime + timeframe <= time) + { + data.spamLastTime = time; + data.messageCount = 0; + data.commandCount = 0; + } + // Security check, if the system time changes + else if (data.spamLastTime > time) + { + data.spamLastTime = Integer.MIN_VALUE; + } + + // Increment appropriate counter + if (data.message.startsWith("/")) + { + data.commandCount++; + } + else + { + data.messageCount++; + } + + // Did the player go over the limit on at least one of the counters? + if (data.messageCount > messageLimit || data.commandCount > commandLimit) + { + + // Set the vl as the number of messages above the limit and + // increment statistics + data.spamVL = Math.max(0, data.messageCount - messageLimit); + data.spamVL += Math.max(0, data.commandCount - commandLimit); + incrementStatistics(player, Id.CHAT_SPAM, 1); + + // Execute whatever actions are associated with this check and the + // violation level and find out if we should cancel the event + cancel = executeActions(player, cc.spamActions, data.spamVL); + } + + return cancel; + } + + @Override + public String getParameter(ParameterName wildcard, NoCheatPlayer player) + { + + if (wildcard == ParameterName.VIOLATIONS) + { + return String.format(Locale.US, "%d", getData(player).spamVL); + } + else + { + return super.getParameter(wildcard, player); + } + } +} |