Skip to content

Commit

Permalink
Add BaseUser.banner for all subclasses to access new banners
Browse files Browse the repository at this point in the history
  • Loading branch information
AbstractUmbra authored Jul 28, 2021
1 parent fc51736 commit b47133d
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 2 deletions.
11 changes: 11 additions & 0 deletions discord/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
52 changes: 50 additions & 2 deletions discord/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit b47133d

Please sign in to comment.