Move network connecting into its own method.
[xudocci.git] / src / main / java / net / pterodactylus / xdcc / core / Core.java
index 5485ed4..a395537 100644 (file)
@@ -42,6 +42,7 @@ import net.pterodactylus.irc.event.DccAcceptReceived;
 import net.pterodactylus.irc.event.DccDownloadFailed;
 import net.pterodactylus.irc.event.DccDownloadFinished;
 import net.pterodactylus.irc.event.DccSendReceived;
+import net.pterodactylus.irc.event.NicknameChanged;
 import net.pterodactylus.irc.event.PrivateMessageReceived;
 import net.pterodactylus.irc.util.MessageCleaner;
 import net.pterodactylus.irc.util.RandomNickname;
@@ -226,15 +227,7 @@ public class Core extends AbstractIdleService {
        protected void startUp() {
                for (Channel channel : channels) {
                        logger.info(String.format("Connecting to Channel %s on Network %s…", channel.name(), channel.network().name()));
-                       if (!networkConnections.containsKey(channel.network())) {
-                               /* select a random server. */
-                               List<Server> servers = Lists.newArrayList(channel.network().servers());
-                               Server server = servers.get((int) (Math.random() * servers.size()));
-                               Connection connection = new ConnectionBuilder(eventBus).connect(server.hostname()).port(server.unencryptedPorts().iterator().next()).build();
-                               connection.username(RandomNickname.get()).realName(RandomNickname.get());
-                               networkConnections.put(channel.network(), connection);
-                               connection.start();
-                       }
+                       connectNetwork(channel.network());
                }
 
                /* notify listeners. */
@@ -246,6 +239,33 @@ public class Core extends AbstractIdleService {
        }
 
        //
+       // PRIVATE METHODS
+       //
+
+       /**
+        * Starts a new connection for the given network if no such connection exists
+        * already.
+        *
+        * @param network
+        *              The network to connect to
+        */
+       private void connectNetwork(Network network) {
+               if (!networkConnections.containsKey(network)) {
+                               /* select a random server. */
+                       List<Server> servers = Lists.newArrayList(network.servers());
+                       if (servers.isEmpty()) {
+                               eventBus.post(new GenericError(String.format("Network %s does not have any servers.", network.name())));
+                               return;
+                       }
+                       Server server = servers.get((int) (Math.random() * servers.size()));
+                       Connection connection = new ConnectionBuilder(eventBus).connect(server.hostname()).port(server.unencryptedPorts().iterator().next()).build();
+                       connection.username(RandomNickname.get()).realName(RandomNickname.get());
+                       networkConnections.put(network, connection);
+                       connection.start();
+               }
+       }
+
+       //
        // EVENT HANDLERS
        //
 
@@ -343,7 +363,10 @@ public class Core extends AbstractIdleService {
                        return;
                }
 
-               networkBots.remove(network.get(), channelLeft.client().nick().get());
+               Bot removedBot = networkBots.remove(network.get(), channelLeft.client().nick().get());
+               if (removedBot != null) {
+                       eventBus.post(new GenericMessage(String.format("Bot %s (%s) was removed, %d packs removed.", removedBot.name(), removedBot.network().name(), removedBot.packs().size())));
+               }
        }
 
        /**
@@ -366,6 +389,28 @@ public class Core extends AbstractIdleService {
        }
 
        /**
+        * If the nickname of a bit changes, remove it from the old name and store it
+        * under the new name.
+        *
+        * @param nicknameChanged
+        *              The nickname changed event
+        */
+       @Subscribe
+       public void nicknameChanged(NicknameChanged nicknameChanged) {
+               Optional<Network> network = getNetwork(nicknameChanged.connection());
+               if (!network.isPresent()) {
+                       return;
+               }
+
+               Bot bot = networkBots.remove(network.get(), nicknameChanged.client().nick().get());
+               if (bot == null) {
+                       return;
+               }
+
+               networkBots.put(network.get(), nicknameChanged.newNickname(), bot);
+       }
+
+       /**
         * If a message on a channel is received, it is parsed for pack information
         * with is then added to a bot.
         *