From 166152647cba5f5a7cfcc6cc75c8c73b12902847 Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 22 Aug 2021 04:35:05 +1000 Subject: [PATCH] [commands] Make GroupMixin Generic --- discord/ext/commands/core.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py index 800b4b022..35b7e8403 100644 --- a/discord/ext/commands/core.py +++ b/discord/ext/commands/core.py @@ -1125,7 +1125,7 @@ class Command(_BaseCommand, Generic[CogT, P, T]): finally: ctx.command = original -class GroupMixin: +class GroupMixin(Generic[CogT]): """A mixin that implements common functionality for classes that behave similar to :class:`.Group` and are allowed to register commands. @@ -1139,12 +1139,12 @@ class GroupMixin: """ def __init__(self, *args: Any, **kwargs: Any) -> None: case_insensitive = kwargs.get('case_insensitive', False) - self.all_commands: Dict[str, Command] = _CaseInsensitiveDict() if case_insensitive else {} + self.all_commands: Dict[str, Command[CogT, Any, Any]] = _CaseInsensitiveDict() if case_insensitive else {} self.case_insensitive: bool = case_insensitive super().__init__(*args, **kwargs) @property - def commands(self) -> Set[Command]: + def commands(self) -> Set[Command[CogT, Any, Any]]: """Set[:class:`.Command`]: A unique set of commands without aliases that are registered.""" return set(self.all_commands.values()) @@ -1154,7 +1154,7 @@ class GroupMixin: command.recursively_remove_all_commands() self.remove_command(command.name) - def add_command(self, command: Command) -> None: + def add_command(self, command: Command[CogT, Any, Any]) -> None: """Adds a :class:`.Command` into the internal list of commands. This is usually not called, instead the :meth:`~.GroupMixin.command` or @@ -1192,7 +1192,7 @@ class GroupMixin: raise CommandRegistrationError(alias, alias_conflict=True) self.all_commands[alias] = command - def remove_command(self, name: str) -> Optional[Command]: + def remove_command(self, name: str) -> Optional[Command[CogT, Any, Any]]: """Remove a :class:`.Command` from the internal list of commands. @@ -1229,7 +1229,7 @@ class GroupMixin: self.all_commands[alias] = cmd return command - def walk_commands(self) -> Generator[Command, None, None]: + def walk_commands(self) -> Generator[Command[CogT, Any, Any], None, None]: """An iterator that recursively walks through all commands and subcommands. .. versionchanged:: 1.4 @@ -1245,7 +1245,7 @@ class GroupMixin: if isinstance(command, GroupMixin): yield from command.walk_commands() - def get_command(self, name: str) -> Optional[Command]: + def get_command(self, name: str) -> Optional[Command[CogT, Any, Any]]: """Get a :class:`.Command` from the internal list of commands. @@ -1292,7 +1292,13 @@ class GroupMixin: cls: Type[Command[CogT, P, T]] = ..., *args: Any, **kwargs: Any, - ) -> Callable[[Callable[Concatenate[ContextT, P], Coro[T]]], Command[CogT, P, T]]: + ) -> Callable[ + [ + Union[ + Callable[Concatenate[CogT, ContextT, P], Coro[T]], + Callable[Concatenate[ContextT, P], Coro[T]], + ] + ], Command[CogT, P, T]]: ... @overload @@ -1335,7 +1341,12 @@ class GroupMixin: cls: Type[Group[CogT, P, T]] = ..., *args: Any, **kwargs: Any, - ) -> Callable[[Callable[Concatenate[ContextT, P], Coro[T]]], Group[CogT, P, T]]: + ) -> Callable[[ + Union[ + Callable[Concatenate[CogT, ContextT, P], Coro[T]], + Callable[Concatenate[ContextT, P], Coro[T]] + ] + ], Group[CogT, P, T]]: ... @overload @@ -1371,7 +1382,7 @@ class GroupMixin: return decorator -class Group(GroupMixin, Command[CogT, P, T]): +class Group(GroupMixin[CogT], Command[CogT, P, T]): """A class that implements a grouping protocol for commands to be executed as subcommands.