From 05d84b0c60de92b8c16556a5c3731580d9944fa6 Mon Sep 17 00:00:00 2001 From: Forest Belton <65484+forestbelton@users.noreply.github.com> Date: Tue, 22 Jun 2021 17:53:17 -0400 Subject: [PATCH] Clean up MODE handler --- paircd/channel.py | 6 +++++- paircd/handler/mode.py | 32 ++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/paircd/channel.py b/paircd/channel.py index 679b9c2..aeb9008 100644 --- a/paircd/channel.py +++ b/paircd/channel.py @@ -10,6 +10,7 @@ from paircd.message import Message class Channel: name: str topic: str = "" + modes: Set[str] = field(default_factory=set) clients_by_nick: Dict[str, Client] = field(default_factory=dict) modes_by_nick: Dict[str, Set[str]] = field(default_factory=lambda: defaultdict(set)) @@ -30,7 +31,10 @@ class Channel: client.write_message(msg) def get_modes(self) -> Set[str]: - return set() + return self.modes + + def get_mode_settings(self) -> str: + return f"+{''.join(sorted(self.modes))}" def get_user_modes_by_nick(self, nick: str) -> Set[str]: return self.modes_by_nick[nick] diff --git a/paircd/handler/mode.py b/paircd/handler/mode.py index f865e0a..962c539 100644 --- a/paircd/handler/mode.py +++ b/paircd/handler/mode.py @@ -1,4 +1,3 @@ -import logging from paircd.reply import ERR_USERSDONTMATCH, MODE, RPL_CHANNELMODEIS, RPL_UMODEIS from paircd.client import Client @@ -13,19 +12,36 @@ class ModeHandler(CommandHandler): async def handle(self, server: Server, client: Client, msg: Message) -> None: name = msg.args[0] - if not name.startswith("#"): - if name == client.nickname: - settings = client.get_mode_settings() - client.write_message(RPL_UMODEIS(client.nickname, settings)) - else: - client.write_message(ERR_USERSDONTMATCH(client.nickname)) + + if name.startswith("#"): + self.handle_channel(server, client, msg) + else: + self.handle_user(client, msg) + + def handle_user(self, client: Client, msg: Message) -> None: + name = msg.args[0] + + if name != client.nickname: + client.write_message(ERR_USERSDONTMATCH(client.nickname)) return + # Set user mode + if len(msg.args) == 2: + client.log("TODO: implement user mode set") + + settings = client.get_mode_settings() + client.write_message(RPL_UMODEIS(client.nickname, settings)) + + def handle_channel(self, server: Server, client: Client, msg: Message) -> None: + name = msg.args[0] channel = server.get_channel_by_name(name) + + if len(msg.args) == 2: + client.log("TODO: implement channel mode set") + modes = "".join(channel.get_modes()) if modes != "": modes = f"+{modes}" - client.log("TODO: implement channel modes", level=logging.WARN) client.write_message(MODE(name, modes)) client.write_message(RPL_CHANNELMODEIS(client.nickname, name, modes, ""))