From b47133dfb28781495c74b3e4354ebe57cbbf0978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20N=C3=B8rgaard?= Date: Thu, 29 Jul 2021 00:41:43 +0100 Subject: [PATCH] Add BaseUser.banner for all subclasses to access new banners --- discord/asset.py | 11 ++++++++++ discord/user.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/discord/asset.py b/discord/asset.py index e83811897ac3..eafff466d48f 100644 --- a/discord/asset.py +++ b/discord/asset.py @@ -224,6 +224,17 @@ def _from_sticker(cls, state, sticker_id: int, sticker_hash: str) -> Asset: animated=False, ) + @classmethod + def _from_user_banner(cls, state, user_id: int, banner_hash: str) -> Asset: + animated = banner_hash.startswith('a_') + format = 'gif' if animated else 'png' + return cls( + state, + url=f'{cls.BASE}/banners/{user_id}/{banner_hash}.{format}?size=512', + key=banner_hash, + animated=animated + ) + def __str__(self) -> str: return self._url diff --git a/discord/user.py b/discord/user.py index 261eea872a23..d0a3960ae11d 100644 --- a/discord/user.py +++ b/discord/user.py @@ -41,8 +41,8 @@ class _UserTag: id: int -class BaseUser(_UserTag): - __slots__ = ('name', 'id', 'discriminator', '_avatar', 'bot', 'system', '_public_flags', '_state') +class BaseUser(_BaseUser): + __slots__ = ('name', 'id', 'discriminator', '_avatar', '_banner', '_accent_colour', 'bot', 'system', '_public_flags', '_state') if TYPE_CHECKING: name: str @@ -78,6 +78,8 @@ def _update(self, data): self.id = int(data['id']) self.discriminator = data['discriminator'] self._avatar = data['avatar'] + self._banner = data.get('banner', None) + self._accent_colour = data.get('accent_color', None) self._public_flags = data.get('public_flags', 0) self.bot = data.get('bot', False) self.system = data.get('system', False) @@ -90,6 +92,8 @@ def _copy(cls, user): self.id = user.id self.discriminator = user.discriminator self._avatar = user._avatar + self._banner = user._banner + self._accent_colour = user._accent_colour self.bot = user.bot self._state = user._state self._public_flags = user._public_flags @@ -127,6 +131,50 @@ def default_avatar(self): """:class:`Asset`: Returns the default avatar for a given user. This is calculated by the user's discriminator.""" return Asset._from_default_avatar(self._state, int(self.discriminator) % len(DefaultAvatar)) + @property + def banner(self) -> Optional[Asset]: + """Optional[:class:`Asset`]: Returns the user's banner asset, if available. + + .. versionadded:: 2.0 + + + .. note:: + This information is only available via :meth:`Client.fetch_user`. + """ + if self._banner is None: + return None + return Asset._from_user_banner(self._state, self.id, self._banner) + + @property + def accent_colour(self) -> Optional[Colour]: + """Optional[:class:`Colour`]: Returns the user's accent colour, if applicable. + + There is an alias for this named :attr:`accent_color`. + + .. versionadded:: 2.0 + + .. note:: + + This information is only available via :meth:`Client.fetch_user`. + """ + if self._accent_color is None: + return None + return Colour(self._accent_color) + + @property + def accent_color(self) -> Optional[Colour]: + """Optional[:class:`Colour`]: Returns the user's accent color, if applicable. + + There is an alias for this named :attr:`accent_colour`. + + .. versionadded:: 2.0 + + .. note:: + + This information is only available via :meth:`Client.fetch_user`. + """ + return self.accent_colour + @property def colour(self): """:class:`Colour`: A property that returns a colour denoting the rendered colour