summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java')
-rw-r--r--src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java b/src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java
new file mode 100644
index 00000000..ed0ec952
--- /dev/null
+++ b/src/main/java/org/bukkit/conversations/InactivityConversationCanceller.java
@@ -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) {
+
+ }
+}