better supports of libera: added support for account-tag CAP, CHGHOST

This commit is contained in:
Nicolas Coevoet 2021-06-23 18:07:07 +00:00
parent c92c1ded5f
commit f6ff5b8128

View File

@ -990,6 +990,11 @@ class Chan (object):
L.append(nick) L.append(nick)
for nick in L: for nick in L:
n = self.ircd.getNick(self.ircd.irc,nick) 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')) m = match(value,n,self.ircd.irc,ct.registryValue('resolveIp'))
if m: if m:
i.affects.append(n.prefix) i.affects.append(n.prefix)
@ -1903,11 +1908,15 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
results = [] results = []
i = self.getIrc(irc) i = self.getIrc(irc)
for nick in list(irc.state.channels[channel].users): for nick in list(irc.state.channels[channel].users):
if nick in i.nicks: n = self.getNick(irc,nick)
n = self.getNick(irc,nick) if not n.prefix:
m = match(pattern,n,irc,self.registryValue('resolveIp')) try:
if m: n.setPrefix(self.ircd.irc.state.nickToHostmask(nick))
results.append('[%s - %s]' % (nick,m)) except:
pass
m = match(pattern,n,irc,self.registryValue('resolveIp'))
if m:
results.append('[%s - %s]' % (nick,m))
if len(results): if len(results):
irc.reply('%s user(s): %s' % (len(results),' '.join(results))) irc.reply('%s user(s): %s' % (len(results),' '.join(results)))
else: else:
@ -2254,6 +2263,7 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
# init irc db # init irc db
if not irc.network in self._ircs: if not irc.network in self._ircs:
i = self._ircs[irc.network] = Ircd (irc,self.registryValue('logsSize')) i = self._ircs[irc.network] = Ircd (irc,self.registryValue('logsSize'))
irc.queueMsg(ircmsgs.IrcMsg('CAP REQ :account-tag'))
return self._ircs[irc.network] return self._ircs[irc.network]
def getChan (self,irc,channel): def getChan (self,irc,channel):
@ -2675,6 +2685,8 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
self._logChan(irc,channel,"[%s] is ready" % ircutils.bold(channel)) self._logChan(irc,channel,"[%s] is ready" % ircutils.bold(channel))
else: else:
self._logChan(irc,channel,"[%s] is ready" % channel) self._logChan(irc,channel,"[%s] is ready" % channel)
for nick in list(irc.state.channels[channel].users):
chan.nicks[nick] = True
self._tickle(irc) self._tickle(irc)
def _logChan (self,irc,channel,message): def _logChan (self,irc,channel,message):
@ -2761,6 +2773,14 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
break break
self._tickle(irc) self._tickle(irc)
def doChghost (self,irc,msg):
n = self.getNick(irc,msg.nick)
(user, host) = msg.args
hostmask = '%s!%s@%s' % (msg.nick, user, host)
n.setPrefix(hostmask)
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
def doJoin (self,irc,msg): def doJoin (self,irc,msg):
channels = msg.args[0].split(',') channels = msg.args[0].split(',')
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
@ -2769,14 +2789,19 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if len(msg.args) == 3: if len(msg.args) == 3:
n.setRealname(msg.args[2]) n.setRealname(msg.args[2])
n.setAccount(msg.args[1]) n.setAccount(msg.args[1])
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
if msg.nick == irc.nick: if msg.nick == irc.nick:
self.forceTickle = True self.forceTickle = True
self._tickle(irc) self._tickle(irc)
return return
if self.registryValue('resolveIp') and not '/' in msg.prefix.split('@')[1] and n.ip == None: if not '/' in msg.prefix.split('@')[1] and n.ip == None:
t = world.SupyThread(target=self.resolve,name=format('Resolving %s for %s', msg.prefix, channels),args=(irc,channels,msg.prefix)) if self.registryValue('resolveIp'):
t.setDaemon(True) t = world.SupyThread(target=self.resolve,name=format('Resolving %s for %s', msg.prefix, channels),args=(irc,channels,msg.prefix))
t.start() t.setDaemon(True)
t.start()
elif utils.net.isIP(msg.prefix.split('@')[1]):
n.setIp(msg.prefix.split('@')[1])
for channel in channels: for channel in channels:
if ircutils.isChannel(channel) and channel in irc.state.channels: if ircutils.isChannel(channel) and channel in irc.state.channels:
bests = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp')) bests = getBestPattern(n,irc,self.registryValue('useIpForGateway',channel=channel),self.registryValue('resolveIp'))
@ -3234,6 +3259,8 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if msg.nick == irc.nick: if msg.nick == irc.nick:
return return
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp')) patterns = getBestPattern(n,irc,self.registryValue('useIpForGateway'),self.registryValue('resolveIp'))
best = False best = False
if len(patterns): if len(patterns):
@ -3341,6 +3368,8 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
# server msgs or plugin reload, or state not ready # server msgs or plugin reload, or state not ready
self._tickle(irc) self._tickle(irc)
return return
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
for channel in recipients.split(','): for channel in recipients.split(','):
if channel.startswith('@'): if channel.startswith('@'):
channel = channel.replace('@','',1) channel = channel.replace('@','',1)
@ -3583,6 +3612,8 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
if ircutils.isUserHostmask(msg.prefix): if ircutils.isUserHostmask(msg.prefix):
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
channel = msg.args[0] channel = msg.args[0]
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
if channel in irc.state.channels: if channel in irc.state.channels:
if n: if n:
n.addLog(channel,'sets topic "%s"' % msg.args[1]) n.addLog(channel,'sets topic "%s"' % msg.args[1])
@ -3652,6 +3683,8 @@ class ChanTracker(callbacks.Plugin,plugins.ChannelDBHandler):
# prevent server.netsplit to create a Nick # prevent server.netsplit to create a Nick
n = self.getNick(irc,msg.nick) n = self.getNick(irc,msg.nick)
n.setPrefix(msg.prefix) n.setPrefix(msg.prefix)
if 'account' in msg.server_tags:
n.setAccount(msg.server_tags['account'])
# umode otherwise # umode otherwise
db = self.getDb(irc.network) db = self.getDb(irc.network)
c = db.cursor() c = db.cursor()