package floobits.common; import floobits.common.interfaces.IContext; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledFuture; /** * This class prevents status message spam by throttling messages. */ public class StatusMessageThrottler { private String throttleMessage; private int maxMessages = 10; private int throttleWait = 2000; private List<String> messages = new ArrayList<String>(); private ScheduledFuture schedule = null; private IContext context; /** * Create a message throttler that doesn't spam the user. * @param context * @param throttleMessage If this message has a %d it will show a message count. */ public StatusMessageThrottler (IContext context, String throttleMessage) { this.throttleMessage = throttleMessage; this.context = context; } public void statusMessage(String message) { messages.add(message); queueUpMessages(); } private void queueUpMessages() { if (schedule != null) { return; } schedule = context.setTimeout(throttleWait, new Runnable() { @Override public void run() { clearMessages(); } }); } private void clearMessages() { int numMessages = messages.size(); if (numMessages <= maxMessages) { for (String message : messages) { context.statusMessage(message); } messages.clear(); return; } if (throttleMessage.contains("%d")) { context.statusMessage(String.format(throttleMessage, numMessages)); } else { context.statusMessage(throttleMessage); } for (String message : messages) { context.chatStatusMessage(message); } messages.clear(); schedule = null; } }