diff --git a/discord/app_commands/models.py b/discord/app_commands/models.py index c28c1c4d0..005dbafb9 100644 --- a/discord/app_commands/models.py +++ b/discord/app_commands/models.py @@ -60,6 +60,7 @@ if TYPE_CHECKING: from ..types.command import ( ApplicationCommand as ApplicationCommandPayload, ApplicationCommandOption, + ApplicationCommandOptionChoice, ApplicationCommandPermissions, GuildApplicationCommandPermissions, ) @@ -431,13 +432,21 @@ class Choice(Generic[ChoiceT]): __slots__ = ('name', 'value', '_locale_name', 'name_localizations') - def __init__(self, *, name: Union[str, locale_str], value: ChoiceT, name_localizations: Dict[Locale, str] = MISSING): + def __init__(self, *, name: Union[str, locale_str], value: ChoiceT): name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) self.name: str = name self._locale_name: Optional[locale_str] = locale self.value: ChoiceT = value self.name_localizations: Dict[Locale, str] = MISSING + @classmethod + def from_dict(cls, data: ApplicationCommandOptionChoice) -> Choice[ChoiceT]: + self = cls.__new__(cls) + self.name = data['name'] + self.value = data['value'] + self.name_localizations = _to_locale_dict(data.get('name_localizations') or {}) + return self + def __eq__(self, o: object) -> bool: return isinstance(o, Choice) and self.name == o.name and self.value == o.value @@ -480,7 +489,7 @@ class Choice(Generic[ChoiceT]): 'name': self.name, 'value': self.value, } - if self.name_localizations is not MISSING: + if self.name_localizations: base['name_localizations'] = {str(k): v for k, v in self.name_localizations.items()} return base @@ -844,9 +853,7 @@ class Argument: self.max_length: Optional[int] = data.get('max_length') self.autocomplete: bool = data.get('autocomplete', False) self.channel_types: List[ChannelType] = [try_enum(ChannelType, d) for d in data.get('channel_types', [])] - self.choices: List[Choice[Union[int, float, str]]] = [ - Choice(name=d['name'], value=d['value']) for d in data.get('choices', []) - ] + self.choices: List[Choice[Union[int, float, str]]] = [Choice.from_dict(d) for d in data.get('choices', [])] self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {})