diff --git a/paircd/handler/nick.py b/paircd/handler/nick.py index f0b319f..46620f6 100644 --- a/paircd/handler/nick.py +++ b/paircd/handler/nick.py @@ -1,6 +1,7 @@ from paircd.client import Client from paircd.command_handler import CommandHandler from paircd.message import Message +from paircd.reply import ERR_NICKNAMEINUSE from paircd.server import Server @@ -11,6 +12,13 @@ class NickHandler(CommandHandler): async def handle(self, server: Server, client: Client, msg: Message) -> None: nickname = msg.args[0] + existing_client = server.get_client_by_name(nickname) + if existing_client is not None: + if client != existing_client: + target = client.nickname if client.nickname else nickname + client.write_message(ERR_NICKNAMEINUSE(target, nickname)) + return + # Remove stale references if they exist if client.nickname: server.remove_client_by_name(client.nickname) diff --git a/paircd/reply.py b/paircd/reply.py index 461af08..07050a2 100644 --- a/paircd/reply.py +++ b/paircd/reply.py @@ -35,6 +35,7 @@ ERR_NOSUCHSERVER = reply_fn(402, "{0} :No such server") ERR_NOSUCHCHANNEL = reply_fn(403, "{0} :No such channel") ERR_CANNOTSENDTOCHAN = reply_fn(404, "{0} :Cannot send to channel") ERR_TOOMANYCHANNELS = reply_fn(405, "{0} :You have joined too many channels") +ERR_NICKNAMEINUSE = reply_fn(433, "{0} :Nickname is already in use") ERR_NOTEXTTOSEND = reply_fn(412, ":No text to send") ERR_NOTREGISTERED = reply_fn(451, ":You have not registered") diff --git a/paircd/server.py b/paircd/server.py index 394be59..db491d1 100644 --- a/paircd/server.py +++ b/paircd/server.py @@ -1,6 +1,6 @@ from dataclasses import dataclass, field from datetime import datetime -from typing import Dict +from typing import Dict, Optional from paircd.client import Client from paircd.channel import Channel @@ -20,5 +20,8 @@ class Server: self.channels_by_name[name] = Channel(name=name) return self.channels_by_name[name] + def get_client_by_name(self, name: str) -> Optional[Client]: + return self.clients_by_nick.get(name) + def remove_client_by_name(self, name: str) -> None: del self.clients_by_nick[name]