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.

61 lines
1.6 KiB

2 years ago
2 years ago
  1. from logging import WARN
  2. from typing import Dict
  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. from paircd.handler.away import AwayHandler
  8. from paircd.handler.join import JoinHandler
  9. from paircd.handler.mode import ModeHandler
  10. from paircd.handler.nick import NickHandler
  11. from paircd.handler.notice import NoticeHandler
  12. from paircd.handler.ping import PingHandler
  13. from paircd.handler.privmsg import PrivmsgHandler
  14. from paircd.handler.quit import QuitHandler
  15. from paircd.handler.topic import TopicHandler
  16. from paircd.handler.user import UserHandler
  17. from paircd.handler.who import WhoHandler
  18. HANDLER_CLASSES = [
  19. AwayHandler,
  20. JoinHandler,
  21. ModeHandler,
  22. NickHandler,
  23. NoticeHandler,
  24. PingHandler,
  25. PrivmsgHandler,
  26. QuitHandler,
  27. TopicHandler,
  28. UserHandler,
  29. WhoHandler,
  30. ]
  31. CMD_HANDLERS: Dict[str, CommandHandler] = {}
  32. def register_cmd_handlers() -> None:
  33. for handler_cls in HANDLER_CLASSES:
  34. handler = handler_cls() # type: ignore
  35. CMD_HANDLERS[handler.cmd] = handler
  36. async def handle_cmd(server: Server, client: Client, msg: Message) -> None:
  37. cmd = msg.cmd.upper()
  38. if cmd not in CMD_HANDLERS:
  39. client.log(f"used unknown command {cmd}", level=WARN)
  40. return
  41. handler = CMD_HANDLERS[cmd]
  42. if handler.argc is not None and handler.argc != len(msg.args):
  43. client.log(
  44. "got {len(msg.args)} arguments for {msg.cmd}, expected {handler.argc}",
  45. level=WARN,
  46. )
  47. return
  48. await handler.handle(server, client, msg)