diff --git a/Bantracker/config.py b/Bantracker/config.py index e25eb45..7a370bf 100644 --- a/Bantracker/config.py +++ b/Bantracker/config.py @@ -185,7 +185,7 @@ conf.registerChannelValue(Bantracker.request, 'type', "List of events for which the bot should request a comment.")) conf.registerChannelValue(Bantracker.request, 'ignore', registry.SpaceSeparatedListOfStrings(['FloodBot?', 'FloodBotK?', 'ChanServ'], - "List of nicks for which the bot won't request to comment or review."\ + "List of nicks for which the bot won't request a comment."\ " Is case insensible and wildcards * ? are accepted.")) conf.registerChannelValue(Bantracker.request, 'forward', registry.SpaceSeparatedListOfStrings([], @@ -194,10 +194,26 @@ conf.registerChannelValue(Bantracker.request, 'forward', " Is case insensible and wildcards * ? are accepted.")) conf.registerChannelValue(Bantracker.request.forward, 'channels', registry.SpaceSeparatedListOfStrings([], - "List of channels/nicks to forward the request if the op is in the forward list.")) -conf.registerGlobalValue(Bantracker.request, 'review', + "List of channels/nicks to forward the comment request if the op is in the forward list.")) + +conf.registerChannelValue(Bantracker, 'review', + registry.Boolean(True, + "Enable/disable reviews per channel.")) +conf.registerGlobalValue(Bantracker.review, 'when', registry.Float(7, "Days after which the bot will request for review a ban. Can be an integer or decimal" - " value. Zero disables reviews.")) + " value. Zero disables reviews globally.")) +conf.registerChannelValue(Bantracker.review, 'ignore', + registry.SpaceSeparatedListOfStrings(['FloodBot?', 'FloodBotK?', 'ChanServ'], + "List of nicks for which the bot won't request a review."\ + " Is case insensible and wildcards * ? are accepted.")) +conf.registerChannelValue(Bantracker.review, 'forward', + registry.SpaceSeparatedListOfStrings([], + "List of nicks for which the bot will forward the reviews to"\ + " the channels/nicks defined in forwards.channels option."\ + " Is case insensible and wildcards * ? are accepted.")) +conf.registerChannelValue(Bantracker.review.forward, 'channels', + registry.SpaceSeparatedListOfStrings([], + "List of channels/nicks to forward the request if the op is in the forward list.")) diff --git a/Bantracker/plugin.py b/Bantracker/plugin.py index c965165..f09d7a7 100644 --- a/Bantracker/plugin.py +++ b/Bantracker/plugin.py @@ -442,7 +442,7 @@ class Bantracker(callbacks.Plugin): if nickMatch(nick, self.registryValue('request.forward', channel)): s = "Please somebody comment on the %s of %s in %s done by %s, use:"\ " %scomment %s " %(type, mask, channel, nick, prefix, ban.id) - self._sendForward(irc, s, channel) + self._sendForward(irc, s, 'request', channel) else: # send to op s = "Please comment on the %s of %s in %s, use: %scomment %s " \ @@ -450,7 +450,7 @@ class Bantracker(callbacks.Plugin): irc.reply(s, to=nick, private=True) def reviewBans(self, irc=None): - reviewTime = int(self.registryValue('request.review') * 86400) + reviewTime = int(self.registryValue('review.when') * 86400) if not reviewTime: # time is zero, do nothing return @@ -463,12 +463,13 @@ class Bantracker(callbacks.Plugin): for channel, bans in self.bans.iteritems(): if not self.registryValue('enabled', channel) \ - or not self.registryValue('request', channel): + or not self.registryValue('review', channel): continue for ban in bans: - if guessBanType(ban.mask) in ('quiet', 'removal'): - # skip mutes and kicks + type = guessBanType(ban.mask) + if type == 'removal': + # skip kicks continue banAge = now - ban.when reviewWindow = lastreview - ban.when @@ -489,20 +490,29 @@ class Bantracker(callbacks.Plugin): # probably a ban restored by IRC server in a netsplit # XXX see if something can be done about this continue - if nickMatch(nick, self.registryValue('request.ignore', channel)): + if nickMatch(nick, self.registryValue('review.ignore', channel)): # in the ignore list continue if not ban.id: ban.id = self.get_banId(ban.mask, channel) - if nickMatch(nick, self.registryValue('request.forward', channel)): - s = "Hi, please somebody review the ban '%s' set by %s on %s in"\ - " %s, link: %s/bans.cgi?log=%s" %(ban.mask, nick, ban.ascwhen, channel, - self.registryValue('bansite'), ban.id) - self._sendForward(irc, s, channel) + if nickMatch(nick, self.registryValue('review.forward', channel)): + s = "Hi, please somebody review the %s '%s' set by %s on %s in"\ + " %s, link: %s/bans.cgi?log=%s" % (type, + ban.mask, + nick, + ban.ascwhen, + channel, + self.registryValue('bansite'), + ban.id) + self._sendForward(irc, s, 'review', channel) else: - s = "Hi, please review the ban '%s' that you set on %s in %s, link:"\ - " %s/bans.cgi?log=%s" %(ban.mask, ban.ascwhen, channel, - self.registryValue('bansite'), ban.id) + s = "Hi, please review the %s '%s' that you set on %s in %s, link:"\ + " %s/bans.cgi?log=%s" % (type, + ban.mask, + ban.ascwhen, + channel, + self.registryValue('bansite'), + ban.id) msg = ircmsgs.privmsg(nick, s) if host in self.pendingReviews \ and (nick, msg) not in self.pendingReviews[host]: @@ -513,10 +523,10 @@ class Bantracker(callbacks.Plugin): # since we made sure bans are sorted by time, the bans left are more recent break - def _sendForward(self, irc, s, channel=None): + def _sendForward(self, irc, s, setting, channel=None): if not irc: return - for chan in self.registryValue('request.forward.channels', channel=channel): + for chan in self.registryValue('%s.forward.channels' % setting, channel=channel): msg = ircmsgs.notice(chan, s) irc.queueMsg(msg) diff --git a/Bantracker/test.py b/Bantracker/test.py index 9453ccc..2eb91e2 100644 --- a/Bantracker/test.py +++ b/Bantracker/test.py @@ -41,7 +41,10 @@ class BantrackerTestCase(ChannelPluginTestCase): pluginConf.request.setValue(False) # disable comments pluginConf.request.ignore.set('') pluginConf.request.forward.set('') - pluginConf.request.review.setValue(1.0/86400) # one second + pluginConf.review.setValue(False) # disable reviews + pluginConf.review.when.setValue(1.0/86400) # one second + pluginConf.review.ignore.set('') + pluginConf.review.forward.set('') # Bantracker for some reason doesn't use Supybot's own methods for check capabilities, # so it doesn't have a clue about testing and screws my tests by default. # This would fix it until I bring myself to take a look @@ -183,10 +186,9 @@ class BantrackerTestCase(ChannelPluginTestCase): " use: @comment 2 ") def testReview(self): - pluginConf.request.setValue(True) + pluginConf.review.setValue(True) cb = self.getCallback() self.feedBan('asd!*@*') - self.irc.takeMsg() # ignore comment request comment cb.reviewBans() self.assertFalse(cb.pendingReviews) print 'waiting 4 secs..' @@ -231,12 +233,11 @@ class BantrackerTestCase(ChannelPluginTestCase): "%s/bans.cgi?log=2" %(cb.bans['#test'][1].ascwhen, pluginConf.bansite())) def testReviewForward(self): - pluginConf.request.setValue(True) - pluginConf.request.forward.set('bot') - pluginConf.request.forward.channels.set('#channel') + pluginConf.review.setValue(True) + pluginConf.review.forward.set('bot') + pluginConf.review.forward.channels.set('#channel') cb = self.getCallback() self.feedBan('asd!*@*', prefix='bot!user@host.net') - self.irc.takeMsg() # ignore comment request comment cb.reviewBans(self.irc) self.assertFalse(cb.pendingReviews) print 'waiting 2 secs..' @@ -250,8 +251,8 @@ class BantrackerTestCase(ChannelPluginTestCase): "%s/bans.cgi?log=1" %(cb.bans['#test'][0].ascwhen, pluginConf.bansite())) def testReviewIgnore(self): - pluginConf.request.setValue(True) - pluginConf.request.ignore.set('FloodBot? FloodBotK?') + pluginConf.review.setValue(True) + pluginConf.review.ignore.set('FloodBot? FloodBotK?') cb = self.getCallback() self.feedBan('asd!*@*', prefix='floodbotk1!bot@botpit.com') cb.reviewBans(self.irc) @@ -265,10 +266,9 @@ class BantrackerTestCase(ChannelPluginTestCase): def testReviewNickFallback(self): """If for some reason we don't have ops full hostmask, revert to nick match. This may be needed in the future as hostmasks aren't stored in the db.""" - pluginConf.request.setValue(True) + pluginConf.review.setValue(True) cb = self.getCallback() self.feedBan('asd!*@*') - self.irc.takeMsg() # ignore comment request comment cb.bans['#test'][0].who = 'op' # replace hostmask by nick print 'waiting 2 secs..' time.sleep(2)