mirror of
https://github.com/ncoevoet/ChanTracker.git
synced 2025-04-25 20:41:19 -05:00
Try harder at attaching hostmasks to nicks.
This commit is contained in:
parent
546cbab98d
commit
bbd7ace6ca
109
plugin.py
109
plugin.py
@ -360,12 +360,17 @@ class Ircd(object):
|
||||
self.channels[channel] = Chan(self, channel)
|
||||
return self.channels[channel]
|
||||
|
||||
def getNick(self, irc, nick):
|
||||
def getNick(self, irc, nick, raw=False):
|
||||
if not (nick and irc):
|
||||
return None
|
||||
self.irc = irc
|
||||
if nick not in self.nicks:
|
||||
self.nicks[nick] = Nick(self.logsSize)
|
||||
if not (self.nicks[nick].prefix or raw):
|
||||
try:
|
||||
self.nicks[nick].setPrefix(irc.state.nickToHostmask(nick))
|
||||
except:
|
||||
pass
|
||||
return self.nicks[nick]
|
||||
|
||||
def getItem(self, irc, uid):
|
||||
@ -1073,7 +1078,7 @@ class Chan(object):
|
||||
|
||||
def addItem(self, mode, value, by, when, db, checkUser=True, ct=None):
|
||||
# eqIb(+*) (-ov) pattern prefix when
|
||||
# mode : eqIb -ov + ?
|
||||
# mode: eqIb -ov + ?
|
||||
if mode != 'm':
|
||||
l = self.getItemsFor(mode)
|
||||
else:
|
||||
@ -1110,16 +1115,8 @@ class Chan(object):
|
||||
# leave channel user list management to supybot
|
||||
ns = []
|
||||
if self.name in self.ircd.irc.state.channels and checkUser:
|
||||
L = []
|
||||
for nick in list(self.ircd.irc.state.channels[self.name].users):
|
||||
L.append(nick)
|
||||
for nick in L:
|
||||
n = self.ircd.getNick(self.ircd.irc, nick)
|
||||
if not n.prefix:
|
||||
try:
|
||||
n.setPrefix(self.ircd.irc.state.nickToHostmask(nick))
|
||||
except:
|
||||
pass
|
||||
m = match(value, n, self.ircd.irc, ct.registryValue('resolveIp'))
|
||||
if m:
|
||||
i.affects.append(n.prefix)
|
||||
@ -1307,7 +1304,7 @@ class Nick(object):
|
||||
self.account = None
|
||||
self.logSize = logSize
|
||||
self.logs = []
|
||||
# log format :
|
||||
# log format:
|
||||
# target can be a channel, or 'ALL' when it's related to nick itself
|
||||
# (account changes, nick changes, host changes, etc)
|
||||
# [float(timestamp),target,message]
|
||||
@ -2150,11 +2147,6 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
i = self.getIrc(irc)
|
||||
for nick in list(irc.state.channels[channel].users):
|
||||
n = self.getNick(irc, nick)
|
||||
if not n.prefix:
|
||||
try:
|
||||
n.setPrefix(self.ircd.irc.state.nickToHostmask(nick))
|
||||
except:
|
||||
pass
|
||||
m = match(pattern, n, irc, self.registryValue('resolveIp'))
|
||||
if m:
|
||||
results.append('[%s - %s]' % (nick, m))
|
||||
@ -2645,7 +2637,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
optional('letter'), optional('positiveInt')])
|
||||
|
||||
def getIrcdMode(self, irc, mode, pattern):
|
||||
# here we try to know which kind of mode and pattern should be computed :
|
||||
# here we try to know which kind of mode and pattern should be computed:
|
||||
# based on supported modes and extbans on the ircd
|
||||
# works for q in charybdis, and should work for unreal and inspire
|
||||
if 'chanmodes' in irc.state.supported and mode == 'q':
|
||||
@ -2827,8 +2819,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
self.forceTickle = True
|
||||
return i.getChan(irc, channel)
|
||||
|
||||
def getNick(self, irc, nick):
|
||||
return self.getIrc(irc).getNick(irc, nick)
|
||||
def getNick(self, irc, nick, raw=True):
|
||||
return self.getIrc(irc).getNick(irc, nick, raw)
|
||||
|
||||
def makeDb(self, filename):
|
||||
"""Create a database and connect to it."""
|
||||
@ -3217,7 +3209,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
def do352(self, irc, msg):
|
||||
# WHO $channel
|
||||
(nick, ident, host) = (msg.args[5], msg.args[2], msg.args[3])
|
||||
n = self.getNick(irc, nick)
|
||||
n = self.getNick(irc, nick, raw=True)
|
||||
n.setPrefix('%s!%s@%s' % (nick, ident, host))
|
||||
chan = self.getChan(irc, msg.args[1])
|
||||
chan.nicks[nick] = True
|
||||
@ -3236,7 +3228,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
status, account, realname) = msg.args
|
||||
if account == '0':
|
||||
account = None
|
||||
n = self.getNick(irc, nick)
|
||||
n = self.getNick(irc, nick, raw=True)
|
||||
n.setPrefix('%s!%s@%s' % (nick, ident, host))
|
||||
if self.registryValue('resolveIp') and n.ip is None and ip != '255.255.255.255':
|
||||
# validate ip
|
||||
@ -3309,7 +3301,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
self._tickle(irc)
|
||||
|
||||
def doChghost(self, irc, msg):
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
(user, host) = msg.args
|
||||
hostmask = '%s!%s@%s' % (msg.nick, user, host)
|
||||
n.setPrefix(hostmask)
|
||||
@ -3318,7 +3310,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
|
||||
def doJoin(self, irc, msg):
|
||||
channels = msg.args[0].split(',')
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
i = self.getIrc(irc)
|
||||
if len(msg.args) == 3:
|
||||
@ -3429,7 +3421,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
isBot = msg.prefix == irc.prefix
|
||||
channels = msg.args[0].split(',')
|
||||
i = self.getIrc(irc)
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
reason = ''
|
||||
if len(msg.args) == 2:
|
||||
@ -3642,7 +3634,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
self._ircs = ircutils.IrcDict()
|
||||
return
|
||||
if not isBot:
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
bests = getBestPattern(n, irc, self.registryValue(
|
||||
'useIpForGateway'), self.registryValue('resolveIp'))
|
||||
best = None
|
||||
@ -3716,15 +3709,13 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
oldNick = msg.prefix.split('!')[0]
|
||||
newNick = msg.args[0]
|
||||
i = self.getIrc(irc)
|
||||
n = None
|
||||
if oldNick in i.nicks:
|
||||
n = self.getNick(irc, oldNick)
|
||||
n = self.getNick(irc, oldNick, raw=True)
|
||||
del i.nicks[oldNick]
|
||||
if n.prefix:
|
||||
prefixNew = '%s!%s' % (newNick, n.prefix.split('!')[1])
|
||||
n.setPrefix(prefixNew)
|
||||
i.nicks[newNick] = n
|
||||
n = self.getNick(irc, newNick)
|
||||
n = self.getNick(irc, newNick, raw=True)
|
||||
prefixNew = '%s!%s' % (newNick, msg.prefix.split('!')[1])
|
||||
n.setPrefix(prefixNew)
|
||||
n.addLog('ALL', '%s is now known as %s' % (oldNick, newNick))
|
||||
best = None
|
||||
patterns = getBestPattern(n, irc, self.registryValue(
|
||||
@ -3774,8 +3765,9 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
n = None
|
||||
nick = None
|
||||
if ircutils.isUserHostmask(msg.prefix):
|
||||
nick = ircutils.nickFromHostmask(msg.prefix)
|
||||
n = self.getNick(irc, nick)
|
||||
nick = msg.nick
|
||||
n = self.getNick(irc, nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
acc = msg.args[0]
|
||||
old = n.account
|
||||
if acc == '*':
|
||||
@ -3784,7 +3776,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
n.addLog('ALL', '%s is now identified as %s' % (old, acc))
|
||||
else:
|
||||
return
|
||||
if n and n.account and n.ip and nick:
|
||||
if nick and n and n.account and n.ip:
|
||||
i = self.getIrc(irc)
|
||||
for channel in irc.state.channels:
|
||||
if self.registryValue('checkEvade', channel=channel, network=irc.network):
|
||||
@ -3832,7 +3824,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
else:
|
||||
if msg.nick == irc.nick:
|
||||
return
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
if 'account' in msg.server_tags:
|
||||
n.setAccount(msg.server_tags['account'])
|
||||
patterns = getBestPattern(n, irc, self.registryValue(
|
||||
@ -3894,6 +3887,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
self._tickle(irc)
|
||||
|
||||
def _isVip(self, irc, channel, n):
|
||||
if not n.prefix:
|
||||
return False
|
||||
if n.prefix == irc.prefix:
|
||||
return 'me!'
|
||||
if ircdb.checkCapability(n.prefix, 'trusted'):
|
||||
@ -3925,7 +3920,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
patterns = None
|
||||
i = self.getIrc(irc)
|
||||
if ircutils.isUserHostmask(msg.prefix):
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
patterns = getBestPattern(n, irc, self.registryValue(
|
||||
'useIpForGateway'), self.registryValue('resolveIp'))
|
||||
if len(patterns):
|
||||
@ -4013,7 +4009,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
if isMatch:
|
||||
(m, p) = self.getIrcdMode(irc, isPattern.mode, best)
|
||||
self._act(irc, channel, m, p, isPattern.duration,
|
||||
'matches #%s : %s' % (isPattern.uid, isMatch[1]), msg.nick)
|
||||
'matches #%s: %s' % (isPattern.uid, isMatch[1]), msg.nick)
|
||||
isBad = self._isBad(irc, channel, best)
|
||||
chan.countpattern(isPattern.uid, self.getDb(irc.network))
|
||||
self.forceTickle = True
|
||||
@ -4198,7 +4194,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
return
|
||||
n = None
|
||||
if ircutils.isUserHostmask(msg.prefix):
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
if 'account' in msg.server_tags:
|
||||
n.setAccount(msg.server_tags['account'])
|
||||
channel = msg.args[0]
|
||||
@ -4247,14 +4244,11 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
for channel in irc.state.channels:
|
||||
if b in irc.state.channels[channel].bans \
|
||||
and mode in self.registryValue('kickMode', channel=channel, network=irc.network) \
|
||||
and not target.startswith('m:'):
|
||||
L = []
|
||||
and self.registryValue('kickOnMode', channel=channel, network=irc.network):
|
||||
for nick in list(irc.state.channels[channel].users):
|
||||
L.append(nick)
|
||||
for nick in L:
|
||||
isVip = self._isVip(irc, channel, self.getNick(irc, nick))
|
||||
n = self.getNick(irc, nick)
|
||||
isVip = self._isVip(irc, channel, n)
|
||||
if not isVip:
|
||||
n = self.getNick(irc, nick)
|
||||
m = match(target, n, irc, self.registryValue('resolveIp'))
|
||||
if m:
|
||||
if len(kicks) < self.registryValue('kickMax', channel=channel, network=irc.network):
|
||||
@ -4274,7 +4268,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
i = self.getIrc(irc)
|
||||
if ircutils.isUserHostmask(msg.prefix):
|
||||
# prevent server.netsplit to create a Nick
|
||||
n = self.getNick(irc, msg.nick)
|
||||
n = self.getNick(irc, msg.nick, raw=True)
|
||||
n.setPrefix(msg.prefix)
|
||||
if 'account' in msg.server_tags:
|
||||
n.setAccount(msg.server_tags['account'])
|
||||
@ -4323,7 +4317,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
if item and len(item.affects):
|
||||
for affected in item.affects:
|
||||
nick = affected.split('!')[0]
|
||||
isVip = self._isVip(irc, channel, self.getNick(irc, nick))
|
||||
n = self.getNick(irc, msg.nick)
|
||||
isVip = self._isVip(irc, channel, n)
|
||||
if isVip:
|
||||
continue
|
||||
if m in self.registryValue('modesToAsk', channel=channel, network=irc.network) \
|
||||
@ -4335,8 +4330,7 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
if len(items):
|
||||
for active in items:
|
||||
active = items[active]
|
||||
if match(active.value, self.getNick(irc, nick),
|
||||
irc, self.registryValue('resolveIp')):
|
||||
if match(active.value, n, irc, self.registryValue('resolveIp')):
|
||||
tolift.append(active)
|
||||
kicked = False
|
||||
# and not value.startswith(self.getIrcdExtbans(irc)) works for unreal
|
||||
@ -4410,8 +4404,8 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
if nick in irc.state.channels[channel].voices:
|
||||
chan.queue.enqueue(('-v', nick))
|
||||
if m in self.registryValue('kickMode', channel=channel, network=irc.network) \
|
||||
and not value.startswith('m:') and self.registryValue(
|
||||
'kickOnMode', channel=channel, network=irc.network):
|
||||
and self.registryValue('kickOnMode', channel=channel, network=irc.network) \
|
||||
and not value.startswith('m:'):
|
||||
self.hasExtendedSharedBan(irc, channel, value, m)
|
||||
# bot just got op
|
||||
if m == 'o' and value == irc.nick:
|
||||
@ -4583,16 +4577,15 @@ class ChanTracker(callbacks.Plugin, plugins.ChannelDBHandler):
|
||||
def do478(self, irc, msg):
|
||||
# message when ban list is full after adding something to eqIb list
|
||||
(nick, channel, ban, info) = msg.args
|
||||
if self.registryValue('logChannel', channel=channel, network=irc.network) in irc.state.channels:
|
||||
L = []
|
||||
for user in list(irc.state.channels[self.registryValue('logChannel', channel=channel, network=irc.network)].users):
|
||||
L.append(user)
|
||||
logChannel = self.registryValue('logChannel', channel=channel, network=irc.network)
|
||||
if logChannel in irc.state.channels:
|
||||
ops = list(irc.state.channels[logChannel].users)
|
||||
if self.registryValue('useColorForAnnounces', channel=channel, network=irc.network):
|
||||
self._logChannel(irc, channel, '[%s] %s : %s' % (ircutils.bold(
|
||||
channel), ircutils.bold(ircutils.mircColor(info, 'red')), ' '.join(L)))
|
||||
self._logChannel(irc, channel, '[%s] %s: %s' % (ircutils.bold(
|
||||
channel), ircutils.bold(ircutils.mircColor(info, 'red')), ' '.join(ops)))
|
||||
else:
|
||||
self._logChan(irc, channel, '[%s] %s : %s' % (
|
||||
channel, info, ' '.join(L)))
|
||||
self._logChan(irc, channel, '[%s] %s: %s' % (
|
||||
channel, info, ' '.join(ops)))
|
||||
self._tickle(irc)
|
||||
|
||||
# protection features
|
||||
|
Loading…
x
Reference in New Issue
Block a user