python ircd using asyncio
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.6 KiB

2 years ago
  1. import logging
  2. from paircd.reply import RPL_ENDOFWHO, RPL_WHOREPLY
  3. from paircd.client import Client
  4. from paircd.command_handler import CommandHandler
  5. from paircd.message import Message
  6. from paircd.server import Server
  7. class WhoHandler(CommandHandler):
  8. def __init__(self) -> None:
  9. super().__init__("WHO", 1)
  10. async def handle(self, server: Server, client: Client, msg: Message) -> None:
  11. name = msg.args[0]
  12. if not name.startswith("#"):
  13. client.log("used WHO on invalid channel", level=logging.WARN)
  14. self.who_end(client, name)
  15. return
  16. if name not in client.channels:
  17. client.log("client used WHO outside of channel", level=logging.WARN)
  18. self.who_end(client, name)
  19. return
  20. channel = server.get_channel_by_name(name)
  21. for member in channel.clients_by_nick.values():
  22. self.who_reply(client, name, member)
  23. self.who_end(client, name)
  24. def who_reply(self, client: Client, channel_name: str, member: Client) -> None:
  25. msg = RPL_WHOREPLY(
  26. client.nickname,
  27. channel_name,
  28. member.username,
  29. member.hostname,
  30. "localhost", # server
  31. member.nickname,
  32. # TODO: Implement
  33. "H", # H = here, G = gone
  34. "0", # hop count
  35. member.realname,
  36. )
  37. client.write_message(msg)
  38. def who_end(self, client: Client, channel_name: str) -> None:
  39. msg = RPL_ENDOFWHO(client.nickname, channel_name)
  40. client.write_message(msg)