package com.minebans.minebansantispam.checks; import java.util.Collections; import java.util.Map.Entry; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import uk.co.jacekk.bukkit.baseplugin.scheduler.BaseTask; import uk.co.jacekk.bukkit.baseplugin.util.ListUtils; import com.minebans.minebansantispam.MineBansAntiSpam; import com.minebans.minebansantispam.data.PlayerData; import com.minebans.minebansantispam.events.PlayerSpamDetectedEvent; public class PlayerDataChecker extends BaseTask<MineBansAntiSpam> { public PlayerDataChecker(MineBansAntiSpam plugin){ super(plugin); } private boolean isLoginSpammer(PlayerData playerData){ if (playerData.loginCount >= 4){ return true; } if (playerData.loginDelays.size() < 2){ return false; } if (Collections.min(playerData.loginDelays) < 140){ return true; } return (ListUtils.stddev(playerData.loginDelays) < 25); } private boolean isLogoutSpammer(PlayerData playerData){ if (playerData.logoutCount >= 4){ return true; } if (playerData.logoutDelays.size() < 2){ return false; } if (Collections.min(playerData.logoutDelays) < 140){ return true; } return (ListUtils.stddev(playerData.logoutDelays) < 25); } private boolean isChatSpamer(PlayerData playerData){ if (playerData.messageCount >= 8){ return true; } if (playerData.messageDelays.size() < 2){ return false; } if (Collections.min(playerData.messageDelays) < 100){ return true; } return (ListUtils.stddev(playerData.messageDelays) < 20); } public void run(){ String playerName; PlayerData playerData; for (Entry<String, PlayerData> entry : plugin.dataManager.getAll()){ playerName = entry.getKey(); playerData = entry.getValue(); if (this.isChatSpamer(playerData) || this.isLoginSpammer(playerData) || this.isLogoutSpammer(playerData)){ PlayerSpamDetectedEvent event = new PlayerSpamDetectedEvent(playerName); plugin.pluginManager.callEvent(event); if (!event.isHandled()){ if (playerData.warningCount > 3){ plugin.server.dispatchCommand(plugin.server.getConsoleSender(), "ban " + playerName + " 1h"); plugin.dataManager.unregisterPlayer(playerName); plugin.server.broadcastMessage(plugin.formatMessage(ChatColor.GREEN + playerName + " has been banned for spamming.")); }else{ ++playerData.warningCount; Player player = plugin.server.getPlayer(playerName); if (player != null){ player.sendMessage(plugin.formatMessage(ChatColor.RED + "You have received a warning for spamming.")); player.sendMessage(plugin.formatMessage(ChatColor.RED + "More than 3 of these will result in a 1 hour ban.")); } playerData.resetCounters(); playerData.resetDelays(); } } }else{ playerData.resetCounters(); } } } }