|
|
@ -24,19 +24,7 @@ DEALINGS IN THE SOFTWARE. |
|
|
|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
|
|
from typing import ( |
|
|
|
TYPE_CHECKING, |
|
|
|
Any, |
|
|
|
Callable, |
|
|
|
ClassVar, |
|
|
|
Dict, |
|
|
|
List, |
|
|
|
Tuple, |
|
|
|
Type, |
|
|
|
TypeVar, |
|
|
|
Union, |
|
|
|
Optional, |
|
|
|
) |
|
|
|
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, List, Tuple, Type, TypeVar, Union, Optional, TypedDict |
|
|
|
|
|
|
|
import discord |
|
|
|
import inspect |
|
|
@ -51,7 +39,7 @@ from .cog import Cog |
|
|
|
from .view import StringView |
|
|
|
|
|
|
|
if TYPE_CHECKING: |
|
|
|
from typing_extensions import Self, ParamSpec, Concatenate |
|
|
|
from typing_extensions import Self, ParamSpec, Concatenate, Unpack, NotRequired |
|
|
|
from ._types import ContextT, Coro, BotT |
|
|
|
from .bot import Bot |
|
|
|
from .context import Context |
|
|
@ -60,6 +48,31 @@ if TYPE_CHECKING: |
|
|
|
AutocompleteCallback, |
|
|
|
ChoiceT, |
|
|
|
) |
|
|
|
from .core import _CommandKwargs |
|
|
|
|
|
|
|
class _HybridCommandKwargs( |
|
|
|
_CommandKwargs, |
|
|
|
): |
|
|
|
guild_ids: NotRequired[Optional[List[int]]] |
|
|
|
guild_only: NotRequired[bool] |
|
|
|
default_permissions: NotRequired[Optional[bool]] |
|
|
|
nsfw: NotRequired[bool] |
|
|
|
with_app_command: NotRequired[bool] |
|
|
|
|
|
|
|
class _HybridCommandDecoratorKwargs(_HybridCommandKwargs): |
|
|
|
description: NotRequired[Union[str, app_commands.locale_str]] |
|
|
|
|
|
|
|
class _HybridGroupKwargs(_HybridCommandDecoratorKwargs): |
|
|
|
with_app_command: NotRequired[bool] |
|
|
|
guild_ids: NotRequired[Optional[List[int]]] |
|
|
|
guild_only: NotRequired[bool] |
|
|
|
default_permissions: NotRequired[Optional[bool]] |
|
|
|
nsfw: NotRequired[bool] |
|
|
|
description: NotRequired[str] |
|
|
|
|
|
|
|
class _HybridGroupDecoratorKwargs(_HybridGroupKwargs): |
|
|
|
description: NotRequired[Union[str, app_commands.locale_str]] |
|
|
|
fallback: NotRequired[Union[str, app_commands.locale_str]] |
|
|
|
|
|
|
|
|
|
|
|
__all__ = ( |
|
|
@ -501,7 +514,7 @@ class HybridCommand(Command[CogT, P, T]): |
|
|
|
*, |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
description: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
**kwargs: Any, |
|
|
|
**kwargs: Unpack[_HybridCommandKwargs], # type: ignore # name, description |
|
|
|
) -> None: |
|
|
|
name, name_locale = (name.message, name) if isinstance(name, app_commands.locale_str) else (name, None) |
|
|
|
if name is not MISSING: |
|
|
@ -621,7 +634,7 @@ class HybridGroup(Group[CogT, P, T]): |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
description: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
fallback: Optional[Union[str, app_commands.locale_str]] = None, |
|
|
|
**attrs: Any, |
|
|
|
**attrs: Unpack[_HybridGroupKwargs], # type: ignore # name, description |
|
|
|
) -> None: |
|
|
|
name, name_locale = (name.message, name) if isinstance(name, app_commands.locale_str) else (name, None) |
|
|
|
if name is not MISSING: |
|
|
@ -825,7 +838,7 @@ class HybridGroup(Group[CogT, P, T]): |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
*args: Any, |
|
|
|
with_app_command: bool = True, |
|
|
|
**kwargs: Any, |
|
|
|
**kwargs: Unpack[_HybridCommandDecoratorKwargs], # type: ignore # name, with_app_command |
|
|
|
) -> Callable[[CommandCallback[CogT, ContextT, P2, U]], HybridCommand[CogT, P2, U]]: |
|
|
|
"""A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_command` and adds it to |
|
|
|
the internal command list via :meth:`add_command`. |
|
|
@ -837,8 +850,8 @@ class HybridGroup(Group[CogT, P, T]): |
|
|
|
""" |
|
|
|
|
|
|
|
def decorator(func: CommandCallback[CogT, ContextT, P2, U]): |
|
|
|
kwargs.setdefault('parent', self) |
|
|
|
result = hybrid_command(name=name, *args, with_app_command=with_app_command, **kwargs)(func) |
|
|
|
kwargs.setdefault('parent', self) # type: ignore # parent is not for users to set |
|
|
|
result = hybrid_command(name=name, *args, with_app_command=with_app_command, **kwargs)(func) # type: ignore # name, with_app_command |
|
|
|
self.add_command(result) |
|
|
|
return result |
|
|
|
|
|
|
@ -849,7 +862,7 @@ class HybridGroup(Group[CogT, P, T]): |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
*args: Any, |
|
|
|
with_app_command: bool = True, |
|
|
|
**kwargs: Any, |
|
|
|
**kwargs: Unpack[_HybridGroupDecoratorKwargs], # type: ignore # name, with_app_command |
|
|
|
) -> Callable[[CommandCallback[CogT, ContextT, P2, U]], HybridGroup[CogT, P2, U]]: |
|
|
|
"""A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_group` and adds it to |
|
|
|
the internal command list via :meth:`~.GroupMixin.add_command`. |
|
|
@ -861,8 +874,8 @@ class HybridGroup(Group[CogT, P, T]): |
|
|
|
""" |
|
|
|
|
|
|
|
def decorator(func: CommandCallback[CogT, ContextT, P2, U]): |
|
|
|
kwargs.setdefault('parent', self) |
|
|
|
result = hybrid_group(name=name, *args, with_app_command=with_app_command, **kwargs)(func) |
|
|
|
kwargs.setdefault('parent', self) # type: ignore # parent is not for users to set |
|
|
|
result = hybrid_group(name=name, *args, with_app_command=with_app_command, **kwargs)(func) # type: ignore # name, with_app_command |
|
|
|
self.add_command(result) |
|
|
|
return result |
|
|
|
|
|
|
@ -873,7 +886,7 @@ def hybrid_command( |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
*, |
|
|
|
with_app_command: bool = True, |
|
|
|
**attrs: Any, |
|
|
|
**attrs: Unpack[_HybridCommandDecoratorKwargs], # type: ignore # name, with_app_command |
|
|
|
) -> Callable[[CommandCallback[CogT, ContextT, P, T]], HybridCommand[CogT, P, T]]: |
|
|
|
r"""A decorator that transforms a function into a :class:`.HybridCommand`. |
|
|
|
|
|
|
@ -916,7 +929,7 @@ def hybrid_command( |
|
|
|
if isinstance(func, Command): |
|
|
|
raise TypeError('Callback is already a command.') |
|
|
|
# Pyright does not allow Command[Any] to be assigned to Command[CogT] despite it being okay here |
|
|
|
return HybridCommand(func, name=name, with_app_command=with_app_command, **attrs) # type: ignore |
|
|
|
return HybridCommand(func, name=name, with_app_command=with_app_command, **attrs) # type: ignore # name, with_app_command |
|
|
|
|
|
|
|
return decorator |
|
|
|
|
|
|
@ -925,7 +938,7 @@ def hybrid_group( |
|
|
|
name: Union[str, app_commands.locale_str] = MISSING, |
|
|
|
*, |
|
|
|
with_app_command: bool = True, |
|
|
|
**attrs: Any, |
|
|
|
**attrs: Unpack[_HybridGroupDecoratorKwargs], # type: ignore # name, with_app_command |
|
|
|
) -> Callable[[CommandCallback[CogT, ContextT, P, T]], HybridGroup[CogT, P, T]]: |
|
|
|
"""A decorator that transforms a function into a :class:`.HybridGroup`. |
|
|
|
|
|
|
@ -949,6 +962,6 @@ def hybrid_group( |
|
|
|
def decorator(func: CommandCallback[CogT, ContextT, P, T]) -> HybridGroup[CogT, P, T]: |
|
|
|
if isinstance(func, Command): |
|
|
|
raise TypeError('Callback is already a command.') |
|
|
|
return HybridGroup(func, name=name, with_app_command=with_app_command, **attrs) |
|
|
|
return HybridGroup(func, name=name, with_app_command=with_app_command, **attrs) # type: ignore # name, with_app_command |
|
|
|
|
|
|
|
return decorator |
|
|
|