Skip to content

Commit 9fc0dbf

Browse files
committed
fix option not working with str / ForwardRef annotations
1 parent 14989c9 commit 9fc0dbf

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

discord/commands/core.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from __future__ import annotations
2727

2828
import asyncio
29+
from collections.abc import Iterator
2930
import datetime
3031
import functools
3132
import inspect
@@ -50,9 +51,7 @@
5051
from ..enums import (
5152
IntegrationType,
5253
InteractionContextType,
53-
MessageType,
5454
SlashCommandOptionType,
55-
try_enum,
5655
)
5756
from ..errors import (
5857
ApplicationCommandError,
@@ -62,13 +61,12 @@
6261
InvalidArgument,
6362
ValidationError,
6463
)
65-
from ..member import Member
6664
from ..message import Attachment, Message
6765
from ..object import Object
6866
from ..role import Role
6967
from ..threads import Thread
7068
from ..user import User
71-
from ..utils import MISSING, async_all, find, maybe_coroutine, utcnow, warn_deprecated
69+
from ..utils import MISSING, async_all, find, maybe_coroutine, resolve_annotation, utcnow, warn_deprecated
7270
from .context import ApplicationContext, AutocompleteContext
7371
from .options import Option, OptionChoice
7472

@@ -101,7 +99,7 @@
10199

102100
T = TypeVar("T")
103101
CogT = TypeVar("CogT", bound="Cog")
104-
Coro = TypeVar("Coro", bound=Callable[..., Coroutine[Any, Any, Any]])
102+
Coro = Coroutine[Any, Any, T]
105103

106104
if TYPE_CHECKING:
107105
P = ParamSpec("P")
@@ -190,7 +188,7 @@ class ApplicationCommand(_BaseCommand, Generic[CogT, P, T]):
190188
cog = None
191189

192190
def __init__(self, func: Callable, **kwargs) -> None:
193-
from ..ext.commands.cooldowns import BucketType, CooldownMapping, MaxConcurrency
191+
from ..ext.commands.cooldowns import BucketType, CooldownMapping
194192

195193
cooldown = getattr(func, "__commands_cooldown__", kwargs.get("cooldown"))
196194

@@ -314,7 +312,7 @@ def guild_only(self) -> bool:
314312
"2.6",
315313
reference="https://discord.com/developers/docs/change-log#userinstallable-apps-preview",
316314
)
317-
return InteractionContextType.guild in self.contexts and len(self.contexts) == 1
315+
return self.contexts is not None and InteractionContextType.guild in self.contexts and len(self.contexts) == 1
318316

319317
@guild_only.setter
320318
def guild_only(self, value: bool) -> None:
@@ -779,33 +777,36 @@ def _validate_parameters(self):
779777
else:
780778
self.options = self._parse_options(params)
781779

782-
def _check_required_params(self, params):
783-
params = iter(params.items())
780+
def _check_required_params(self, params: OrderedDict[str, inspect.Parameter]) -> Iterator[tuple[str, inspect.Parameter]]:
781+
params_iter = iter(params.items())
784782
required_params = (
785783
["self", "context"] if self.attached_to_group or self.cog else ["context"]
786784
)
787785
for p in required_params:
788786
try:
789-
next(params)
787+
next(params_iter)
790788
except StopIteration:
791789
raise ClientException(
792790
f'Callback for {self.name} command is missing "{p}" parameter.'
793791
)
794792

795-
return params
793+
return params_iter
796794

797-
def _parse_options(self, params, *, check_params: bool = True) -> list[Option]:
795+
def _parse_options(self, params: OrderedDict[str, inspect.Parameter], *, check_params: bool = True) -> list[Option]:
798796
if check_params:
799-
params = self._check_required_params(params)
797+
params_iter = self._check_required_params(params)
800798
else:
801-
params = iter(params.items())
799+
params_iter = iter(params.items())
802800

803801
final_options = []
804-
for p_name, p_obj in params:
802+
cache = {}
803+
for p_name, p_obj in params_iter:
805804
option = p_obj.annotation
806805
if option == inspect.Parameter.empty:
807806
option = str
808807

808+
option = resolve_annotation(option, globals(), locals(), cache)
809+
809810
option = Option._strip_none_type(option)
810811
if self._is_typing_literal(option):
811812
literal_values = get_args(option)

0 commit comments

Comments
 (0)