Skip to content

Commit a13fc8f

Browse files
committed
Add support for guild_banner and display_banner
1 parent 7d3eff9 commit a13fc8f

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

discord/asset.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,17 @@ def _from_guild_avatar(cls, state: _State, guild_id: int, member_id: int, avatar
246246
animated=animated,
247247
)
248248

249+
@classmethod
250+
def _from_guild_banner(cls, state: _State, guild_id: int, member_id: int, banner: str) -> Self:
251+
animated = banner.startswith('a_')
252+
format = 'gif' if animated else 'png'
253+
return cls(
254+
state,
255+
url=f"{cls.BASE}/guilds/{guild_id}/users/{member_id}/banners/{banner}.{format}?size=1024",
256+
key=banner,
257+
animated=animated,
258+
)
259+
249260
@classmethod
250261
def _from_avatar_decoration(cls, state: _State, avatar_decoration: str) -> Self:
251262
return cls(

discord/member.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ class Member(discord.abc.Messageable, _UserTag):
322322
'_user',
323323
'_state',
324324
'_avatar',
325+
'_banner',
325326
'_flags',
326327
'_avatar_decoration_data',
327328
)
@@ -358,6 +359,7 @@ def __init__(self, *, data: MemberWithUserPayload, guild: Guild, state: Connecti
358359
self.nick: Optional[str] = data.get('nick', None)
359360
self.pending: bool = data.get('pending', False)
360361
self._avatar: Optional[str] = data.get('avatar')
362+
self._banner: Optional[str] = data.get('banner')
361363
self._permissions: Optional[int]
362364
self._flags: int = data['flags']
363365
self._avatar_decoration_data: Optional[AvatarDecorationData] = data.get('avatar_decoration_data')
@@ -649,6 +651,28 @@ def guild_avatar(self) -> Optional[Asset]:
649651
return None
650652
return Asset._from_guild_avatar(self._state, self.guild.id, self.id, self._avatar)
651653

654+
@property
655+
def display_banner(self) -> Optional[Asset]:
656+
"""Optional[:class:`Asset`]: Returns the member's displayed banner, if any.
657+
658+
This is the member's guild banner if available, otherwise it's their
659+
global banner. If the member has no banner set then ``None`` is returned.
660+
661+
.. versionadded:: 2.5
662+
"""
663+
return self.guild_banner or self._user.banner
664+
665+
@property
666+
def guild_banner(self) -> Optional[Asset]:
667+
"""Optional[:class:`Asset`]: Returns an :class:`Asset` for the guild banner
668+
the member has. If unavailable, ``None`` is returned.
669+
670+
.. versionadded:: 2.5
671+
"""
672+
if self._banner is None:
673+
return None
674+
return Asset._from_guild_banner(self._state, self.guild.id, self.id, self._banner)
675+
652676
@property
653677
def activity(self) -> Optional[ActivityTypes]:
654678
"""Optional[Union[:class:`BaseActivity`, :class:`Spotify`]]: Returns the primary

discord/types/member.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class Member(PartialMember, total=False):
4848
pending: bool
4949
permissions: str
5050
communication_disabled_until: str
51+
banner: NotRequired[Optional[str]]
5152
avatar_decoration_data: NotRequired[AvatarDecorationData]
5253

5354

0 commit comments

Comments
 (0)