Use a simple command handler for simple commands.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 22 Oct 2014 17:52:19 +0000 (19:52 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 22 Oct 2014 17:52:19 +0000 (19:52 +0200)
src/main/java/net/pterodactylus/irc/Connection.java
src/main/java/net/pterodactylus/irc/connection/SimpleCommandHandler.java [new file with mode: 0644]

index 45795f3..d12cc77 100644 (file)
@@ -45,6 +45,7 @@ import net.pterodactylus.irc.connection.Handler;
 import net.pterodactylus.irc.connection.MessageHandler;
 import net.pterodactylus.irc.connection.MotdHandler;
 import net.pterodactylus.irc.connection.PrefixHandler;
+import net.pterodactylus.irc.connection.SimpleCommandHandler;
 import net.pterodactylus.irc.event.ChannelJoined;
 import net.pterodactylus.irc.event.ChannelLeft;
 import net.pterodactylus.irc.event.ChannelTopic;
@@ -368,6 +369,9 @@ public class Connection extends AbstractExecutionThreadService implements Servic
                                        new MessageHandler(eventBus, this, prefixHandler),
                                        new CtcpHandler(eventBus, this),
                                        new ChannelNickHandler(eventBus, this, prefixHandler),
+                                       new SimpleCommandHandler()
+                                                       .addCommand("431", (parameters) -> eventBus.post(
+                                                                       new NoNicknameGivenReceived(this))),
                                        new MotdHandler(eventBus, this),
                                        new ChannelNotJoinedHandler(eventBus, this),
                                        new ConnectionEstablishHandler(eventBus, this),
@@ -389,9 +393,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic
                                }
 
                                /* 43x replies are for nick change errors. */
-                               if (command.equals("431")) {
-                                       eventBus.post(new NoNicknameGivenReceived(this));
-                               } else if (command.equals("433")) {
+                               if (command.equals("433")) {
                                        if (!established.get()) {
                                                nickname = nicknameChooser.getNickname();
                                                connectionHandler.sendCommand("NICK", nickname);
diff --git a/src/main/java/net/pterodactylus/irc/connection/SimpleCommandHandler.java b/src/main/java/net/pterodactylus/irc/connection/SimpleCommandHandler.java
new file mode 100644 (file)
index 0000000..24df16f
--- /dev/null
@@ -0,0 +1,49 @@
+package net.pterodactylus.irc.connection;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.pterodactylus.irc.Reply;
+
+/**
+ * Handler that can process any number of events.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class SimpleCommandHandler implements Handler {
+
+       private final Map<String, EventProcessor> commandEventSenders =
+                       new HashMap<>();
+
+       public SimpleCommandHandler addCommand(String command,
+                       EventProcessor eventProcessor) {
+               commandEventSenders.put(command, eventProcessor);
+               return this;
+       }
+
+       @Override
+       public boolean willHandle(Reply reply) {
+               return commandEventSenders.containsKey(reply.command());
+       }
+
+       @Override
+       public void handleReply(Reply reply) {
+               EventProcessor eventProcessor =
+                               commandEventSenders.get(reply.command());
+               eventProcessor.processEvent(reply.parameters());
+       }
+
+       /**
+        * Interface for event processors.
+        *
+        * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+        */
+       @FunctionalInterface
+       public static interface EventProcessor {
+
+               void processEvent(List<String> parameters);
+
+       }
+
+}