|
|
- import logging
- from paircd.reply import RPL_ENDOFWHO, RPL_WHOREPLY
-
- from paircd.client import Client
- from paircd.command_handler import CommandHandler
- from paircd.message import Message
- from paircd.server import Server
-
-
- class WhoHandler(CommandHandler):
- def __init__(self) -> None:
- super().__init__("WHO", 1)
-
- async def handle(self, server: Server, client: Client, msg: Message) -> None:
- name = msg.args[0]
- if not name.startswith("#"):
- client.log("used WHO on invalid channel", level=logging.WARN)
- self.who_end(client, name)
- return
-
- if name not in client.channels:
- client.log("client used WHO outside of channel", level=logging.WARN)
- self.who_end(client, name)
- return
-
- channel = server.get_channel_by_name(name)
- for member in channel.clients_by_nick.values():
- self.who_reply(client, name, member)
- self.who_end(client, name)
-
- def who_reply(self, client: Client, channel_name: str, member: Client) -> None:
- msg = RPL_WHOREPLY(
- client.nickname,
- channel_name,
- member.username,
- member.hostname,
- "localhost", # server
- member.nickname,
- # TODO: Implement
- "H", # H = here, G = gone
- "0", # hop count
- member.realname,
- )
- client.write_message(msg)
-
- def who_end(self, client: Client, channel_name: str) -> None:
- msg = RPL_ENDOFWHO(client.nickname, channel_name)
- client.write_message(msg)
|