diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py index 5d48eb8f..97609ac0 100644 --- a/discord/ext/commands/core.py +++ b/discord/ext/commands/core.py @@ -54,7 +54,16 @@ import discord from .errors import * from .cooldowns import Cooldown, BucketType, CooldownMapping, MaxConcurrency, DynamicCooldownMapping -from .converter import CONVERTER_MAPPING, Converter, run_converters, get_converter, Greedy, Option +from .converter import ( + CONVERTER_MAPPING, + Converter, + MemberConverter, + RoleConverter, + run_converters, + get_converter, + Greedy, + Option, +) from ._types import _BaseCommand from .cog import Cog from .context import Context @@ -125,7 +134,6 @@ application_option_type_lookup = { ): 6, # Preferably discord.abc.User, but 'Protocols with non-method members don't support issubclass()' (discord.abc.GuildChannel, discord.DMChannel): 7, discord.Role: 8, - discord.Object: 9, float: 10, } @@ -1215,7 +1223,6 @@ class Command(_BaseCommand, Generic[CogT, P, T]): def _param_to_options( self, name: str, annotation: Any, required: bool, varadic: bool ) -> List[Optional[ApplicationCommandInteractionDataOption]]: - origin = getattr(annotation, "__origin__", None) if inspect.isclass(annotation) and issubclass(annotation, FlagConverter): return [ @@ -1235,6 +1242,7 @@ class Command(_BaseCommand, Generic[CogT, P, T]): annotation, origin = annotation.__args__[0], None option: Dict[str, Any] = { + "type": 3, "name": name, "required": required, "description": self.option_descriptions[name], @@ -1249,12 +1257,15 @@ class Command(_BaseCommand, Generic[CogT, P, T]): # one, in which we can get the original type, eg, (MemberConverter -> Member) annotation = REVERSED_CONVERTER_MAPPING.get(annotation, annotation) - option["type"] = 3 for python_type, discord_type in application_option_type_lookup.items(): if issubclass(annotation, python_type): option["type"] = discord_type break + elif origin is Union: + if annotation in {Union[discord.Member, discord.Role], Union[MemberConverter, RoleConverter]}: + option["type"] = 9 + elif origin is Literal: literal_values = annotation.__args__ python_type = type(literal_values[0]) @@ -1268,7 +1279,6 @@ class Command(_BaseCommand, Generic[CogT, P, T]): {"name": literal_value, "value": literal_value} for literal_value in annotation.__args__ ] - option.setdefault("type", 3) # STRING return [option] # type: ignore def to_application_command(self, nested: int = 0) -> Optional[EditApplicationCommand]: