BugFix: Bantracker does not parse multiple modes properly (LP: #495555)

Allow Bantracker to search bans by ID
This commit is contained in:
Terence Simpson 2009-12-11 17:53:15 +00:00
parent ac6fd47a8b
commit 6ffc89d007
2 changed files with 39 additions and 34 deletions

View File

@ -177,8 +177,12 @@ for h in [['Channel',0], ['Nick/Mask',1], ['Operator',2], ['Time',6]]:
print '<th>Log</th></tr>' print '<th>Log</th></tr>'
# Select and filter bans # Select and filter bans
cur.execute("SELECT channel,mask,operator,time,removal,removal_op,id FROM bans ORDER BY id DESC") def getBans(id=None):
bans = cur.fetchall() if id == None:
cur.execute("SELECT channel,mask,operator,time,removal,removal_op,id FROM bans ORDER BY id DESC")
else:
cur.execute("SELECT channel,mask,operator,time,removal,removal_op,id FROM bans ORDER BY id DESC WHERE id = %d", id)
return cur.fetchall()
def myfilter(item, regex, kick, ban, oldban, mute, oldmute, floods, operator, channel): def myfilter(item, regex, kick, ban, oldban, mute, oldmute, floods, operator, channel):
if operator: if operator:
@ -213,22 +217,29 @@ def getQueryTerm(query, term):
return (query, ret) return (query, ret)
return (query, None) return (query, None)
bans = []
if form.has_key('query'): if form.has_key('query'):
k = b = ob = m = om = fb = False try:
oper = chan = False bans = getBans(int(form['query'].value))
if form.has_key('kicks'): k = True start = 0; end = 1
if form.has_key('oldbans'): ob = True except:
if form.has_key('bans'): b = True bans = getBans()
if form.has_key('oldmutes'): om = True k = b = ob = m = om = fb = False
if form.has_key('mutes'): m = True oper = chan = False
if form.has_key('floods'): fb = True if form.has_key('kicks'): k = True
if "chan:" in form['query'].value: if form.has_key('oldbans'): ob = True
(form['query'].value, chan) = getQueryTerm(form['query'].value, "chan:") if form.has_key('bans'): b = True
if "oper:" in form['query'].value: if form.has_key('oldmutes'): om = True
(form['query'].value, oper) = getQueryTerm(form['query'].value, "oper:") if form.has_key('mutes'): m = True
regex = re.compile(re.escape(form['query'].value).replace('\%','.*'), re.DOTALL | re.I) if form.has_key('floods'): fb = True
bans = filter(lambda x: myfilter(x, regex, k, b, ob, m, om, fb, oper, chan), bans) if "chan:" in form['query'].value:
start = 0; end = len(bans) (form['query'].value, chan) = getQueryTerm(form['query'].value, "chan:")
if "oper:" in form['query'].value:
(form['query'].value, oper) = getQueryTerm(form['query'].value, "oper:")
regex = re.compile(re.escape(form['query'].value).replace('\%','.*'), re.DOTALL | re.I)
bans = filter(lambda x: myfilter(x, regex, k, b, ob, m, om, fb, oper, chan), bans)
start = 0; end = len(bans)
else: else:
page = 0 page = 0
try: try:

View File

@ -444,23 +444,17 @@ class Bantracker(callbacks.Plugin):
'*** %s sets mode: %s %s\n' % '*** %s sets mode: %s %s\n' %
(msg.nick or msg.prefix, msg.args[1], (msg.nick or msg.prefix, msg.args[1],
' '.join(msg.args[2:]))) ' '.join(msg.args[2:])))
if 'b' in msg.args[1] or 'd' in msg.args[1]: modes = ircutils.separateModes(msg.args[1:])
i = 2 for param in modes:
plusmin = False if param == '+b':
for c in msg.args[1]: comment = self.getHostFromBan(irc, msg, msg.args[i])
if c == '-': plusmin = False self.doKickban(irc, channel, msg.nick, msg.args[i], extra_comment=comment)
elif c == '+': plusmin = True elif param == '-b':
else: self.doUnban(irc,channel, msg.nick, msg.args[i])
if c == 'b': elif param == '+d':
if plusmin: self.doKickban(irc, channel, msg.nick, msg.args[i] + ' (realname)')
comment = self.getHostFromBan(irc, msg, msg.args[i]) elif param == '-d':
self.doKickban(irc, channel, msg.nick, msg.args[i], extra_comment=comment) self.doUnban(irc,channel, msg.nick, msg.args[i] + ' (realname)')
else: self.doUnban(irc,channel, msg.nick, msg.args[i])
i += 1
if c == 'd':
if plusmin: self.doKickban(irc, channel, msg.nick, msg.args[i] + ' (realname)')
else: self.doUnban(irc,channel, msg.nick, msg.args[i] + ' (realname)')
i += 1
def getHostFromBan(self, irc, msg, mask): def getHostFromBan(self, irc, msg, mask):
if irc not in self.lastStates: if irc not in self.lastStates: