mirror of
https://github.com/ncoevoet/ChanTracker.git
synced 2025-04-26 13:01:06 -05:00
added new registry entry modeD, which can be customized when using mode D,
added shareable temporary patterns, and two methods to deal with them, addtmp, rmtmp
This commit is contained in:
parent
af16cbf9de
commit
922e6b83ab
@ -28,6 +28,8 @@ Note that you may need a newer version of Limnoria than your distribution provid
|
|||||||
!addregexpattern [<channel>] <limit> <life> <mode>(qbeId) [<years>y] [<weeks>w] [<days>d] [<hours>h] [<minutes>m] [<seconds>s] /<pattern>/) add a <pattern> which triggers <mode> for <duration> if the <pattern> appears more than <limit> (0 for immediate action) during <life> in seconds
|
!addregexpattern [<channel>] <limit> <life> <mode>(qbeId) [<years>y] [<weeks>w] [<days>d] [<hours>h] [<minutes>m] [<seconds>s] /<pattern>/) add a <pattern> which triggers <mode> for <duration> if the <pattern> appears more than <limit> (0 for immediate action) during <life> in seconds
|
||||||
!rmpattern [<channel>] <id> [<id>] remove patterns
|
!rmpattern [<channel>] <id> [<id>] remove patterns
|
||||||
!lspattern [<channel>] [<id|pattern>] return patterns in <channel> filtered by optional <pattern> or <id>
|
!lspattern [<channel>] [<id|pattern>] return patterns in <channel> filtered by optional <pattern> or <id>
|
||||||
|
!addtmp [<channel>] <pattern> add temporary pattern which follows repeat punishments
|
||||||
|
!rmtmp [<channel>] remove temporary patterns if any
|
||||||
|
|
||||||
!cflood [<channel>] [<permit>] [<life>] [<mode>] [<duration>] return channel protections configuration
|
!cflood [<channel>] [<permit>] [<life>] [<mode>] [<duration>] return channel protections configuration
|
||||||
!crepeat [<channel>] [<permit>] [<life>] [<mode>] [<duration>] [<minimum>] [<probability>] [<count>] [<patternLength>] [<patternLife>] return channel protections configuration, <probablity> is a float between 0 and 1
|
!crepeat [<channel>] [<permit>] [<life>] [<mode>] [<duration>] [<minimum>] [<probability>] [<count>] [<patternLength>] [<patternLife>] return channel protections configuration, <probablity> is a float between 0 and 1
|
||||||
|
@ -61,6 +61,9 @@ conf.registerGlobalValue(ChanTracker, 'announceNagInterval',
|
|||||||
conf.registerGlobalValue(ChanTracker, 'resolveIp',
|
conf.registerGlobalValue(ChanTracker, 'resolveIp',
|
||||||
registry.Boolean(True, """trying to resolve host's ip with socket, could add latency"""))
|
registry.Boolean(True, """trying to resolve host's ip with socket, could add latency"""))
|
||||||
|
|
||||||
|
conf.registerGlobalValue(ChanTracker, 'modeD',
|
||||||
|
registry.String("", """special mode if you want to use some specific stuff $hostmask (*!*@*) $klinemask (*@*) $host $channel $reason and $duration are available"""))
|
||||||
|
|
||||||
# per channel settings
|
# per channel settings
|
||||||
|
|
||||||
conf.registerChannelValue(ChanTracker, 'useAccountBanIfPossible',
|
conf.registerChannelValue(ChanTracker, 'useAccountBanIfPossible',
|
||||||
@ -158,6 +161,9 @@ conf.registerChannelValue(ChanTracker, 'announceCtcp',
|
|||||||
conf.registerChannelValue(ChanTracker, 'announceNagMode',
|
conf.registerChannelValue(ChanTracker, 'announceNagMode',
|
||||||
registry.CommaSeparatedListOfStrings([], """bot will announce that channel has such mode at announceNagInterval"""))
|
registry.CommaSeparatedListOfStrings([], """bot will announce that channel has such mode at announceNagInterval"""))
|
||||||
|
|
||||||
|
conf.registerChannelValue(ChanTracker, 'announceRepeatPattern',
|
||||||
|
registry.Boolean(True, """announce repeat pattern created to logChannel"""))
|
||||||
|
|
||||||
# others settings
|
# others settings
|
||||||
|
|
||||||
conf.registerChannelValue(ChanTracker, 'doNothingAboutOwnOpStatus',
|
conf.registerChannelValue(ChanTracker, 'doNothingAboutOwnOpStatus',
|
||||||
@ -267,7 +273,8 @@ conf.registerChannelValue(ChanTracker, 'repeatPatternMinimum',
|
|||||||
conf.registerChannelValue(ChanTracker, 'repeatPatternLife',
|
conf.registerChannelValue(ChanTracker, 'repeatPatternLife',
|
||||||
registry.PositiveInteger(300, """duration of pattern life"""))
|
registry.PositiveInteger(300, """duration of pattern life"""))
|
||||||
|
|
||||||
|
conf.registerChannelValue(ChanTracker, 'shareComputedPatternID',
|
||||||
|
registry.Integer(-1, """share computed patterns accross channels using the same ID, -1 to disable"""))
|
||||||
# YES IT'S ANNOYING
|
# YES IT'S ANNOYING
|
||||||
|
|
||||||
conf.registerChannelValue(ChanTracker, 'capPermit',
|
conf.registerChannelValue(ChanTracker, 'capPermit',
|
||||||
|
70
plugin.py
70
plugin.py
@ -2342,6 +2342,26 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
irc.reply('%s' % ', '.join(results))
|
irc.reply('%s' % ', '.join(results))
|
||||||
rmmode = wrap(rmmode, ['owner', commalist('int')])
|
rmmode = wrap(rmmode, ['owner', commalist('int')])
|
||||||
|
|
||||||
|
def rmtmp(self, irc, msg, args, channel):
|
||||||
|
"""[<channel>]
|
||||||
|
|
||||||
|
remove temporary patterns if any"""
|
||||||
|
chan = self.getChan(irc, channel)
|
||||||
|
key = 'pattern%s' % channel
|
||||||
|
if key in chan.repeatLogs:
|
||||||
|
life = self.registryValue('repeatPatternLife', channel=channel)
|
||||||
|
chan.repeatLogs[key] = utils.structures.TimeoutQueue(life)
|
||||||
|
irc.replySuccess()
|
||||||
|
rmtmp = wrap(rmtmp, ['op'])
|
||||||
|
|
||||||
|
def addtmp(self, irc, msg, args, channel, pattern):
|
||||||
|
"""[<channel>] <pattern>
|
||||||
|
|
||||||
|
add temporary pattern, which follows repeat punishments"""
|
||||||
|
self._addTemporaryPattern(irc, channel, pattern, msg.nick, True, False)
|
||||||
|
irc.replySuccess()
|
||||||
|
addtmp = wrap(addtmp, ['op', 'text'])
|
||||||
|
|
||||||
def cflood(self, irc, msg, args, channel, permit, life, mode, duration):
|
def cflood(self, irc, msg, args, channel, permit, life, mode, duration):
|
||||||
"""[<channel>] [<permit>] [<life>] [<mode>] [<duration>]
|
"""[<channel>] [<permit>] [<life>] [<mode>] [<duration>]
|
||||||
|
|
||||||
@ -4540,6 +4560,19 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
# protection features
|
# protection features
|
||||||
|
|
||||||
def _act(self, irc, channel, mode, mask, duration, reason):
|
def _act(self, irc, channel, mode, mask, duration, reason):
|
||||||
|
if mode == 'D':
|
||||||
|
action = self.registryValue('modeD')
|
||||||
|
if len(action):
|
||||||
|
s = s.replace('$channel', channel)
|
||||||
|
s = s.replace('$hostmask', mask)
|
||||||
|
(n, i, h) = ircutils.splitHostmask(mask)
|
||||||
|
klinemask = '%s@%s' % (i, h)
|
||||||
|
s = s.replace('$klinemask', klinemask)
|
||||||
|
s = s.replace('$host', h)
|
||||||
|
s = s.replace('$duration', duration)
|
||||||
|
s = s.replace('$reason', reason)
|
||||||
|
irc.sendQueue(ircmsgs.IrcMsg(action))
|
||||||
|
return
|
||||||
if mode == 'd':
|
if mode == 'd':
|
||||||
if self.registryValue('logChannel', channel=channel) in irc.state.channels:
|
if self.registryValue('logChannel', channel=channel) in irc.state.channels:
|
||||||
announce = '[%s] debug %s %s %s %s'
|
announce = '[%s] debug %s %s %s %s'
|
||||||
@ -4687,21 +4720,38 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
count = count + 1
|
count = count + 1
|
||||||
return count > limit
|
return count > limit
|
||||||
|
|
||||||
def _addTemporaryPattern(self, irc, channel, pattern, level):
|
def _addTemporaryPattern(self, irc, channel, pattern, level, force, doNotLoop):
|
||||||
patternLength = self.registryValue(
|
patternLength = self.registryValue(
|
||||||
'repeatPatternMinimum', channel=channel)
|
'repeatPatternMinimum', channel=channel)
|
||||||
key = 'pattern%s' % channel
|
if patternLength < 0 and not force:
|
||||||
if patternLength < 0:
|
|
||||||
return
|
return
|
||||||
if len(pattern) < patternLength:
|
if len(pattern) < patternLength and not force:
|
||||||
return
|
return
|
||||||
|
self.log.info('%s adding pattern %s' % (level, pattern))
|
||||||
life = self.registryValue('repeatPatternLife', channel=channel)
|
life = self.registryValue('repeatPatternLife', channel=channel)
|
||||||
|
key = 'pattern%s' % channel
|
||||||
chan = self.getChan(irc, channel)
|
chan = self.getChan(irc, channel)
|
||||||
if not key in chan.repeatLogs or chan.repeatLogs[key].timeout != life:
|
if not key in chan.repeatLogs or chan.repeatLogs[key].timeout != life:
|
||||||
chan.repeatLogs[key] = utils.structures.TimeoutQueue(life)
|
chan.repeatLogs[key] = utils.structures.TimeoutQueue(life)
|
||||||
|
if self.registryValue('announceRepeatPattern', channel=channel):
|
||||||
|
if self.registryValue('useColorForAnnounces', channel=channel):
|
||||||
|
self._logChan(irc, channel, '[%s] pattern created "%s" (%s)' % (
|
||||||
|
ircutils.bold(channel), ircutils.mircColor(pattern, 'red'), level))
|
||||||
|
else:
|
||||||
self._logChan(irc, channel, '[%s] pattern created "%s" (%s)' % (
|
self._logChan(irc, channel, '[%s] pattern created "%s" (%s)' % (
|
||||||
channel, pattern, level))
|
channel, pattern, level))
|
||||||
chan.repeatLogs[key].enqueue(pattern)
|
chan.repeatLogs[key].enqueue(pattern)
|
||||||
|
if doNotLoop:
|
||||||
|
return
|
||||||
|
patternID = self.registryValue(
|
||||||
|
'shareComputedPatternID', channel=channel)
|
||||||
|
if patternID < 0:
|
||||||
|
return
|
||||||
|
for c in irc.state.channels:
|
||||||
|
if irc.isChannel(c) and not channel == c:
|
||||||
|
if patternID == self.registryValue('shareComputedPatternID', channel=c):
|
||||||
|
self._addTemporaryPattern(
|
||||||
|
irc, c, pattern, level, force, doNotLoop)
|
||||||
|
|
||||||
def _computePattern(self, message, logs, probability, patternLength):
|
def _computePattern(self, message, logs, probability, patternLength):
|
||||||
candidate = None
|
candidate = None
|
||||||
@ -4731,7 +4781,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
minimum = self.registryValue('repeatMinimum', channel=channel)
|
minimum = self.registryValue('repeatMinimum', channel=channel)
|
||||||
pattern = findPattern(message, count, minimum, 100 * probability)
|
pattern = findPattern(message, count, minimum, 100 * probability)
|
||||||
if pattern:
|
if pattern:
|
||||||
self._addTemporaryPattern(irc, channel, pattern, 'single msg')
|
self._addTemporaryPattern(
|
||||||
|
irc, channel, pattern, 'single msg', False, False)
|
||||||
if self._isSomething(irc, channel, key, 'repeat'):
|
if self._isSomething(irc, channel, key, 'repeat'):
|
||||||
return True
|
return True
|
||||||
patternLength = self.registryValue(
|
patternLength = self.registryValue(
|
||||||
@ -4745,7 +4796,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
chan.repeatLogs[key].enqueue(message)
|
chan.repeatLogs[key].enqueue(message)
|
||||||
if result:
|
if result:
|
||||||
if pattern:
|
if pattern:
|
||||||
self._addTemporaryPattern(irc, channel, pattern, 'single src')
|
self._addTemporaryPattern(
|
||||||
|
irc, channel, pattern, 'single src', False, False)
|
||||||
return result
|
return result
|
||||||
if not channel in chan.repeatLogs or chan.repeatLogs[channel].timeout != timeout:
|
if not channel in chan.repeatLogs or chan.repeatLogs[channel].timeout != timeout:
|
||||||
chan.repeatLogs[channel] = utils.structures.TimeoutQueue(timeout)
|
chan.repeatLogs[channel] = utils.structures.TimeoutQueue(timeout)
|
||||||
@ -4758,7 +4810,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
result = self._isSomething(irc, channel, channel, 'repeat')
|
result = self._isSomething(irc, channel, channel, 'repeat')
|
||||||
if result:
|
if result:
|
||||||
if pattern:
|
if pattern:
|
||||||
self._addTemporaryPattern(irc, channel, pattern, 'all src')
|
self._addTemporaryPattern(
|
||||||
|
irc, channel, pattern, 'all src', False, False)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _isCap(self, irc, channel, key, message):
|
def _isCap(self, irc, channel, key, message):
|
||||||
@ -4774,7 +4827,10 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def die(self):
|
def die(self):
|
||||||
|
try:
|
||||||
schedule.removeEvent('ChanTracker')
|
schedule.removeEvent('ChanTracker')
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
Class = ChanTracker
|
Class = ChanTracker
|
||||||
|
Loading…
x
Reference in New Issue
Block a user