From 9b5efcd3c6638517530a128aabdda322bb629cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eli=C3=A1n=20Hanisch?= Date: Sat, 8 Sep 2012 18:24:18 -0300 Subject: [PATCH 1/4] sync quiets --- Bantracker/plugin.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Bantracker/plugin.py b/Bantracker/plugin.py index 09c629b..2770069 100644 --- a/Bantracker/plugin.py +++ b/Bantracker/plugin.py @@ -269,7 +269,7 @@ queue = MsgQueue() class Ban(object): """Hold my bans""" - def __init__(self, args=None, **kwargs): + def __init__(self, args=None, quiet=False, **kwargs): self.id = None if args: # in most ircd: args = (nick, channel, mask, who, when) @@ -285,6 +285,8 @@ class Ban(object): if 'id' in kwargs: self.id = kwargs['id'] self.ascwhen = time.asctime(time.gmtime(self.when)) + if quiet: + self.mask = '%' + self.mask def __tuple__(self): return (self.mask, self.who, self.ascwhen) @@ -536,6 +538,7 @@ class Bantracker(callbacks.Plugin): else: self.db = None self.get_bans(irc) + self.get_bans(irc, mode='q') self.get_nicks(irc) # init review stuff @@ -569,14 +572,14 @@ class Bantracker(callbacks.Plugin): self.hosts[host] = [] self.hosts[host].append(nick) - def get_bans(self, irc): + def get_bans(self, irc, mode='b'): global queue for channel in irc.state.channels.keys(): if not self.registryValue('enabled', channel): continue if channel not in self.bans: self.bans[channel] = [] - queue.queue(ircmsgs.mode(channel, 'b')) + queue.queue(ircmsgs.mode(channel, mode)) def sendWhois(self, irc, nick, do_reply=False, *args): nick = nick.lower() @@ -623,14 +626,14 @@ class Bantracker(callbacks.Plugin): kwargs = {'from_reply': True, 'reply': None} f(*args, **kwargs) - def do367(self, irc, msg): + def do367(self, irc, msg, quiet=False): """Got ban""" channel = msg.args[1] try: bans = self.bans[channel] except KeyError: bans = self.bans[channel] = [] - ban = Ban(msg.args) + ban = Ban(msg.args, quiet=quiet) if ban not in bans: bans.append(ban) @@ -643,6 +646,13 @@ class Bantracker(callbacks.Plugin): except KeyError: pass + def do728(self, irc, msg): + """Got quiet""" + self.do367(irc, msg, quiet=True) + + # End of channel quiet list. + do729 = do368 + def nick_to_host(self, irc=None, target='', with_nick=True, reply_now=True): target = target.lower() if ircutils.isUserHostmask(target): @@ -1083,6 +1093,7 @@ class Bantracker(callbacks.Plugin): if channel in self.bans: del self.bans[channel] queue.queue(ircmsgs.mode(channel, 'b')) + queue.queue(ircmsgs.mode(channel, 'q')) nick = msg.nick.lower() or msg.prefix.lower().split('!', 1)[0] self.nicks[nick] = msg.prefix.lower() From 364c2c993e3f90e57e2da3da0783f2b1768cfcb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eli=C3=A1n=20Hanisch?= Date: Sat, 8 Sep 2012 18:37:47 -0300 Subject: [PATCH 2/4] fix, 728 messages doesn't have the same format than 367 ones: :lindbohm.freenode.net 728 scratDev #ubuntu-bots-test q $r:something m4v!~znc@unaffiliated/m4v 1347139607 :lindbohm.freenode.net 367 scratDev #ubuntu-bots-test new!ban@* lindbohm.freenode.net 1345088056 --- Bantracker/plugin.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Bantracker/plugin.py b/Bantracker/plugin.py index 2770069..f0f3f33 100644 --- a/Bantracker/plugin.py +++ b/Bantracker/plugin.py @@ -269,7 +269,7 @@ queue = MsgQueue() class Ban(object): """Hold my bans""" - def __init__(self, args=None, quiet=False, **kwargs): + def __init__(self, args=None, **kwargs): self.id = None if args: # in most ircd: args = (nick, channel, mask, who, when) @@ -285,8 +285,6 @@ class Ban(object): if 'id' in kwargs: self.id = kwargs['id'] self.ascwhen = time.asctime(time.gmtime(self.when)) - if quiet: - self.mask = '%' + self.mask def __tuple__(self): return (self.mask, self.who, self.ascwhen) @@ -633,7 +631,14 @@ class Bantracker(callbacks.Plugin): bans = self.bans[channel] except KeyError: bans = self.bans[channel] = [] - ban = Ban(msg.args, quiet=quiet) + if quiet: + # args = (nick, channel, mode, mask, who, when) + args = list(msg.args) + del args[2] # drop the 'q' bit + args[2] = '%' + args[2] + ban = Ban(args) + else: + ban = Ban(msg.args) if ban not in bans: bans.append(ban) From 32e80e73599280147ed265385b6d73f38106b5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eli=C3=A1n=20Hanisch?= Date: Sat, 15 Sep 2012 20:00:41 -0300 Subject: [PATCH 3/4] add testcases --- Bantracker/test.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Bantracker/test.py b/Bantracker/test.py index d62a21f..cceb07e 100644 --- a/Bantracker/test.py +++ b/Bantracker/test.py @@ -638,4 +638,24 @@ 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 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) + obj = self.getCallback().bans['#channel'][0] + self.assertEqual('troll!*@*', obj.mask) + 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 4/4] 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)