From 2e2560126fb924d558c9df3f92162eda4de46323 Mon Sep 17 00:00:00 2001 From: SebbyLaw <44045823+SebbyLaw@users.noreply.github.com> Date: Sun, 4 Oct 2020 05:41:29 -0700 Subject: [PATCH] Implement icon_rl_as and cover_image_url_as for AppInfo --- discord/appinfo.py | 66 ++++++++++++++++++++++++++++++++++++++++++++-- discord/asset.py | 18 ++++++++++--- discord/channel.py | 35 ++++++++++++++++++++++-- discord/team.py | 35 ++++++++++++++++++++++-- 4 files changed, 144 insertions(+), 10 deletions(-) diff --git a/discord/appinfo.py b/discord/appinfo.py index 0a15e1e10..4ff76d39a 100644 --- a/discord/appinfo.py +++ b/discord/appinfo.py @@ -131,17 +131,79 @@ class AppInfo: def icon_url(self): """:class:`.Asset`: Retrieves the application's icon asset. + This is equivalent to calling :meth:`icon_url_as` with + the default parameters ('webp' format and a size of 1024). + .. versionadded:: 1.3 """ - return Asset._from_icon(self._state, self, 'app') + return self.icon_url_as() + + def icon_url_as(self, *, format='webp', size=1024): + """Returns an :class:`Asset` for the icon the application has. + + The format must be one of 'webp', 'jpeg', 'jpg' or 'png'. + The size must be a power of 2 between 16 and 4096. + + .. versionadded:: 1.6 + + Parameters + ----------- + format: :class:`str` + The format to attempt to convert the icon to. Defaults to 'webp'. + size: :class:`int` + The size of the image to display. + + Raises + ------ + InvalidArgument + Bad image format passed to ``format`` or invalid ``size``. + + Returns + -------- + :class:`Asset` + The resulting CDN asset. + """ + return Asset._from_icon(self._state, self, 'app', format=format, size=size) + @property def cover_image_url(self): """:class:`.Asset`: Retrieves the cover image on a store embed. + This is equivalent to calling :meth:`cover_image_url_as` with + the default parameters ('webp' format and a size of 1024). + .. versionadded:: 1.3 """ - return Asset._from_cover_image(self._state, self) + return self.cover_image_url_as() + + def cover_image_url_as(self, *, format='webp', size=1024): + """Returns an :class:`Asset` for the image on store embeds + if this application is a game sold on Discord. + + The format must be one of 'webp', 'jpeg', 'jpg' or 'png'. + The size must be a power of 2 between 16 and 4096. + + .. versionadded:: 1.6 + + Parameters + ----------- + format: :class:`str` + The format to attempt to convert the image to. Defaults to 'webp'. + size: :class:`int` + The size of the image to display. + + Raises + ------ + InvalidArgument + Bad image format passed to ``format`` or invalid ``size``. + + Returns + -------- + :class:`Asset` + The resulting CDN asset. + """ + return Asset._from_cover_image(self._state, self, format=format, size=size) @property def guild(self): diff --git a/discord/asset.py b/discord/asset.py index 349c42a40..f5c5eddcf 100644 --- a/discord/asset.py +++ b/discord/asset.py @@ -89,19 +89,29 @@ class Asset: return cls(state, '/avatars/{0.id}/{0.avatar}.{1}?size={2}'.format(user, format, size)) @classmethod - def _from_icon(cls, state, object, path): + def _from_icon(cls, state, object, path, *, format='webp', size=1024): if object.icon is None: return cls(state) - url = '/{0}-icons/{1.id}/{1.icon}.jpg'.format(path, object) + if not utils.valid_icon_size(size): + raise InvalidArgument("size must be a power of 2 between 16 and 4096") + if format not in VALID_STATIC_FORMATS: + raise InvalidArgument("format must be None or one of {}".format(VALID_STATIC_FORMATS)) + + url = '/{0}-icons/{1.id}/{1.icon}.{2}?size={3}'.format(path, object, format, size) return cls(state, url) @classmethod - def _from_cover_image(cls, state, obj): + def _from_cover_image(cls, state, obj, *, format='webp', size=1024): if obj.cover_image is None: return cls(state) - url = '/app-assets/{0.id}/store/{0.cover_image}.jpg'.format(obj) + if not utils.valid_icon_size(size): + raise InvalidArgument("size must be a power of 2 between 16 and 4096") + if format not in VALID_STATIC_FORMATS: + raise InvalidArgument("format must be None or one of {}".format(VALID_STATIC_FORMATS)) + + url = '/app-assets/{0.id}/store/{0.cover_image}.{1}?size={2}'.format(obj, format, size) return cls(state, url) @classmethod diff --git a/discord/channel.py b/discord/channel.py index c3ccbe0ff..7568b4047 100644 --- a/discord/channel.py +++ b/discord/channel.py @@ -1154,8 +1154,39 @@ class GroupChannel(discord.abc.Messageable, Hashable): @property def icon_url(self): - """:class:`Asset`: Returns the channel's icon asset if available.""" - return Asset._from_icon(self._state, self, 'channel') + """:class:`Asset`: Returns the channel's icon asset if available. + + This is equivalent to calling :meth:`icon_url_as` with + the default parameters ('webp' format and a size of 1024). + """ + return self.icon_url_as() + + def icon_url_as(self, *, format='webp', size=1024): + """Returns an :class:`Asset` for the icon the channel has. + + The format must be one of 'webp', 'jpeg', 'jpg' or 'png'. + The size must be a power of 2 between 16 and 4096. + + .. versionadded:: 2.0 + + Parameters + ----------- + format: :class:`str` + The format to attempt to convert the icon to. Defaults to 'webp'. + size: :class:`int` + The size of the image to display. + + Raises + ------ + InvalidArgument + Bad image format passed to ``format`` or invalid ``size``. + + Returns + -------- + :class:`Asset` + The resulting CDN asset. + """ + return Asset._from_icon(self._state, self, 'channel', format=format, size=size) @property def created_at(self): diff --git a/discord/team.py b/discord/team.py index 0afb6458d..94b00a2e5 100644 --- a/discord/team.py +++ b/discord/team.py @@ -68,8 +68,39 @@ class Team: @property def icon_url(self): - """:class:`.Asset`: Retrieves the team's icon asset.""" - return Asset._from_icon(self._state, self, 'team') + """:class:`.Asset`: Retrieves the team's icon asset. + + This is equivalent to calling :meth:`icon_url_as` with + the default parameters ('webp' format and a size of 1024). + """ + return self.icon_url_as() + + def icon_url_as(self, *, format='None', size=1024): + """Returns an :class:`Asset` for the icon the team has. + + The format must be one of 'webp', 'jpeg', 'jpg' or 'png'. + The size must be a power of 2 between 16 and 4096. + + .. versionadded:: 2.0 + + Parameters + ----------- + format: :class:`str` + The format to attempt to convert the icon to. Defaults to 'webp'. + size: :class:`int` + The size of the image to display. + + Raises + ------ + InvalidArgument + Bad image format passed to ``format`` or invalid ``size``. + + Returns + -------- + :class:`Asset` + The resulting CDN asset. + """ + return Asset._from_icon(self._state, self, 'team', format=format, size=size) @property def owner(self):