+ * 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);
+ }
+
+ /**