diff --git a/discord/application.py b/discord/application.py index 3ef1e1461..902bab620 100644 --- a/discord/application.py +++ b/discord/application.py @@ -31,7 +31,6 @@ from typing import ( AsyncIterator, Collection, List, - Literal, Mapping, Optional, Sequence, @@ -55,6 +54,7 @@ from .enums import ( EmbeddedActivityOrientation, EmbeddedActivityPlatform, Locale, + OperatingSystem, RPCApplicationState, StoreApplicationState, UserFlags, @@ -84,6 +84,7 @@ if TYPE_CHECKING: Achievement as AchievementPayload, ActivityStatistics as ActivityStatisticsPayload, Application as ApplicationPayload, + ApplicationExecutable as ApplicationExecutablePayload, ApplicationInstallParams as ApplicationInstallParamsPayload, Asset as AssetPayload, BaseApplication as BaseApplicationPayload, @@ -95,6 +96,7 @@ if TYPE_CHECKING: Manifest as ManifestPayload, ManifestLabel as ManifestLabelPayload, PartialApplication as PartialApplicationPayload, + ThirdPartySKU as ThirdPartySKUPayload, UnverifiedApplication as UnverifiedApplicationPayload, WhitelistedUser as WhitelistedUserPayload, ) @@ -424,7 +426,7 @@ class ThirdPartySKU: __slots__ = ('application', 'distributor', 'id', 'sku_id') - def __init__(self, *, data: dict, application: PartialApplication): + def __init__(self, *, data: ThirdPartySKUPayload, application: PartialApplication): self.application = application self.distributor: Distributor = try_enum(Distributor, data['distributor']) self.id: Optional[str] = data.get('id') @@ -732,8 +734,12 @@ class ApplicationExecutable: ----------- name: :class:`str` The name of the executable. - os: :class:`str` + os: :class:`OperatingSystem` The operating system the executable is for. + + .. versionchanged:: 2.1 + + The type of this attribute has changed to :class:`OperatingSystem`. launcher: :class:`bool` Whether the executable is a launcher or not. application: :class:`PartialApplication` @@ -747,9 +753,9 @@ class ApplicationExecutable: 'application', ) - def __init__(self, *, data: dict, application: PartialApplication): + def __init__(self, *, data: ApplicationExecutablePayload, application: PartialApplication): self.name: str = data['name'] - self.os: Literal['win32', 'linux', 'darwin'] = data['os'] + self.os: OperatingSystem = OperatingSystem.from_string(data['os']) self.launcher: bool = data['is_launcher'] self.application = application diff --git a/discord/http.py b/discord/http.py index d8e914744..0fe516785 100644 --- a/discord/http.py +++ b/discord/http.py @@ -3336,7 +3336,7 @@ class HTTPClient: super_properties_to_track=True, ) - def botify_app(self, app_id: Snowflake) -> Response[application.Token]: + def botify_app(self, app_id: Snowflake) -> Response[application.OptionalToken]: return self.request( Route('POST', '/applications/{app_id}/bot', app_id=app_id), json={}, super_properties_to_track=True ) @@ -3346,10 +3346,10 @@ class HTTPClient: Route('PATCH', '/applications/{app_id}/bot', app_id=app_id), json=payload, super_properties_to_track=True ) - def reset_secret(self, app_id: Snowflake) -> Response[dict]: + def reset_secret(self, app_id: Snowflake) -> Response[application.Secret]: return self.request(Route('POST', '/applications/{app_id}/reset', app_id=app_id), super_properties_to_track=True) - def reset_bot_token(self, app_id: Snowflake) -> Response[dict]: + def reset_bot_token(self, app_id: Snowflake) -> Response[application.Token]: return self.request(Route('POST', '/applications/{app_id}/bot/reset', app_id=app_id), super_properties_to_track=True) def get_detectable_applications(self) -> Response[List[application.PartialApplication]]: diff --git a/discord/types/application.py b/discord/types/application.py index d9f9eef46..4ac9c61cc 100644 --- a/discord/types/application.py +++ b/discord/types/application.py @@ -34,10 +34,18 @@ from .user import APIUser, PartialUser class Token(TypedDict): + token: str + + +class OptionalToken(TypedDict): # Missing if a bot already exists 😭 token: Optional[str] +class Secret(TypedDict): + secret: str + + class BaseApplication(TypedDict): id: Snowflake name: str @@ -62,12 +70,11 @@ class PartialApplication(BaseApplication): owner: NotRequired[APIUser] # Not actually ever present in partial app team: NotRequired[Team] verify_key: str - description: str - cover_image: NotRequired[Optional[str]] flags: NotRequired[int] rpc_origins: NotRequired[List[str]] hook: NotRequired[bool] overlay: NotRequired[bool] + overlay_warn: NotRequired[bool] overlay_compatibility_hook: NotRequired[bool] terms_of_service_url: NotRequired[str] privacy_policy_url: NotRequired[str] @@ -87,6 +94,9 @@ class PartialApplication(BaseApplication): guild: NotRequired[PartialGuild] install_params: NotRequired[ApplicationInstallParams] deeplink_uri: NotRequired[str] + store_listing_sku_id: NotRequired[Snowflake] + executables: NotRequired[List[ApplicationExecutable]] + third_party_skus: NotRequired[List[ThirdPartySKU]] class ApplicationDiscoverability(TypedDict): @@ -97,12 +107,13 @@ class ApplicationDiscoverability(TypedDict): class Application(PartialApplication, IntegrationApplication, ApplicationDiscoverability): redirect_uris: List[str] interactions_endpoint_url: Optional[str] + interactions_version: Literal[1, 2] + interactions_event_types: List[str] verification_state: int store_application_state: int rpc_application_state: int creator_monetization_state: int role_connections_verification_url: NotRequired[Optional[str]] - # GET /applications/{application.id} only approximate_guild_count: NotRequired[int] @@ -136,6 +147,18 @@ class EULA(TypedDict): content: str +class ApplicationExecutable(TypedDict): + name: str + os: Literal['win32', 'linux', 'darwin'] + is_launcher: bool + + +class ThirdPartySKU(TypedDict): + distributor: Literal['discord', 'steam', 'twitch', 'uplay', 'battlenet', 'origin', 'gog', 'epic', 'google_play'] + id: Optional[str] + sku_id: Optional[str] + + class BaseAchievement(TypedDict): id: Snowflake name: Union[str, Dict[str, Union[str, Dict[str, str]]]]