bantracker: add options --verbose --view and --flush to banreview command.

intended for manually fix the review queue when the bot messes up.
This commit is contained in:
Elián Hanisch
2011-05-29 19:21:27 -03:00
parent fd36bffcc0
commit 46d07b8095
2 changed files with 59 additions and 8 deletions

View File

@ -1146,23 +1146,64 @@ class Bantracker(callbacks.Plugin):
irc.reply("%s/bans.cgi?log=%s&mark=%s" % (self.registryValue('bansite'), id, highlight), private=True)
banlink = wrap(banlink, ['id', optional('somethingWithoutSpaces')])
def banreview(self, irc, msg, args):
"""
def banreview(self, irc, msg, args, optlist):
"""[--verbose | --flush <nick@host> | --view <nick@host>]
Lists pending ban reviews."""
if not self.check_auth(irc, msg, args):
return
verbose = False
flush = view = None
for k, v in optlist:
if k == 'verbose':
verbose = True
elif k == 'flush':
flush = v
elif k == 'view':
view = v
key = view or flush
if key:
if '@' in key:
nick, host = key.split('@', 1)
else:
nick, host = key, None
try:
reviews = self.pendingReviews[host]
except KeyError:
irc.reply('No reviews for %s, use --verbose for check the correct nick@host key.' % key)
return
L = []
for _nick, msg in reviews:
if nick == _nick:
irc.reply(msg.args[1])
elif flush:
L.append((_nick, msg))
if flush:
if L:
self.pendingReviews[host] = L
else:
del self.pendingReviews[host]
return
count = {}
for reviews in self.pendingReviews.itervalues():
for host, reviews in self.pendingReviews.iteritems():
for nick, msg in reviews:
if verbose and host: # host can be None for those "nick only" reviews.
key = '%s@%s' % (nick, host)
else:
key = nick
try:
count[nick] += 1
count[key] += 1
except KeyError:
count[nick] = 1
count[key] = 1
total = sum(count.itervalues())
s = ' '.join([ '%s:%s' %pair for pair in count.iteritems() ])
s = 'Pending ban reviews (%s): %s' %(total, s)
irc.reply(s)
banreview = wrap(banreview)
banreview = wrap(banreview, [getopts({'verbose':'',
'flush': 'something',
'view': 'something'})])
Class = Bantracker

View File

@ -313,10 +313,20 @@ class BantrackerTestCase(ChannelPluginTestCase):
def testReviewBanreview(self):
pr = self.getCallback().pendingReviews
m = ircmsgs.privmsg('#test', 'asd')
m = ircmsgs.privmsg('#test', 'ban review')
pr['host.net'] = [('op', m), ('op_', m), ('op', m)]
pr['home.net'] = [('dude', m)]
self.assertResponse('banreview', 'Pending ban reviews (4): op_:1 dude:1 op:2')
pr[None] = [('dude_', m)]
self.assertResponse('banreview', 'Pending ban reviews (5): dude_:1 op_:1 dude:1 op:2')
self.assertResponse('banreview --verbose',
'Pending ban reviews (5): op@host.net:2 dude_:1 op_@host.net:1 dude@home.net:1')
self.assertRegexp('banreview --flush op@host', '^No reviews for op@host')
self.assertResponse('banreview --view dude_', 'ban review')
self.assertResponse('banreview', 'Pending ban reviews (5): dude_:1 op_:1 dude:1 op:2')
self.assertResponse('banreview --flush op@host.net', 'ban review')
# love ya supybot ↓
self.assertEqual(self.irc.takeMsg().args[1], 'test: ban review')
self.assertResponse('banreview', 'Pending ban reviews (3): dude_:1 op_:1 dude:1')
def testBan(self):
self.feedBan('asd!*@*')