mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-06-07 12:18:59 +00:00
Add CommandTree.walk_commands and Group.walk_commands
This commit is contained in:
parent
5bc085ebab
commit
f015b59e43
@ -31,6 +31,7 @@ from typing import (
|
|||||||
ClassVar,
|
ClassVar,
|
||||||
Coroutine,
|
Coroutine,
|
||||||
Dict,
|
Dict,
|
||||||
|
Generator,
|
||||||
Generic,
|
Generic,
|
||||||
List,
|
List,
|
||||||
Optional,
|
Optional,
|
||||||
@ -806,6 +807,20 @@ class Group:
|
|||||||
"""List[Union[:class:`Command`, :class:`Group`]]: The commands that this group contains."""
|
"""List[Union[:class:`Command`, :class:`Group`]]: The commands that this group contains."""
|
||||||
return list(self._children.values())
|
return list(self._children.values())
|
||||||
|
|
||||||
|
def walk_commands(self) -> Generator[Union[Command[Any, ..., Any], Group], None, None]:
|
||||||
|
"""An iterator that recursively walks through all commands that this group contains.
|
||||||
|
|
||||||
|
Yields
|
||||||
|
---------
|
||||||
|
Union[:class:`Command`, :class:`Group`]
|
||||||
|
The commands in this group.
|
||||||
|
"""
|
||||||
|
|
||||||
|
for command in self._children.values():
|
||||||
|
yield command
|
||||||
|
if isinstance(command, Group):
|
||||||
|
yield from command.walk_commands()
|
||||||
|
|
||||||
async def on_error(self, interaction: Interaction, command: Command[Any, ..., Any], error: AppCommandError) -> None:
|
async def on_error(self, interaction: Interaction, command: Command[Any, ..., Any], error: AppCommandError) -> None:
|
||||||
"""|coro|
|
"""|coro|
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ from typing import (
|
|||||||
TYPE_CHECKING,
|
TYPE_CHECKING,
|
||||||
Callable,
|
Callable,
|
||||||
Dict,
|
Dict,
|
||||||
|
Generator,
|
||||||
Generic,
|
Generic,
|
||||||
List,
|
List,
|
||||||
Literal,
|
Literal,
|
||||||
@ -533,6 +534,79 @@ class CommandTree(Generic[ClientT]):
|
|||||||
value = type.value
|
value = type.value
|
||||||
return [command for ((_, g, t), command) in self._context_menus.items() if g == guild_id and t == value]
|
return [command for ((_, g, t), command) in self._context_menus.items() if g == guild_id and t == value]
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def walk_commands(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
guild: Optional[Snowflake] = ...,
|
||||||
|
type: Literal[AppCommandType.message, AppCommandType.user] = ...,
|
||||||
|
) -> Generator[ContextMenu, None, None]:
|
||||||
|
...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def walk_commands(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
guild: Optional[Snowflake] = ...,
|
||||||
|
type: Literal[AppCommandType.chat_input] = ...,
|
||||||
|
) -> Generator[Union[Command[Any, ..., Any], Group], None, None]:
|
||||||
|
...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def walk_commands(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
guild: Optional[Snowflake] = ...,
|
||||||
|
type: AppCommandType = ...,
|
||||||
|
) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]:
|
||||||
|
...
|
||||||
|
|
||||||
|
def walk_commands(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
guild: Optional[Snowflake] = None,
|
||||||
|
type: AppCommandType = AppCommandType.chat_input,
|
||||||
|
) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]:
|
||||||
|
"""An iterator that recursively walks through all application commands and child commands from the tree.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
-----------
|
||||||
|
guild: Optional[:class:`~discord.abc.Snowflake`]
|
||||||
|
The guild to iterate the commands from. If not given then it
|
||||||
|
iterates all global commands instead.
|
||||||
|
type: :class:`~discord.AppCommandType`
|
||||||
|
The type of commands to iterate over. Defaults to :attr:`~discord.AppCommandType.chat_input`,
|
||||||
|
i.e. slash commands.
|
||||||
|
|
||||||
|
Yields
|
||||||
|
---------
|
||||||
|
Union[:class:`ContextMenu`, :class:`Command`, :class:`Group`]
|
||||||
|
The application commands from the tree.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if type is AppCommandType.chat_input:
|
||||||
|
if guild is None:
|
||||||
|
for cmd in self._global_commands.values():
|
||||||
|
yield cmd
|
||||||
|
if isinstance(cmd, Group):
|
||||||
|
yield from cmd.walk_commands()
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
commands = self._guild_commands[guild.id]
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
for cmd in commands.values():
|
||||||
|
yield cmd
|
||||||
|
if isinstance(cmd, Group):
|
||||||
|
yield from cmd.walk_commands()
|
||||||
|
else:
|
||||||
|
guild_id = None if guild is None else guild.id
|
||||||
|
value = type.value
|
||||||
|
for ((_, g, t), command) in self._context_menus.items():
|
||||||
|
if g == guild_id and t == value:
|
||||||
|
yield command
|
||||||
|
|
||||||
def _get_all_commands(
|
def _get_all_commands(
|
||||||
self, *, guild: Optional[Snowflake] = None
|
self, *, guild: Optional[Snowflake] = None
|
||||||
) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]:
|
) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user