3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-25 04:02:45 +01:00

ngircd: implement nick changing

This commit is contained in:
James Lu 2017-07-04 23:26:05 -07:00
parent 42a25300c4
commit b780070ee6

View File

@ -112,6 +112,18 @@ class NgIRCdProtocol(IRCS2SProtocol):
self.channels[channel].users.add(client)
self.users[client].channels.add(channel)
def nick(self, source, newnick):
"""Changes the nick of a PyLink client."""
if not self.is_internal_client(source):
raise LookupError('No such PyLink client exists.')
self._send_with_prefix(source, 'NICK %s' % newnick)
self.users[source].nick = newnick
# Update the nick TS for consistency with other protocols (it isn't actually used in S2S)
self.users[source].ts = int(time.time())
### Handlers
def handle_pass(self, source, command, args):
@ -145,25 +157,36 @@ class NgIRCdProtocol(IRCS2SProtocol):
return {'name': servername, 'sid': None, 'text': serverdesc}
def handle_nick(self, source, command, args):
# <- :ngircd.midnight.local NICK GL 1 ~gl localhost 1 +io :realname
nick = args[0]
assert source in self.servers, "Server %r tried to introduce nick %r but isn't in the servers index?" % (source, nick)
"""
Handles the NICK command, used for server introductions and nick changes.
"""
if len(args) >= 2:
# User introduction:
# <- :ngircd.midnight.local NICK GL 1 ~gl localhost 1 +io :realname
nick = args[0]
assert source in self.servers, "Server %r tried to introduce nick %r but isn't in the servers index?" % (source, nick)
ident = args[2]
host = args[3]
uid = self.uidgen.next_uid(prefix=nick)
realname = args[-1]
ident = args[2]
host = args[3]
uid = self.uidgen.next_uid(prefix=nick)
realname = args[-1]
ts = int(time.time())
self.users[uid] = User(nick, ts, uid, source, ident=ident, host=host, realname=realname)
parsedmodes = self.parse_modes(uid, [args[5]])
self.apply_modes(uid, parsedmodes)
ts = int(time.time())
self.users[uid] = User(nick, ts, uid, source, ident=ident, host=host, realname=realname)
parsedmodes = self.parse_modes(uid, [args[5]])
self.apply_modes(uid, parsedmodes)
# Add the nick to the list of users on its server; this is used for SQUIT tracking
self.servers[source].users.add(uid)
# Add the nick to the list of users on its server; this is used for SQUIT tracking
self.servers[source].users.add(uid)
return {'uid': uid, 'ts': ts, 'nick': nick, 'realhost': host, 'host': host, 'ident': ident,
'parse_as': 'UID', 'ip': '0.0.0.0'}
return {'uid': uid, 'ts': ts, 'nick': nick, 'realhost': host, 'host': host, 'ident': ident,
'parse_as': 'UID', 'ip': '0.0.0.0'}
else:
# Nick changes:
# <- :GL NICK :GL_
oldnick = self.users[source].nick
newnick = self.users[source].nick = args[0]
return {'newnick': newnick, 'oldnick': oldnick}
def handle_ping(self, source, command, args):
if source == self.uplink: