import functools import logging import discord from ..core.config import CONFIG, FileCommand, InfoCommand _logger = logging.getLogger(__name__) @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: _logger.debug( f"User {interaction.user.name}({interaction.user.id}) used FileCommand /{command.name}" ) if (file := await command.as_discord_file) is not None: await interaction.response.send_message( content=command.content, suppress_embeds=True, ephemeral=not CONFIG.ev_info.in_allowed_channel(interaction), 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: _logger.debug( f"User {interaction.user.name}({interaction.user.id}) used InfoCommand /{command.name}" ) await interaction.response.send_message( content=command.content, suppress_embeds=True, ephemeral=not CONFIG.ev_info.in_allowed_channel(interaction), ) return cmd COMMANDS = [ make_command(attr) for name in CONFIG.ev_info.model_dump().keys() if isinstance(attr := getattr(CONFIG.ev_info, name), InfoCommand) ]