from dataclasses import dataclass from datetime import datetime from collections.abc import Callable, Coroutine, Container from typing import Union, Any, Optional @dataclass class Attachment: name: str body: Union[str, bytes] @dataclass class Message: origin_id: str channel_id: str sender_id: str timestamp: datetime origin_admin: bool channel_admin: bool text: Optional[str] attachments: list[Attachment] @dataclass class Response: origin_id: str channel_id: str text: str attachments: list[Attachment] @staticmethod def from_message(msg: Message, text: str, attachments: list[Attachment] = None) -> "Response": return Response( origin_id=msg.origin_id, channel_id=msg.channel_id, text=text, attachments=attachments or [], ) @dataclass class Context: message: Message config: Callable[[str], Any] respond: Callable[[], Coroutine[None, None, None]] # database: Callable # TODO proper type CommandType = Callable[[Context], Coroutine[None, None, None]] @dataclass class CommandConfiguration: commands: dict[str, CommandType] call_and_response: dict[str, str] aliases: dict[str, str] bangs: Container[str] = ("!",)