Skip to content

Commit

Permalink
Add methods for getting app command IDs/mentions from cache (#6278)
Browse files Browse the repository at this point in the history
Co-authored-by: Jakub Kuczys <[email protected]>
  • Loading branch information
Flame442 and Jackenmen authored Dec 24, 2024
1 parent 5cfb8ed commit 016684b
Showing 1 changed file with 76 additions and 0 deletions.
76 changes: 76 additions & 0 deletions redbot/core/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -1791,6 +1791,82 @@ async def list_enabled_app_commands(self) -> Dict[str, Dict[str, Optional[int]]]
"user": curr_user_commands,
}

async def get_app_command_id(
self,
command_name: str,
command_type: discord.AppCommandType = discord.AppCommandType.chat_input,
) -> Optional[int]:
"""
Get the cached ID for a particular app command.
Pulls from Red's internal cache of app command IDs, which is updated
when the ``[p]slash sync`` command is ran on this instance
or `bot.tree.sync() <RedTree.sync()>` is called.
Does not keep track of guild-specific app commands.
Parameters
----------
command_name : str
Name of the command to get the ID of.
command_type : `discord.AppCommandType`
Type of the command to get the ID of.
Returns
-------
Optional[int]
The cached of the specified app command or ``None``,
if the command does not exist or Red does not know the ID
for that app command.
"""
if command_type is discord.AppCommandType.chat_input:
cfg = self._config.enabled_slash_commands()
elif command_type is discord.AppCommandType.message:
cfg = self._config.enabled_message_commands()
elif command_type is discord.AppCommandType.user:
cfg = self._config.enabled_user_commands()
else:
raise TypeError("command type must be one of chat_input, message, user")

curr_commands = await cfg
return curr_commands.get(command_name, None)

async def get_app_command_mention(
self,
command_name: str,
command_type: discord.AppCommandType = discord.AppCommandType.chat_input,
) -> Optional[str]:
"""
Get the string that allows you to mention a particular app command.
Pulls from Red's internal cache of app command IDs, which is updated
when the ``[p]slash sync`` command is ran on this instance
or `bot.tree.sync() <RedTree.sync()>` is called.
Does not keep track of guild-specific app commands.
Parameters
----------
command_name : str
Name of the command to get the mention for.
command_type : `discord.AppCommandType`
Type of the command to get the mention for.
Returns
-------
Optional[str]
The string that allows you to mention the specified app command
or ``None``, if the command does not exist or Red does not know the ID
for that app command.
"""
# Empty string names will break later code and can't exist as commands, exit early
if not command_name:
raise ValueError("command name must be a non-empty string")
# Account for mentioning subcommands by fetching from the cache based on the base command
base_command = command_name.split(" ")[0]
command_id = await self.get_app_command_id(base_command, command_type)
if command_id is None:
return None
return f"</{command_name}:{command_id}>"

async def is_automod_immune(
self, to_check: Union[discord.Message, commands.Context, discord.abc.User, discord.Role]
) -> bool:
Expand Down

0 comments on commit 016684b

Please sign in to comment.