import functools import logging import discord from .config import CONFIG, FileCommand, InfoCommand _logger = logging.getLogger(__name__) def reply_private(interaction: discord.Interaction, name: str) -> bool: _logger.debug(f"User {interaction.user.name}({interaction.user.id}) used /{name}") return interaction.channel_id not in CONFIG.ev_info.channels @functools.singledispatch def make_command(command) -> discord.app_commands.Command: raise NotImplementedError @make_command.register def _(command: FileCommand) -> discord.app_commands.Command: @discord.app_commands.command( name=CONFIG.command_prefix + command.name, description=command.description, ) async def cmd(interaction: discord.Interaction) -> None: if (file := await command.as_discord_file) is not None: await interaction.response.send_message( content=command.content, suppress_embeds=True, ephemeral=reply_private(interaction, command.name), file=file, ) else: await interaction.response.send_message( content=CONFIG.command_failed, ephemeral=True, ) return cmd @make_command.register def _(command: InfoCommand) -> discord.app_commands.Command: @discord.app_commands.command( name=CONFIG.command_prefix + command.name, description=command.description, ) async def cmd(interaction: discord.Interaction) -> None: await interaction.response.send_message( content=command.content, suppress_embeds=True, ephemeral=reply_private(interaction, command.name), ) return cmd COMMANDS = [ make_command(attr) for name in CONFIG.ev_info.model_dump().keys() if isinstance(attr := getattr(CONFIG.ev_info, name), InfoCommand) ]