From 6981869c06640aea702d47f810b769643e5bef1e Mon Sep 17 00:00:00 2001 From: James Lu Date: Sun, 20 Aug 2017 19:24:46 -0700 Subject: [PATCH] clientbot: split up join() and handle_join() to prevent duplicate JOIN/MODE/WHO on connect --- protocols/clientbot.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/protocols/clientbot.py b/protocols/clientbot.py index f49f1fc..2883ad1 100644 --- a/protocols/clientbot.py +++ b/protocols/clientbot.py @@ -161,8 +161,6 @@ class ClientbotWrapperProtocol(IRCCommonProtocol): # rely on the /NAMES reply to sync it up properly. if self.pseudoclient and client == self.pseudoclient.uid: self.send('JOIN %s' % channel) - self.send('MODE %s' % channel) - self._send_who(channel) else: self.channels[channel].users.add(client) self.users[client].channels.add(channel) @@ -820,12 +818,21 @@ class ClientbotWrapperProtocol(IRCCommonProtocol): def handle_join(self, source, command, args): """ - Handles incoming JOINs. + Handles incoming JOINs, as well as JOIN acknowledgements for us. """ # <- :GL|!~GL@127.0.0.1 JOIN #whatever channel = args[0] - self.join(source, channel) + # Only fetch modes, TS, and user hosts once we're actually in the channel. + # The IRCd will send us a JOIN with our nick!user@host if our JOIN succeeded. + if self.pseudoclient and source == self.pseudoclient.uid: + self.send('MODE %s' % channel) + self._send_who(channel) + + self.channels[channel].users.add(source) + self.users[source].channels.add(channel) + + self.call_hooks([source, 'CLIENTBOT_JOIN', {'channel': channel}]) return {'channel': channel, 'users': [source], 'modes': self.channels[channel].modes} def handle_kick(self, source, command, args):