[Bleeding] Added Conversations API. Addresses BUKKIT-864
By: rmichela <deltahat@gmail.com>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}, 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) {
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user