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:
@ -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
|
||||
|
@ -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!*@*')
|
||||
|
Reference in New Issue
Block a user