From 8824a465cea5f9cfdf128bf15b6a4ab2d378982a Mon Sep 17 00:00:00 2001 From: Forest Belton <65484+forestbelton@users.noreply.github.com> Date: Tue, 22 Jun 2021 00:22:31 -0400 Subject: [PATCH] Update channel indexes when user changes nickname --- paircd/channel.py | 3 +++ paircd/handler/nick.py | 12 ++++++++++-- paircd/main.py | 2 +- paircd/server.py | 3 +++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/paircd/channel.py b/paircd/channel.py index 5a06301..c6dfec8 100644 --- a/paircd/channel.py +++ b/paircd/channel.py @@ -14,6 +14,9 @@ class Channel: def add_client(self, client: Client) -> None: self.clients_by_nick[client.nickname] = client + def remove_client_by_nick(self, nick: str) -> None: + del self.clients_by_nick[nick] + async def process(self) -> None: while True: msg = await self.msg_queue.get() diff --git a/paircd/handler/nick.py b/paircd/handler/nick.py index b72f432..65525d2 100644 --- a/paircd/handler/nick.py +++ b/paircd/handler/nick.py @@ -12,12 +12,20 @@ class NickHandler(CommandHandler): async def handle(self, server: Server, client: Client, msg: Message) -> None: nickname = msg.args[0] + # Remove stale references if they exist if client.nickname: - del server.clients_by_nick[client.nickname] - # TODO: Update all channel references + server.remove_client_by_name(client.nickname) + for channel_name in client.channels: + channel = server.get_channel_by_name(channel_name) + channel.remove_client_by_nick(client.nickname) client.nickname = nickname + + # Add references for client server.add_client(client) + for channel_name in client.channels: + channel = server.get_channel_by_name(channel_name) + channel.remove_client_by_nick(client.nickname) if client.username and client.realname: client.registered = True diff --git a/paircd/main.py b/paircd/main.py index 6f157a8..b4135c3 100644 --- a/paircd/main.py +++ b/paircd/main.py @@ -45,7 +45,7 @@ async def main() -> None: reuse_port=True, ) - logger.info(f"Listening on {bind_addr}:{port}...") + logger.info(f"Listening on {bind_addr}:{port}") async with server: await server.serve_forever() diff --git a/paircd/server.py b/paircd/server.py index ec86e89..04ee0fd 100644 --- a/paircd/server.py +++ b/paircd/server.py @@ -19,3 +19,6 @@ class Server: self.channels_by_name[name] = Channel(name=name) create_task(self.channels_by_name[name].process()) return self.channels_by_name[name] + + def remove_client_by_name(self, name: str) -> None: + del self.clients_by_nick[name]