merge multiple mode messages into one (4 modes max)

This commit is contained in:
Elián Hanisch 2012-07-15 22:28:38 -03:00
parent 6640435520
commit 909d56d704
2 changed files with 34 additions and 3 deletions

View File

@ -55,6 +55,7 @@ import supybot.ircdb as ircdb
import supybot.schedule as schedule import supybot.schedule as schedule
import supybot.utils as utils import supybot.utils as utils
from fnmatch import fnmatch from fnmatch import fnmatch
from collections import defaultdict
import sqlite import sqlite
import pytz import pytz
import cPickle import cPickle
@ -869,6 +870,7 @@ class Bantracker(callbacks.Plugin):
def autoRemoveBans(self, irc): def autoRemoveBans(self, irc):
modedict = { 'quiet': '-q', 'ban': '-b' } modedict = { 'quiet': '-q', 'ban': '-b' }
unbandict = defaultdict(list)
for ban in self.managedBans.popExpired(): for ban in self.managedBans.popExpired():
channel, mask, type = ban.ban.channel, ban.ban.mask, ban.ban.type channel, mask, type = ban.ban.channel, ban.ban.mask, ban.ban.type
if not self.registryValue('autoremove', channel): if not self.registryValue('autoremove', channel):
@ -880,9 +882,15 @@ class Bantracker(callbacks.Plugin):
ban.ban.id, ban.ban.id,
mask, mask,
channel) channel)
# send unban msg unbandict[channel].append((modedict[type], mask))
unban = ircmsgs.mode(channel, (modedict[type], mask)) # send unban messages, with 4 modes max each.
irc.queueMsg(unban) maxModes = 4
for channel, modes in unbandict.iteritems():
for i in range(len(modes) / maxModes + 1):
L = modes[i * maxModes : (i + 1) * maxModes]
if L:
msg = ircmsgs.mode(channel, ircutils.joinModes(L))
irc.queueMsg(msg)
# notify about bans soon to expire # notify about bans soon to expire
for ban in self.managedBans.getExpired(600): for ban in self.managedBans.getExpired(600):

View File

@ -361,6 +361,29 @@ class BantrackerTestCase(ChannelPluginTestCase):
msg = self.irc.takeMsg() # unban msg msg = self.irc.takeMsg() # unban msg
self.assertEqual(str(msg).strip(), "MODE #test -b :asd!*@*") self.assertEqual(str(msg).strip(), "MODE #test -b :asd!*@*")
def testBanremoveMergeModes(self):
cb = self.getCallback()
self.feedBan('asd!*@*')
self.feedBan('qwe!*@*')
self.feedBan('zxc!*@*')
self.feedBan('asd!*@*', mode='q')
self.feedBan('qwe!*@*', mode='q')
self.feedBan('zxc!*@*', mode='q')
self.assertNotError('banremove 1 0')
self.assertNotError('banremove 2 0')
self.assertNotError('banremove 3 0')
self.assertNotError('banremove 4 0')
self.assertNotError('banremove 5 0')
self.assertNotError('banremove 6 0')
print 'waiting 1 secs ...'
time.sleep(1)
cb.autoRemoveBans(self.irc)
msg = self.irc.takeMsg() # unban msg
self.assertEqual(str(msg).strip(),
"MODE #test -qqqb zxc!*@* qwe!*@* asd!*@* :zxc!*@*")
msg = self.irc.takeMsg()
self.assertEqual(str(msg).strip(), "MODE #test -bb qwe!*@* :asd!*@*")
def testBanremoveQuiet(self): def testBanremoveQuiet(self):
cb = self.getCallback() cb = self.getCallback()
self.feedBan('asd!*@*', mode='q') self.feedBan('asd!*@*', mode='q')