package games.strategy.engine.chat; import java.util.HashMap; import java.util.Map; /** * Simple flood control, only allow so many events per window of time. During each rolling time window, anyone that * sends more than "N" messages will be filtered until the next time window begins. * */ public class ChatFloodControl { private static final int ONE_MINUTE = 60 * 1000; static final int EVENTS_PER_WINDOW = 20; static final int WINDOW = ONE_MINUTE; private final Object lock = new Object(); private final Map<String, Integer> messageCount = new HashMap<>(); private long clearTime; public ChatFloodControl() { this(System.currentTimeMillis()); } ChatFloodControl(final long initialClearTime) { clearTime = initialClearTime; } public boolean allow(final String from, final long now) { synchronized (lock) { // reset the window if (now > clearTime) { messageCount.clear(); clearTime = now + WINDOW; } if (!messageCount.containsKey(from)) { messageCount.put(from, 1); } else { messageCount.put(from, messageCount.get(from) + 1); } return messageCount.get(from) <= EVENTS_PER_WINDOW; } } }