package net.shockverse.survivalgames.extras; import java.util.ArrayList; import java.util.List; import net.shockverse.survivalgames.SurvivalGames; import org.bukkit.entity.Player; public class AntiPlayerSpam { public class PlayerMessager { public Player player; public List<PlayerMessage> messages; public PlayerMessager(Player p) { player = p; messages = new ArrayList<PlayerMessage>(); } public PlayerMessage getMessage(String message) { for (int i = 0; i < messages.size(); i++) { PlayerMessage msg = messages.get(i); if (msg.message.equals(message)) { return msg; } } return null; } public boolean hasMessage(String message) { for (int i = 0; i < messages.size(); i++) { PlayerMessage msg = messages.get(i); if (msg.message.equals(message)) { if (msg.expire >= 0 && System.currentTimeMillis() - msg.time >= msg.expire) { messages.remove(i); return false; } return true; } } return false; } } public class PlayerMessage { public String message; public long time; public int expire; public PlayerMessage(String message, long time, int expire) { this.message = message; this.time = time; this.expire = expire; } } private SurvivalGames plugin; private List<PlayerMessager> playerMessagers; public AntiPlayerSpam(SurvivalGames instance) { plugin = instance; playerMessagers = new ArrayList<PlayerMessager>(); } /** * Checks whether it is OK or not to send a message to the player again. * @param player The player to check. * @param message The message to check. * * Note this will check the message exactly. This class is meant to only stop message output from the plugin. */ public boolean canSendMessage(Player player, String message) { for (PlayerMessager msgs : playerMessagers) { if (msgs.player == player || msgs.player.equals(player)) { return !msgs.hasMessage(message); } } return true; } /** * Blocks a message from being sent to the player until it expires. * @param player The player to block incoming messages. * @param message The message to block. * @param expire The amount of time before the message blocking expires. * * * Note that this will not block messages that are send without checking first. */ public void blockMessage(Player player, String message, int expire) { boolean found = false; for (PlayerMessager msgs : playerMessagers) { if (msgs.player == player || msgs.player.equals(player)) { PlayerMessage msg = msgs.getMessage(message); if (msg != null) { msg.time = System.currentTimeMillis(); msg.expire = expire; } else { msgs.messages.add(new PlayerMessage(message, System.currentTimeMillis(), expire)); } found = true; } } if (!found) { PlayerMessager messager = new PlayerMessager(player); messager.messages.add(new PlayerMessage(message, System.currentTimeMillis(), expire)); playerMessagers.add(messager); } } /** * Sends a message to a player and blocks it at the same time. * @param player The player * @param message The message to block * @param expire The time in milliseconds */ public void sendMessage(Player player, String message, int expire) { if (canSendMessage(player, message)) { player.sendMessage(message); blockMessage(player, message, expire); } } /** * Unblocks messages for a player. * @param player The player. */ public void unblockMessages(Player player) { for (PlayerMessager msgs : playerMessagers) { if (msgs.player == player || msgs.player.equals(player)) { msgs.messages.clear(); } } } /** * Unblocks a message for a player. * @param player The player. * @param message The message to unblock. */ public void unblockMessage(Player player, String message) { for (PlayerMessager msgs : playerMessagers) { if (msgs.player == player || msgs.player.equals(player)) { msgs.getMessage(message).expire = 0; } } } }