+ * Remove all data stored for a network if the connection is closed.
+ *
+ * @param connectionClosed
+ * The connection closed event
+ */
+ @Subscribe
+ public void connectionClosed(ConnectionClosed connectionClosed) {
+ Optional<Network> network = getNetwork(connectionClosed.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ /* find all channels that need to be removed. */
+ for (Collection channels : ImmutableList.of(joinedChannels, extraChannels)) {
+ for (Iterator<Channel> channelIterator = channels.iterator(); channelIterator.hasNext(); ) {
+ Channel joinedChannel = channelIterator.next();
+ if (!joinedChannel.network().equals(network.get())) {
+ continue;
+ }
+
+ channelIterator.remove();
+ }
+ }
+
+ /* now remove all bots for that network. */
+ Map<String, Bot> bots = networkBots.row(network.get());
+ int botCount = bots.size();
+ int packCount = 0;
+ for (Bot bot : bots.values()) {
+ packCount += bot.packs().size();
+ }
+ bots.clear();
+ eventBus.post(new GenericMessage(String.format("Network %s disconnected, %d bots removed, %d packs removed.", network.get().name(), botCount, packCount)));
+
+ /* now remove the network. */
+ networkConnections.remove(network.get());
+ }
+
+ /**
+ * Shows a message when a channel was joined by us.
+ *
+ * @param channelJoined
+ * The channel joined event
+ */
+ @Subscribe
+ public void channelJoined(ChannelJoined channelJoined) {
+ if (channelJoined.connection().isSource(channelJoined.client())) {
+ Optional<Network> network = getNetwork(channelJoined.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Optional<Channel> channel = getChannel(network.get(), channelJoined.channel());
+ if (!channel.isPresent()) {
+ /* it’s an extra channel. */
+ extraChannels.add(new Channel(network.get(), channelJoined.channel()));
+ logger.info(String.format("Joined extra Channel %s on %s.", channelJoined.channel(), network.get().name()));
+ return;
+ }
+
+ joinedChannels.add(channel.get());
+ logger.info(String.format("Joined Channel %s on %s.", channelJoined.channel(), network.get().name()));
+ }
+ }
+
+ /**
+ * Removes bots that leave a channel, or channels when it’s us that’s leaving.
+ *
+ * @param channelLeft
+ * The channel left event
+ */
+ @Subscribe
+ public void channelLeft(ChannelLeft channelLeft) {
+ Optional<Network> network = getNetwork(channelLeft.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Bot bot = networkBots.get(network.get(), channelLeft.client().nick().get());
+ if (bot == null) {
+ /* maybe it was us? */
+ if (channelLeft.connection().isSource(channelLeft.client())) {
+ Optional<Channel> channel = getChannel(network.get(), channelLeft.channel());
+ if (!channel.isPresent()) {
+ /* maybe it was an extra channel? */
+ channel = getExtraChannel(network.get(), channelLeft.channel());
+ if (!channel.isPresent()) {
+ /* okay, whatever. */
+ return;
+ }
+
+ extraChannels.remove(channel);
+ } else {
+ channels.remove(channel.get());
+ }
+
+ eventBus.post(new GenericMessage(String.format("Left Channel %s on %s.", channel.get().name(), channel.get().network().name())));
+ }
+
+ return;
+ }
+
+ 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())));
+ }
+ }
+
+ /**
+ * Removes a client (which may be a bot) from the table of known bots.
+ *
+ * @param clientQuit
+ * The client quit event
+ */
+ @Subscribe
+ public void clientQuit(ClientQuit clientQuit) {
+ Optional<Network> network = getNetwork(clientQuit.connection());
+ if (!network.isPresent()) {
+ return;
+ }
+
+ Bot removedBot = networkBots.remove(network.get(), clientQuit.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())));
+ }
+ }
+
+ /**
+ * 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);
+ }
+
+ /**