import functools import logging import discord from ..core.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}") # öffentliche Antwort in DM channels und in "allowed" channels in_dm_channel = interaction.channel is not None and isinstance( interaction.channel, discord.DMChannel ) in_allowed_channel = interaction.channel_id in CONFIG.ev_info.channels # private Antwort sonst return not (in_dm_channel or in_allowed_channel) @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) ]