from logging import WARN from paircd.handler.away import AwayHandler from typing import Dict from paircd.client import Client from paircd.command_handler import CommandHandler from paircd.message import Message from paircd.server import Server from paircd.handler.join import JoinHandler from paircd.handler.mode import ModeHandler from paircd.handler.nick import NickHandler from paircd.handler.ping import PingHandler from paircd.handler.privmsg import PrivmsgHandler from paircd.handler.user import UserHandler from paircd.handler.who import WhoHandler HANDLER_CLASSES = [ AwayHandler, JoinHandler, ModeHandler, NickHandler, PingHandler, PrivmsgHandler, UserHandler, WhoHandler, ] CMD_HANDLERS: Dict[str, CommandHandler] = {} def register_cmd_handlers() -> None: for handler_cls in HANDLER_CLASSES: handler = handler_cls() # type: ignore CMD_HANDLERS[handler.cmd] = handler async def handle_cmd(server: Server, client: Client, msg: Message) -> None: cmd = msg.cmd.upper() if cmd not in CMD_HANDLERS: client.log(f"used unknown command {cmd}", level=WARN) return handler = CMD_HANDLERS[cmd] if handler.argc is not None and handler.argc != len(msg.args): client.log( "got {len(msg.args)} arguments for {msg.cmd}, expected {handler.argc}", level=WARN, ) return await handler.handle(server, client, msg)