Add option to exempt voiced users from channel protections.

This commit is contained in:
Krytarik Raido 2022-10-12 18:34:04 +02:00
parent 4c53d28f11
commit 2646838ad7
2 changed files with 25 additions and 19 deletions

View File

@ -86,6 +86,9 @@ conf.registerChannelValue(ChanTracker, 'triggerOps',
conf.registerChannelValue(ChanTracker, 'allowOpToConfig',
registry.Boolean(False, """grant channel operators the ability to configure some ChanTracker protections for their channel"""))
conf.registerChannelValue(ChanTracker, 'ignoreVoicedUser',
registry.Boolean(False, """exempt voiced users from channel protections"""))
conf.registerChannelValue(ChanTracker, 'opCommand',
registry.String("PRIVMSG ChanServ :OP $channel $nick", """command used to obtain channel operator status"""), opSettable=False)

View File

@ -2232,7 +2232,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
tell if <nick> is vip in <channel>; mostly used for debugging"""
i = self.getIrc(irc)
if nick in i.nicks:
irc.reply(self._isVip(irc, channel, self.getNick(irc, nick)))
isVip = self._isVip(irc, channel, self.getNick(irc, nick))
irc.reply(str(isVip))
else:
irc.reply('nick not found')
self._tickle(irc)
@ -2254,7 +2255,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
if p.startswith('$a:'):
best = p
break
irc.reply(chan.isWrong(best))
isWrong = chan.isWrong(best)
irc.reply(str(isWrong))
else:
irc.reply('nick not found')
self._tickle(irc)
@ -3771,7 +3773,6 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
isNick = self._isSomething(irc, channel, best, 'nick')
if isNick:
isBad = self._isBad(irc, channel, best)
kind = None
if isBad:
kind = 'bad'
else:
@ -3878,8 +3879,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
break
chan = self.getChan(irc, channel)
n.addLog(channel, 'NOTICE | %s' % text)
isVip = self._isVip(irc, channel, n)
if not isVip:
if not self._isVip(irc, channel, n):
isNotice = self._isSomething(irc, channel, best, 'notice')
isBad = False
if isNotice:
@ -3924,6 +3924,9 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
protected = ircdb.makeChannelCapability(channel, 'protected')
if ircdb.checkCapability(n.prefix, protected):
return True
if self.registryValue('ignoreVoicedUser', channel=channel, network=irc.network) \
and irc.state.channels[channel].isVoicePlus(n.prefix.split('!')[0]):
return True
return False
def doPrivmsg(self, irc, msg):
@ -3977,8 +3980,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
message = '- %s -' % text
n.addLog(channel, message)
# protection features
isVip = self._isVip(irc, channel, n)
if not isVip:
if not self._isVip(irc, channel, n):
isCtcp = False
if isCtcpMsg and not isAction:
isCtcp = self._isSomething(irc, channel, best, 'ctcp')
@ -4034,8 +4036,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
self._act(irc, channel, m, p, isPattern.duration,
'matches #%s : %s' % (isPattern.uid, isMatch[1]), msg.nick)
isBad = self._isBad(irc, channel, best)
self.forceTickle = True
chan.countpattern(isPattern.uid, self.getDb(irc.network))
self.forceTickle = True
elif not isRepeat:
key = 'pattern%s' % channel
if key in chan.repeatLogs:
@ -4057,7 +4059,6 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
if not (isPattern or isTemporaryPattern) \
and (isFlood or isLowFlood or isRepeat or isHilight or isCap or isCtcp):
isBad = self._isBad(irc, channel, best)
kind = None
duration = 0
if isBad:
kind = 'bad'
@ -4272,7 +4273,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
for nick in list(irc.state.channels[channel].users):
L.append(nick)
for nick in L:
if not self._isVip(irc, channel, self.getNick(irc, nick)):
isVip = self._isVip(irc, channel, self.getNick(irc, nick))
if not isVip:
n = self.getNick(irc, nick)
m = match(target, n, irc, self.registryValue('resolveIp'))
if m:
@ -4342,7 +4344,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
if item and len(item.affects):
for affected in item.affects:
nick = affected.split('!')[0]
if self._isVip(irc, channel, self.getNick(irc, nick)):
isVip = self._isVip(irc, channel, self.getNick(irc, nick))
if isVip:
continue
if m in self.registryValue('modesToAsk', channel=channel, network=irc.network) \
and self.registryValue('doActionAgainstAffected', channel=channel, network=irc.network) \