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.

27 lines
761 B

  1. import logging
  2. from typing import Any, Awaitable, Callable, Dict
  3. from paircd.client import Client
  4. from paircd.log import log_client
  5. from paircd.message import Message
  6. from paircd.server import Server
  7. CMD_HANDLERS: Dict[str, Any] = {}
  8. CMD_EXPECTED_ARGC: Dict[str, int] = {}
  9. CmdHandler = Callable[
  10. [Server, Client, Message],
  11. Awaitable[None],
  12. ]
  13. def register_cmd_handler(cmd: str, argc: int, handler: CmdHandler) -> None:
  14. CMD_EXPECTED_ARGC[cmd] = argc
  15. CMD_HANDLERS[cmd] = handler
  16. async def handle_cmd(server: Server, client: Client, msg: Message) -> None:
  17. if msg.cmd not in CMD_HANDLERS:
  18. log_client(client, f"used unknown command {msg.cmd}", level=logging.WARN)
  19. return
  20. await CMD_HANDLERS[msg.cmd](server, client, msg)