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
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()

View File

@ -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)