Merge lp:~m4v/ubuntu-bots/fetch-quiets (LP: #799524)

This commit is contained in:
tsimpson 2012-10-02 15:16:46 +01:00
commit a059ab2002
2 changed files with 70 additions and 7 deletions

View File

@ -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 = []
@ -536,6 +540,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 +574,25 @@ class Bantracker(callbacks.Plugin):
self.hosts[host] = []
self.hosts[host].append(nick)
def get_bans(self, irc):
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, 'b'))
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()
@ -623,14 +639,21 @@ 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)
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)
@ -643,6 +666,16 @@ class Bantracker(callbacks.Plugin):
except KeyError:
pass
def do728(self, irc, msg):
"""Got quiet"""
if supported(irc, 'q'):
self.do367(irc, msg, quiet=True)
# End of channel quiet list.
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()
if ircutils.isUserHostmask(target):
@ -1082,7 +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'))
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()

View File

@ -638,4 +638,33 @@ class BantrackerTestCase(ChannelPluginTestCase):
finally:
pluginConf.autoremove.notify.channels.set('')
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 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)