package org.bukkit.conversations; import org.bukkit.Server; import org.bukkit.plugin.Plugin; /** * An InactivityConversationCanceller will cancel a {@link Conversation} after a period of inactivity by the user. */ public class InactivityConversationCanceller implements ConversationCanceller { protected Plugin plugin; protected int timeoutSeconds; protected Conversation conversation; private int taskId = -1; /** * Creates an InactivityConversationCanceller. * * @param plugin The owning plugin. * @param timeoutSeconds The number of seconds of inactivity to wait. */ public InactivityConversationCanceller(Plugin plugin, int timeoutSeconds) { this.plugin = plugin; this.timeoutSeconds = timeoutSeconds; } public void setConversation(Conversation conversation) { this.conversation = conversation; startTimer(); } public boolean cancelBasedOnInput(ConversationContext context, String input) { // Reset the inactivity timer stopTimer(); startTimer(); return false; } public ConversationCanceller clone() { return new InactivityConversationCanceller(plugin, timeoutSeconds); } /** * Starts an inactivity timer. */ private void startTimer() { taskId = plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { public void run() { if (conversation.getState() == Conversation.ConversationState.UNSTARTED) { startTimer(); } else if (conversation.getState() == Conversation.ConversationState.STARTED) { cancelling(conversation); conversation.abandon(new ConversationAbandonedEvent(conversation, InactivityConversationCanceller.this)); } } }, timeoutSeconds * 20); } /** * Stops the active inactivity timer. */ private void stopTimer() { if (taskId != -1) { plugin.getServer().getScheduler().cancelTask(taskId); taskId = -1; } } /** * Subclasses of InactivityConversationCanceller can override this method to take additional actions when the * inactivity timer abandons the conversation. * * @param conversation The conversation being abandoned. */ protected void cancelling(Conversation conversation) { } }