diff --git a/discord/app_commands/tree.py b/discord/app_commands/tree.py index 3d89ce5f5..ef77b63f3 100644 --- a/discord/app_commands/tree.py +++ b/discord/app_commands/tree.py @@ -68,6 +68,7 @@ from .._types import ClientT if TYPE_CHECKING: from ..types.interactions import ApplicationCommandInteractionData, ApplicationCommandInteractionDataOption + from ..types.command import ApplicationCommand from ..interactions import Interaction from ..abc import Snowflake from .commands import ContextMenuCallback, CommandCallback, P, T @@ -202,7 +203,8 @@ class CommandTree(Generic[ClientT]): command = await self._http.get_guild_command(self.client.application_id, guild.id, command_id) res = AppCommand(data=command, state=self._state) - self._store_command_id((res, res.id)) + # self._store_command_id((res, res.id)) + self._store_command_from_data(command) return res async def fetch_commands(self, *, guild: Optional[Snowflake] = None) -> List[AppCommand]: @@ -244,7 +246,8 @@ class CommandTree(Generic[ClientT]): commands = await self._http.get_guild_commands(self.client.application_id, guild.id) res = [AppCommand(data=command, state=self._state) for command in commands] - self._store_command_id(*((cmd, cmd.id) for cmd in res)) + # self._store_command_id(*((cmd, cmd.id) for cmd in res)) + self._store_command_from_data(*commands) return res def get_command_id( @@ -1212,7 +1215,8 @@ class CommandTree(Generic[ClientT]): raise res = [AppCommand(data=d, state=self._state) for d in data] - self._store_command_id(*((cmd, cmd.id) for cmd in res)) + # self._store_command_id(*((cmd, cmd.id) for cmd in res)) + self._store_command_from_data(*data) return res def _store_command_id(self, *commands: Tuple[AppCommand | ContextMenu | Command[Any, ..., Any] | Group, int]) -> None: @@ -1235,6 +1239,16 @@ class CommandTree(Generic[ClientT]): key = (name, guild_id) self._guild_command_ids[key] = command_id + def _store_command_from_data(self, *data: ApplicationCommandInteractionData | ApplicationCommand) -> None: + for d in data: + command_id = int(d['id']) + name = d['name'] + guild_id = _get_as_snowflake(d, 'guild_id') + if guild_id is None: + self._global_command_ids[name] = command_id + else: + self._guild_command_ids[(name, guild_id)] = command_id + async def _dispatch_error(self, interaction: Interaction[ClientT], error: AppCommandError, /) -> None: command = interaction.command interaction.command_failed = True @@ -1330,7 +1344,8 @@ class CommandTree(Generic[ClientT]): if ctx_menu is None: raise CommandNotFound(name, [], AppCommandType(type)) - self._store_command_id((ctx_menu, int(data['id']))) + # self._store_command_id((ctx_menu, int(data['id']))) + self._store_command_from_data(data) resolved = Namespace._get_resolved_items(interaction, data.get('resolved', {})) @@ -1382,7 +1397,8 @@ class CommandTree(Generic[ClientT]): return command, options = self._get_app_command_options(data) - self._store_command_id((command, int(data['id']))) + # self._store_command_id((command, int(data['id']))) + self._store_command_from_data(data) # Pre-fill the cached slot to prevent re-computation interaction._cs_command = command