Files
Paper/paper-api/src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java
2013-08-03 21:46:30 -04:00

78 lines
2.4 KiB
Java

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) {
}
}