From cc0a0e82c15bd2559efa7252bd912a4e57660c16 Mon Sep 17 00:00:00 2001 From: dolfies Date: Mon, 21 Aug 2023 13:57:14 +0300 Subject: [PATCH] Add missing application fields --- discord/application.py | 45 ++++++++++++++++++++++++++++++++---- discord/types/application.py | 25 ++++++++++++-------- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/discord/application.py b/discord/application.py index 0d09574a1..f0e21195f 100644 --- a/discord/application.py +++ b/discord/application.py @@ -409,7 +409,7 @@ class ThirdPartySKU: Attributes ----------- - application: :class:`PartialApplication` + application: Union[:class:`PartialApplication`, :class:`IntegrationApplication`] The application that the SKU belongs to. distributor: :class:`Distributor` The distributor of the SKU. @@ -421,7 +421,7 @@ class ThirdPartySKU: __slots__ = ('application', 'distributor', 'id', 'sku_id') - def __init__(self, *, data: ThirdPartySKUPayload, application: PartialApplication): + def __init__(self, *, data: ThirdPartySKUPayload, application: Union[PartialApplication, IntegrationApplication]): self.application = application self.distributor: Distributor = try_enum(Distributor, data['distributor']) self.id: Optional[str] = data.get('id') @@ -1870,6 +1870,7 @@ class PartialApplication(Hashable): self._icon: Optional[str] = data.get('icon') self._cover_image: Optional[str] = data.get('cover_image') + self._splash: Optional[str] = data.get('splash') self.terms_of_service_url: Optional[str] = data.get('terms_of_service_url') self.privacy_policy_url: Optional[str] = data.get('privacy_policy_url') @@ -1957,6 +1958,16 @@ class PartialApplication(Hashable): return None return Asset._from_icon(self._state, self.id, self._cover_image, path='app') + @property + def splash(self) -> Optional[Asset]: + """Optional[:class:`Asset`]: Retrieves the application's splash, if any. + + .. versionadded:: 2.1 + """ + if self._splash is None: + return None + return Asset._from_icon(self._state, self.id, self._splash, path='app') + @property def flags(self) -> ApplicationFlags: """:class:`ApplicationFlags`: The flags of this application.""" @@ -3582,8 +3593,12 @@ class IntegrationApplication(Hashable): The application name. bot: Optional[:class:`User`] The bot attached to the application, if any. - description: Optional[:class:`str`] + description: :class:`str` The application description. + deeplink_uri: Optional[:class:`str`] + The application's deeplink URI, if set. + + .. versionadded:: 2.1 type: Optional[:class:`ApplicationType`] The type of application. primary_sku_id: Optional[:class:`int`] @@ -3592,6 +3607,10 @@ class IntegrationApplication(Hashable): role_connections_verification_url: Optional[:class:`str`] The application's connection verification URL which will render the application as a verification method in the guild's role verification configuration. + third_party_skus: List[:class:`ThirdPartySKU`] + A list of third party platforms the SKU is available at. + + .. versionadded:: 2.1 """ __slots__ = ( @@ -3600,11 +3619,14 @@ class IntegrationApplication(Hashable): 'name', 'bot', 'description', + 'deeplink_uri', 'type', 'primary_sku_id', 'role_connections_verification_url', + 'third_party_skus', '_icon', '_cover_image', + '_splash', ) def __init__(self, *, state: ConnectionState, data: BaseApplicationPayload): @@ -3618,13 +3640,18 @@ class IntegrationApplication(Hashable): self.id: int = int(data['id']) self.name: str = data['name'] self.description: str = data.get('description') or '' + self.deeplink_uri: Optional[str] = data.get('deeplink_uri') self.type: Optional[ApplicationType] = try_enum(ApplicationType, data['type']) if 'type' in data else None self._icon: Optional[str] = data.get('icon') self._cover_image: Optional[str] = data.get('cover_image') - self.bot: Optional[User] = self._state.create_user(data['bot']) if 'bot' in data else None # type: ignore + self._splash: Optional[str] = data.get('splash') + self.bot: Optional[User] = self._state.create_user(data['bot']) if 'bot' in data else None self.primary_sku_id: Optional[int] = utils._get_as_snowflake(data, 'primary_sku_id') self.role_connections_verification_url: Optional[str] = data.get('role_connections_verification_url') + self.third_party_skus: List[ThirdPartySKU] = [ + ThirdPartySKU(data=t, application=self) for t in data.get('third_party_skus', []) + ] def __repr__(self) -> str: return f'' @@ -3651,6 +3678,16 @@ class IntegrationApplication(Hashable): return None return Asset._from_icon(self._state, self.id, self._cover_image, path='app') + @property + def splash(self) -> Optional[Asset]: + """Optional[:class:`Asset`]: Retrieves the application's splash, if any. + + .. versionadded:: 2.1 + """ + if self._splash is None: + return None + return Asset._from_icon(self._state, self.id, self._splash, path='app') + @property def primary_sku_url(self) -> Optional[str]: """:class:`str`: The URL to the primary SKU of the application, if any.""" diff --git a/discord/types/application.py b/discord/types/application.py index 204576ef1..653b55aae 100644 --- a/discord/types/application.py +++ b/discord/types/application.py @@ -27,6 +27,7 @@ from __future__ import annotations from typing import Dict, List, Literal, Optional, TypedDict, Union from typing_extensions import NotRequired +from .command import ApplicationCommand from .guild import PartialGuild from .snowflake import Snowflake from .team import Team @@ -46,27 +47,29 @@ class Secret(TypedDict): secret: str -class BaseApplication(TypedDict): +class _BaseApplication(TypedDict): id: Snowflake name: str description: str icon: Optional[str] - cover_image: NotRequired[Optional[str]] + cover_image: NotRequired[str] + splash: NotRequired[str] type: Optional[int] primary_sku_id: NotRequired[Snowflake] summary: NotRequired[Literal['']] + deeplink_uri: NotRequired[str] + third_party_skus: NotRequired[List[ThirdPartySKU]] -class RoleConnectionApplication(BaseApplication): +class BaseApplication(_BaseApplication): bot: NotRequired[PartialUser] class IntegrationApplication(BaseApplication): - bot: NotRequired[APIUser] role_connections_verification_url: NotRequired[Optional[str]] -class PartialApplication(BaseApplication): +class PartialApplication(_BaseApplication): owner: NotRequired[APIUser] # Not actually ever present in partial app team: NotRequired[Team] verify_key: str @@ -93,18 +96,17 @@ class PartialApplication(BaseApplication): embedded_activity_config: NotRequired[EmbeddedActivityConfig] 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): discoverability_state: int discovery_eligibility_flags: int + bad_commands: List[ApplicationCommand] -class Application(PartialApplication, IntegrationApplication, ApplicationDiscoverability): +class Application(PartialApplication, IntegrationApplication): redirect_uris: List[str] interactions_endpoint_url: Optional[str] interactions_version: Literal[1, 2] @@ -113,7 +115,10 @@ class Application(PartialApplication, IntegrationApplication, ApplicationDiscove store_application_state: int rpc_application_state: int creator_monetization_state: int - role_connections_verification_url: NotRequired[Optional[str]] + discoverability_state: int + discovery_eligibility_flags: int + monetization_state: int + monetization_eligibility_flags: int approximate_guild_count: NotRequired[int] @@ -304,7 +309,7 @@ class PartialRoleConnection(TypedDict): class RoleConnection(PartialRoleConnection): - application: RoleConnectionApplication + application: BaseApplication application_metadata: List[RoleConnectionMetadata]