summaryrefslogtreecommitdiffstats
path: root/src/main/java/org
diff options
context:
space:
mode:
authorrmichela <deltahat@gmail.com>2012-01-19 03:32:05 -0500
committerEvilSeph <evilseph@gmail.com>2012-03-01 04:33:59 -0500
commit1161de3f638e187e17677697b3663e13381b9d3d (patch)
treeecf371a6ae341603f8e347447b3b5d9dd4576adc /src/main/java/org
parent818a61040e0e382f2fb1a385b657601b194b0083 (diff)
downloadcraftbukkit-1161de3f638e187e17677697b3663e13381b9d3d.tar
craftbukkit-1161de3f638e187e17677697b3663e13381b9d3d.tar.gz
craftbukkit-1161de3f638e187e17677697b3663e13381b9d3d.tar.lz
craftbukkit-1161de3f638e187e17677697b3663e13381b9d3d.tar.xz
craftbukkit-1161de3f638e187e17677697b3663e13381b9d3d.zip
[Bleeding] Added Conversations API. Addresses BUKKIT-864
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftServer.java11
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/conversations/ConversationTracker.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java31
5 files changed, 133 insertions, 12 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 7ff27f26..75fb8d53 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -58,6 +58,7 @@ import org.bukkit.command.SimpleCommandMap;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
+import org.bukkit.conversations.Conversable;
import org.bukkit.craftbukkit.help.SimpleHelpMap;
import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe;
import org.bukkit.craftbukkit.inventory.CraftInventoryCustom;
@@ -443,7 +444,15 @@ public final class CraftServer implements Server {
}
// NOTE: Should only be called from MinecraftServer.b()
- public boolean dispatchCommand(CommandSender sender, ServerCommand serverCommand) {
+ public boolean dispatchServerCommand(CommandSender sender, ServerCommand serverCommand) {
+ if (sender instanceof Conversable) {
+ Conversable conversable = (Conversable)sender;
+
+ if (conversable.isConversing()) {
+ conversable.acceptConversationInput(serverCommand.command);
+ return true;
+ }
+ }
return dispatchCommand(sender, serverCommand.command);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
index f1deb305..c5c817c8 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
@@ -42,16 +42,17 @@ public class ColouredConsoleSender extends CraftConsoleCommandSender {
@Override
public void sendMessage(String message) {
if (terminal.isANSISupported()) {
- String result = message;
-
- for (ChatColor color : colors) {
- if (replacements.containsKey(color)) {
- result = result.replaceAll(color.toString(), replacements.get(color));
- } else {
- result = result.replaceAll(color.toString(), "");
+ if (!conversationTracker.isConversingModaly()) {
+ String result = message;
+ for (ChatColor color : colors) {
+ if (replacements.containsKey(color)) {
+ result = result.replaceAll(color.toString(), replacements.get(color));
+ } else {
+ result = result.replaceAll(color.toString(), "");
+ }
}
+ System.out.println(result + ANSICodes.attrib(0));
}
- System.out.println(result + ANSICodes.attrib(0));
} else {
super.sendMessage(message);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java
index dbcfddc9..00f18d1d 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java
@@ -2,17 +2,25 @@ package org.bukkit.craftbukkit.command;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
+import org.bukkit.conversations.Conversation;
+import org.bukkit.craftbukkit.conversations.ConversationTracker;
/**
* Represents CLI input from a console
*/
public class CraftConsoleCommandSender extends ServerCommandSender implements ConsoleCommandSender {
+ protected ConversationTracker conversationTracker = new ConversationTracker();
+
protected CraftConsoleCommandSender() {
super();
}
public void sendMessage(String message) {
+ sendRawMessage(message);
+ }
+
+ public void sendRawMessage(String message) {
System.out.println(ChatColor.stripColor(message));
}
@@ -33,4 +41,20 @@ public class CraftConsoleCommandSender extends ServerCommandSender implements Co
public void setOp(boolean value) {
throw new UnsupportedOperationException("Cannot change operator status of server console");
}
+
+ public boolean beginConversation(Conversation conversation) {
+ return conversationTracker.beginConversation(conversation);
+ }
+
+ public void abandonConversation(Conversation conversation) {
+ conversationTracker.abandonConversation(conversation);
+ }
+
+ public void acceptConversationInput(String input) {
+ conversationTracker.acceptConversationInput(input);
+ }
+
+ public boolean isConversing() {
+ return conversationTracker.isConversing();
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/conversations/ConversationTracker.java b/src/main/java/org/bukkit/craftbukkit/conversations/ConversationTracker.java
new file mode 100644
index 00000000..46771728
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/conversations/ConversationTracker.java
@@ -0,0 +1,62 @@
+package org.bukkit.craftbukkit.conversations;
+
+import org.bukkit.conversations.Conversation;
+
+import java.util.Deque;
+import java.util.LinkedList;
+
+/**
+ */
+public class ConversationTracker {
+
+ private Deque<Conversation> conversationQueue = new LinkedList<Conversation>();
+
+ public synchronized boolean beginConversation(Conversation conversation) {
+ if (!conversationQueue.contains(conversation)) {
+ conversationQueue.addLast(conversation);
+ if (conversationQueue.getFirst() == conversation) {
+ conversation.begin();
+ conversation.outputNextPrompt();
+ return true;
+ }
+ }
+ return true;
+ }
+
+ public synchronized void abandonConversation(Conversation conversation) {
+ if (!conversationQueue.isEmpty()) {
+ if (conversationQueue.getFirst() == conversation) {
+ conversation.abandon();
+ }
+ if (conversationQueue.contains(conversation)) {
+ conversationQueue.remove(conversation);
+ }
+ if (!conversationQueue.isEmpty()) {
+ conversationQueue.getFirst().outputNextPrompt();
+ }
+ }
+ }
+
+ public synchronized void abandonAllConversations() {
+
+ Deque<Conversation> oldQueue = conversationQueue;
+ conversationQueue = new LinkedList<Conversation>();
+ for(Conversation conversation : oldQueue) {
+ conversation.abandon();
+ }
+ }
+
+ public synchronized void acceptConversationInput(String input) {
+ if (isConversing()) {
+ conversationQueue.getFirst().acceptInput(input);
+ }
+ }
+
+ public synchronized boolean isConversing() {
+ return !conversationQueue.isEmpty();
+ }
+
+ public synchronized boolean isConversingModaly() {
+ return isConversing() && conversationQueue.getFirst().isModal();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index b065d47d..039cf9b5 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -37,6 +37,8 @@ import org.bukkit.Statistic;
import org.bukkit.World;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.serialization.DelegateDeserialization;
+import org.bukkit.conversations.Conversation;
+import org.bukkit.craftbukkit.conversations.ConversationTracker;
import org.bukkit.craftbukkit.CraftEffect;
import org.bukkit.craftbukkit.CraftOfflinePlayer;
import org.bukkit.craftbukkit.CraftServer;
@@ -59,6 +61,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
private long firstPlayed = 0;
private long lastPlayed = 0;
private boolean hasPlayedBefore = false;
+ private ConversationTracker conversationTracker = new ConversationTracker();
private Set<String> channels = new HashSet<String>();
private Map<String, Player> hiddenPlayers = new MapMaker().softValues().makeMap();
private int hash = 0;
@@ -133,9 +136,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
public void sendMessage(String message) {
- this.sendRawMessage(message);
+ if (!conversationTracker.isConversingModaly()) {
+ this.sendRawMessage(message);
+ }
}
-
+
public void sendMessage(String[] messages) {
for (String message : messages) {
sendMessage(message);
@@ -692,6 +697,22 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
data.setLong("lastPlayed", System.currentTimeMillis());
}
+ public boolean beginConversation(Conversation conversation) {
+ return conversationTracker.beginConversation(conversation);
+ }
+
+ public void abandonConversation(Conversation conversation) {
+ conversationTracker.abandonConversation(conversation);
+ }
+
+ public void acceptConversationInput(String input) {
+ conversationTracker.acceptConversationInput(input);
+ }
+
+ public boolean isConversing() {
+ return conversationTracker.isConversing();
+ }
+
public void sendPluginMessage(Plugin source, String channel, byte[] message) {
StandardMessenger.validatePluginMessage(server.getMessenger(), source, channel, message);
@@ -773,4 +794,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
getHandle().setContainerData(container, prop.getId(), value);
return true;
}
-}
+
+ public void disconnect(String reason) {
+ conversationTracker.abandonAllConversations();
+ }
+} \ No newline at end of file