From c9e548bdd926f1f4542a5b0121a0b9251706d36b Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Oct 2011 17:22:27 -0400 Subject: [PATCH 1/2] irclib: Add support for 004 messages from the server At a minimum, the message gives us the server name, ircd version, supported umodes, and supported channel modes. Add the umodes and channel modes to self.supported. Some IRCds (e.g., hybrid and ircd-seven) have an extra arg which seems to be the channel modes that require arguments. Signed-off-by: James McCoy --- src/irclib.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/irclib.py b/src/irclib.py index c87c15768..6fa2d1246 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -400,6 +400,15 @@ class IrcState(IrcCommandDispatcher): """Returns the hostmask for a given nick.""" return self.nicksToHostmasks[nick] + def do004(self, irc, msg): + """Handles parsing the 004 reply + + Supported user and channel modes are cached""" + # msg.args = [nick, server, ircd-version, umodes, modes, + # modes that require arguments? (non-standard)] + self.supported['umodes'] = msg.args[3] + self.supported['chanmodes'] = msg.args[4] + _005converters = utils.InsensitivePreservingDict({ 'modes': int, 'keylen': int, From b23480b915682eb35b77bf3b688c731eb7c8d72e Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sat, 29 Oct 2011 17:22:42 -0400 Subject: [PATCH 2/2] irclib: Filter out unsupported umodes before sending them to the server Closes: Sf#3075891 Signed-off-by: James McCoy --- src/irclib.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/irclib.py b/src/irclib.py index 6fa2d1246..aa313f6ea 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -928,9 +928,14 @@ class Irc(IrcCommandDispatcher): # Let's reset nicks in case we had to use a weird one. self.alternateNicks = conf.supybot.nick.alternates()[:] umodes = conf.supybot.protocols.irc.umodes() + supported = self.supported.get('umodes') if umodes: - if umodes[0] not in '+-': - umodes = '+' + umodes + addSub = '+' + if umodes[0] in '+-': + (addSub, umodes) = (umodes[0], umodes[1:]) + if supported: + umodes = filter(lamda m: m in supported, umodes) + umodes = ''.join(addSub, umodes) log.info('Sending user modes to %s: %s', self.network, umodes) self.sendMsg(ircmsgs.mode(self.nick, umodes)) do377 = do422 = do376