Check that the server supports quiets. If it doesn't, don't fetch quiets.

This commit is contained in:
Elián Hanisch 2012-10-02 09:34:20 -03:00
parent 32e80e7359
commit 9618d43707
2 changed files with 50 additions and 23 deletions

View File

@ -248,6 +248,10 @@ def dequeue(parent, irc):
global queue global queue
queue.dequeue(parent, irc) queue.dequeue(parent, irc)
def supported(irc, mode):
chanmodes = irc.state.supported.get('chanmodes', '')
return mode in chanmodes.split(',')[0]
class MsgQueue(object): class MsgQueue(object):
def __init__(self): def __init__(self):
self.msgcache = [] self.msgcache = []
@ -570,15 +574,26 @@ class Bantracker(callbacks.Plugin):
self.hosts[host] = [] self.hosts[host] = []
self.hosts[host].append(nick) self.hosts[host].append(nick)
def get_bans(self, irc, mode='b'): def get_bans(self, irc, channel=None, mode='b'):
global queue global queue
for channel in irc.state.channels.keys():
if not supported(irc, mode):
return
def fetch(channel):
if not self.registryValue('enabled', channel): if not self.registryValue('enabled', channel):
continue return
if channel not in self.bans: if channel not in self.bans:
self.bans[channel] = [] self.bans[channel] = []
queue.queue(ircmsgs.mode(channel, mode)) 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): def sendWhois(self, irc, nick, do_reply=False, *args):
nick = nick.lower() nick = nick.lower()
irc.queueMsg(ircmsgs.whois(nick, nick)) irc.queueMsg(ircmsgs.whois(nick, nick))
@ -653,10 +668,13 @@ class Bantracker(callbacks.Plugin):
def do728(self, irc, msg): def do728(self, irc, msg):
"""Got quiet""" """Got quiet"""
self.do367(irc, msg, quiet=True) if supported(irc, 'q'):
self.do367(irc, msg, quiet=True)
# End of channel quiet list. # 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): def nick_to_host(self, irc=None, target='', with_nick=True, reply_now=True):
target = target.lower() target = target.lower()
@ -1097,8 +1115,8 @@ class Bantracker(callbacks.Plugin):
del self.opped[channel] del self.opped[channel]
if channel in self.bans: if channel in self.bans:
del self.bans[channel] del self.bans[channel]
queue.queue(ircmsgs.mode(channel, 'b')) self.get_bans(irc, channel)
queue.queue(ircmsgs.mode(channel, 'q')) self.get_bans(irc, channel, 'q')
nick = msg.nick.lower() or msg.prefix.lower().split('!', 1)[0] nick = msg.nick.lower() or msg.prefix.lower().split('!', 1)[0]
self.nicks[nick] = msg.prefix.lower() self.nicks[nick] = msg.prefix.lower()

View File

@ -638,23 +638,32 @@ class BantrackerTestCase(ChannelPluginTestCase):
finally: finally:
pluginConf.autoremove.notify.channels.set('') pluginConf.autoremove.notify.channels.set('')
def testQuietFetch(self): def testQuietList(self):
quiet = ircmsgs.IrcMsg( self.irc.feedMsg(ircmsgs.IrcMsg(
':server.net 728 test #channel q troll!*@* op!user@home.com 123456789') ':server.net 005 test CHANMODES=eIbq,k,flj,CFLMPQcgimnprstz :are supported'))
end = ircmsgs.IrcMsg( self.irc.feedMsg(ircmsgs.IrcMsg(
':server.net 729 test #channel q :End of Channel Quiet List') ':server.net 728 test #channel q troll!*@* op!user@home.com 123456789'))
self.irc.feedMsg(quiet) self.irc.feedMsg(ircmsgs.IrcMsg(
self.irc.feedMsg(end) ':server.net 729 test #channel q :End of Channel Quiet List'))
obj = self.getCallback().bans['#channel'][0] L = self.getCallback().bans.get('#channel')
self.assertEqual('%troll!*@*', obj.mask) self.assertTrue(L != None)
self.assertEqual('%troll!*@*', L[0].mask)
def testBanFetch(self): def testQuietListNotSupported(self):
ban = ircmsgs.IrcMsg( self.irc.feedMsg(ircmsgs.IrcMsg(
':server.net 367 test #channel troll!*@* op!user@home.com 123456789') ':server.net 005 test CHANMODES=eIb,k,flj,CFLMPQcgimnprstz :are supported'))
end = ircmsgs.IrcMsg( self.irc.feedMsg(ircmsgs.IrcMsg(
':server.net 368 test #channel :End of Channel Ban List') ':server.net 728 test #channel q troll!*@* op!user@home.com 123456789'))
self.irc.feedMsg(ban) self.irc.feedMsg(ircmsgs.IrcMsg(
self.irc.feedMsg(end) ':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] obj = self.getCallback().bans['#channel'][0]
self.assertEqual('troll!*@*', obj.mask) self.assertEqual('troll!*@*', obj.mask)