From 9618d437073445efb34d34bb686d93ac755782c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eli=C3=A1n=20Hanisch?= Date: Tue, 2 Oct 2012 09:34:20 -0300 Subject: [PATCH] Check that the server supports quiets. If it doesn't, don't fetch quiets. --- Bantracker/plugin.py | 32 +++++++++++++++++++++++++------- Bantracker/test.py | 41 +++++++++++++++++++++++++---------------- 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/Bantracker/plugin.py b/Bantracker/plugin.py index f0f3f33..bc5c94c 100644 --- a/Bantracker/plugin.py +++ b/Bantracker/plugin.py @@ -248,6 +248,10 @@ def dequeue(parent, irc): global queue queue.dequeue(parent, irc) +def supported(irc, mode): + chanmodes = irc.state.supported.get('chanmodes', '') + return mode in chanmodes.split(',')[0] + class MsgQueue(object): def __init__(self): self.msgcache = [] @@ -570,15 +574,26 @@ class Bantracker(callbacks.Plugin): self.hosts[host] = [] self.hosts[host].append(nick) - def get_bans(self, irc, mode='b'): + def get_bans(self, irc, channel=None, mode='b'): global queue - for channel in irc.state.channels.keys(): + + if not supported(irc, mode): + return + + def fetch(channel): if not self.registryValue('enabled', channel): - continue + return + if channel not in self.bans: self.bans[channel] = [] queue.queue(ircmsgs.mode(channel, mode)) + if not channel: + for channel in irc.state.channels.keys(): + fetch(channel) + else: + fetch(channel) + def sendWhois(self, irc, nick, do_reply=False, *args): nick = nick.lower() irc.queueMsg(ircmsgs.whois(nick, nick)) @@ -653,10 +668,13 @@ class Bantracker(callbacks.Plugin): def do728(self, irc, msg): """Got quiet""" - self.do367(irc, msg, quiet=True) + if supported(irc, 'q'): + self.do367(irc, msg, quiet=True) # End of channel quiet list. - do729 = do368 + def do729(self, irc, msg): + if supported(irc, 'q'): + self.do368(irc, msg) def nick_to_host(self, irc=None, target='', with_nick=True, reply_now=True): target = target.lower() @@ -1097,8 +1115,8 @@ class Bantracker(callbacks.Plugin): del self.opped[channel] if channel in self.bans: del self.bans[channel] - queue.queue(ircmsgs.mode(channel, 'b')) - queue.queue(ircmsgs.mode(channel, 'q')) + self.get_bans(irc, channel) + self.get_bans(irc, channel, 'q') nick = msg.nick.lower() or msg.prefix.lower().split('!', 1)[0] self.nicks[nick] = msg.prefix.lower() diff --git a/Bantracker/test.py b/Bantracker/test.py index cceb07e..dbe6fae 100644 --- a/Bantracker/test.py +++ b/Bantracker/test.py @@ -638,23 +638,32 @@ class BantrackerTestCase(ChannelPluginTestCase): finally: pluginConf.autoremove.notify.channels.set('') - def testQuietFetch(self): - quiet = ircmsgs.IrcMsg( - ':server.net 728 test #channel q troll!*@* op!user@home.com 123456789') - end = ircmsgs.IrcMsg( - ':server.net 729 test #channel q :End of Channel Quiet List') - self.irc.feedMsg(quiet) - self.irc.feedMsg(end) - obj = self.getCallback().bans['#channel'][0] - self.assertEqual('%troll!*@*', obj.mask) + def testQuietList(self): + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 005 test CHANMODES=eIbq,k,flj,CFLMPQcgimnprstz :are supported')) + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 728 test #channel q troll!*@* op!user@home.com 123456789')) + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 729 test #channel q :End of Channel Quiet List')) + L = self.getCallback().bans.get('#channel') + self.assertTrue(L != None) + self.assertEqual('%troll!*@*', L[0].mask) - def testBanFetch(self): - ban = ircmsgs.IrcMsg( - ':server.net 367 test #channel troll!*@* op!user@home.com 123456789') - end = ircmsgs.IrcMsg( - ':server.net 368 test #channel :End of Channel Ban List') - self.irc.feedMsg(ban) - self.irc.feedMsg(end) + def testQuietListNotSupported(self): + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 005 test CHANMODES=eIb,k,flj,CFLMPQcgimnprstz :are supported')) + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 728 test #channel q troll!*@* op!user@home.com 123456789')) + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 729 test #channel q :End of Channel Quiet List')) + L = self.getCallback().bans.get('#channel') + self.assertTrue(L == None) + + def testBanList(self): + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 367 test #channel troll!*@* op!user@home.com 123456789')) + self.irc.feedMsg(ircmsgs.IrcMsg( + ':server.net 368 test #channel :End of Channel Ban List')) obj = self.getCallback().bans['#channel'][0] self.assertEqual('troll!*@*', obj.mask)