From fcd952d27839af9085ed6b89b9ca7cff7f442802 Mon Sep 17 00:00:00 2001 From: nes-91 Date: Fri, 29 Aug 2025 03:52:55 +0200 Subject: [PATCH 1/6] Added support for Display Name Styles --- discord/enums.py | 22 ++++++++++++++++++++++ discord/types/user.py | 9 +++++++++ discord/user.py | 22 ++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/discord/enums.py b/discord/enums.py index 202ce46f3d6b..70d5f39d3f2a 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -40,6 +40,8 @@ 'AuditLogAction', 'AuditLogActionCategory', 'UserFlags', + 'NameFont', + 'NameEffect', 'ActivityType', 'NotificationLevel', 'HighlightLevel', @@ -694,6 +696,26 @@ class UserFlags(Enum): collaborator = 1125899906842624 restricted_collaborator = 2251799813685248 +class NameFont(Enum): + default = 11 + bangers = 1 + bio_rhyme = 2 + cherry_bomb = 3 + chicle = 4 + compagnon = 5 + museo_moderno = 6 + neo_castel = 7 + pixelify = 8 + ribes = 9 + sinistre = 10 + zilla_slab = 12 + +class NameEffect(Enum): + solid = 1 + gradient = 2 + neon = 3 + toon = 4 + pop = 5 class ActivityType(Enum): unknown = -1 diff --git a/discord/types/user.py b/discord/types/user.py index ae8ca1ef7d8a..84eb86a24d8e 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -42,6 +42,7 @@ class PartialUser(TypedDict): system: NotRequired[bool] global_name: Optional[str] primary_guild: NotRequired[Optional[PrimaryGuild]] + display_name_style: Optional[DisplayNameStyle] ConnectionType = Literal[ @@ -70,6 +71,8 @@ class PartialUser(TypedDict): ] ConnectionVisibilty = Literal[0, 1] PremiumType = Literal[0, 1, 2, 3] +DisplayNameFont = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +DisplayNameEffect = Literal[1, 2, 3, 4, 5] class APIUser(PartialUser): @@ -96,6 +99,12 @@ class User(APIUser, total=False): mobile: bool +class DisplayNameStyle(TypedDict): + font_id: DisplayNameFont + effect_id: DisplayNameEffect + colors: List[int] # 1-2 + + class UserWithToken(User): token: str diff --git a/discord/user.py b/discord/user.py index 0803482ab411..98a8bbbcea23 100644 --- a/discord/user.py +++ b/discord/user.py @@ -35,6 +35,8 @@ PremiumType, RelationshipAction, RelationshipType, + NameEffect, + NameFont, try_enum, ) from .errors import NotFound @@ -73,6 +75,7 @@ UserAvatar as UserAvatarPayload, AvatarDecorationData, PrimaryGuild as PrimaryGuildPayload, + DisplayNameStyle as DisplayNameStylePayload ) from .types.snowflake import Snowflake @@ -88,6 +91,14 @@ class _UserTag: __slots__ = () id: int +class DisplayNameStyle: + def __init__(self, *, data: DisplayNameStylePayload) -> None: + self.font: NameFont = try_enum(NameFont, data['font_id']) + self.effect: NameEffect = try_enum(NameEffect, data['effect_id']) + self.colors: List[discord.Colour] = [discord.Colour(color) for color in data.get('colors', [])] + + def __repr__(self) -> str: + return f'' class BaseUser(_UserTag): __slots__ = ( @@ -105,6 +116,7 @@ class BaseUser(_UserTag): 'premium_type', '_state', '_primary_guild', + '_display_name_style', ) if TYPE_CHECKING: @@ -121,6 +133,7 @@ class BaseUser(_UserTag): _accent_colour: Optional[int] _public_flags: int _primary_guild: Optional[PrimaryGuildPayload] + _display_name_style: Optional[DisplayNameStylePayload] def __init__(self, *, state: ConnectionState, data: Union[UserPayload, PartialUserPayload]) -> None: self._state = state @@ -159,6 +172,7 @@ def _update(self, data: Union[UserPayload, PartialUserPayload]) -> None: self.bot = data.get('bot', False) self.system = data.get('system', False) self._primary_guild = data.get('primary_guild', None) + self._display_name_style = data.get('display_name_styles', None) or None @classmethod def _copy(cls, user: Self) -> Self: @@ -177,6 +191,7 @@ def _copy(cls, user: Self) -> Self: self.system = user.system self._state = user._state self._primary_guild = user._primary_guild + self._display_name_style = user._display_name_style return self @@ -194,6 +209,7 @@ def _to_minimal_user_json(self) -> APIUserPayload: 'banner': self._banner, 'accent_color': self._accent_colour, 'primary_guild': self._primary_guild, + 'display_name_style': self._display_name_style, } return user @@ -383,6 +399,12 @@ def primary_guild(self) -> PrimaryGuild: return PrimaryGuild(state=self._state, data=self._primary_guild) return PrimaryGuild._default(self._state) + @property + def display_name_style(self) -> Optional[DisplayNameStyle]: + if self._display_name_style is None: + return None + return DisplayNameStyle(data=self._display_name_style) + def mentioned_in(self, message: Message) -> bool: """Checks if the user is mentioned in the specified message. From 4875e96b6288340ed4830b8064b49b0a658d1c97 Mon Sep 17 00:00:00 2001 From: Nes <137285328+nes-91@users.noreply.github.com> Date: Fri, 29 Aug 2025 05:07:29 +0200 Subject: [PATCH 2/6] Update user.py --- discord/types/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/types/user.py b/discord/types/user.py index 84eb86a24d8e..26d491e9de73 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -71,7 +71,7 @@ class PartialUser(TypedDict): ] ConnectionVisibilty = Literal[0, 1] PremiumType = Literal[0, 1, 2, 3] -DisplayNameFont = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +DisplayNameFont = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] DisplayNameEffect = Literal[1, 2, 3, 4, 5] From 751727c93271c7831463c48dd302155c5d48ba92 Mon Sep 17 00:00:00 2001 From: nes-91 Date: Fri, 29 Aug 2025 21:43:10 +0200 Subject: [PATCH 3/6] Added glow nameeffect, fixed api type & updated User._update_self() --- discord/enums.py | 1 + discord/types/user.py | 4 ++-- discord/user.py | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/discord/enums.py b/discord/enums.py index 70d5f39d3f2a..67360913cbaf 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -716,6 +716,7 @@ class NameEffect(Enum): neon = 3 toon = 4 pop = 5 + glow = 6 class ActivityType(Enum): unknown = -1 diff --git a/discord/types/user.py b/discord/types/user.py index 26d491e9de73..d0cf33cbbced 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -42,7 +42,7 @@ class PartialUser(TypedDict): system: NotRequired[bool] global_name: Optional[str] primary_guild: NotRequired[Optional[PrimaryGuild]] - display_name_style: Optional[DisplayNameStyle] + display_name_styles: Optional[DisplayNameStyle] ConnectionType = Literal[ @@ -72,7 +72,7 @@ class PartialUser(TypedDict): ConnectionVisibilty = Literal[0, 1] PremiumType = Literal[0, 1, 2, 3] DisplayNameFont = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] -DisplayNameEffect = Literal[1, 2, 3, 4, 5] +DisplayNameEffect = Literal[1, 2, 3, 4, 5, 6] class APIUser(PartialUser): diff --git a/discord/user.py b/discord/user.py index 98a8bbbcea23..346f18d95d65 100644 --- a/discord/user.py +++ b/discord/user.py @@ -209,7 +209,7 @@ def _to_minimal_user_json(self) -> APIUserPayload: 'banner': self._banner, 'accent_color': self._accent_colour, 'primary_guild': self._primary_guild, - 'display_name_style': self._display_name_style, + 'display_name_styles': self._display_name_style, } return user @@ -1043,6 +1043,7 @@ def _update_self(self, user: Union[PartialUserPayload, Tuple[()]]) -> Optional[T self._avatar_decoration_data, self.global_name, self._primary_guild, + self._display_name_style, ) modified = ( user['username'], @@ -1052,6 +1053,7 @@ def _update_self(self, user: Union[PartialUserPayload, Tuple[()]]) -> Optional[T user.get('avatar_decoration_data'), user.get('global_name'), user.get('primary_guild'), + user.get('display_name_styles'), ) if original != modified: to_return = User._copy(self) @@ -1063,6 +1065,7 @@ def _update_self(self, user: Union[PartialUserPayload, Tuple[()]]) -> Optional[T self._avatar_decoration_data, self.global_name, self._primary_guild, + self._display_name_style, ) = modified # Signal to dispatch user_update return to_return, self From 8e4c30963d5f371b59b54a9316b8c02fcd4a87c3 Mon Sep 17 00:00:00 2001 From: nes-91 Date: Fri, 29 Aug 2025 21:54:43 +0200 Subject: [PATCH 4/6] Updated docs --- docs/api.rst | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/docs/api.rst b/docs/api.rst index 0d13f40d32c2..af56a154e4db 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2179,6 +2179,86 @@ of :class:`enum.Enum`. .. versionadded:: 2.1 +.. class:: NameFont + + Specifies the font of :class:`DisplayNameStyle`. + + .. attribute:: default + + The default font. + + .. attribute:: bangers + + "Bangers" font. + + .. attribute:: bio_rhyme + + "BioRhyme" font. + + .. attribute:: cherry_bomb + + "Cherry Bomb One" font. + + .. attribute:: chicle + + "Chicle" font. + + .. attribute:: compagnon + + "Compagnon" font. + + .. attribute:: museo_moderno + + "MuseoModerno" font. + + .. attribute:: neo_castel + + "Néo-Castel" font. + + .. attribute:: pixelify + + "Pixelify Sans" font. + + .. attribute:: ribes + + "Ribes" font. + + .. attribute:: sinistre + + "Sinistre" font. + + .. attribute:: zilla_slab + + "Zilla Slab" font. + +.. class:: NameEffect + + Specifies the effect of :class:`DisplayNameStyle`. + + .. attribute:: solid + + Displays the first color provided. + + .. attribute:: gradient + + Two color gradient. + + .. attribute:: neon + + Glow around the name. + + .. attribute:: toon + + Subtle vertical gradient and stroke. + + .. attribute:: pop + + Colored dropshadow. + + .. attribute:: glow + + Alternate gradient style. + .. class:: ActivityType Specifies the type of :class:`Activity`. This is used to check how to From 1fed1aafa9647e2325107c2264b3d6940280cff5 Mon Sep 17 00:00:00 2001 From: nes-91 Date: Sat, 30 Aug 2025 23:01:24 +0200 Subject: [PATCH 5/6] Added doc strings --- discord/user.py | 18 ++++++++++++++++++ docs/api.rst | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/discord/user.py b/discord/user.py index 346f18d95d65..6a42fdb8c6e3 100644 --- a/discord/user.py +++ b/discord/user.py @@ -84,6 +84,7 @@ 'User', 'ClientUser', 'RecentAvatar', + 'DisplayNameStyle', ) @@ -92,6 +93,19 @@ class _UserTag: id: int class DisplayNameStyle: + """Represents a user's display name style. + + Attributes + ----------- + font: :class:`NameFont` + The font used for the display name. + effect: :class:`NameEffect` + The visual effect applied to the display name. + colors: List[:class:`Colour`] + The list of colours applied to the display name. + + .. versionadded:: 2.1 + """ def __init__(self, *, data: DisplayNameStylePayload) -> None: self.font: NameFont = try_enum(NameFont, data['font_id']) self.effect: NameEffect = try_enum(NameEffect, data['effect_id']) @@ -401,6 +415,10 @@ def primary_guild(self) -> PrimaryGuild: @property def display_name_style(self) -> Optional[DisplayNameStyle]: + """:class:`DisplayNameStyle`: Returns the user's display name style. + + .. versionadded:: 2.1 + """ if self._display_name_style is None: return None return DisplayNameStyle(data=self._display_name_style) diff --git a/docs/api.rst b/docs/api.rst index af56a154e4db..31114428537a 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -7381,6 +7381,11 @@ User .. autoclass:: PrimaryGuild() :members: +.. attributetable:: DisplayNameStyle + +.. autoclass:: DisplayNameStyle() + :members: + Affinity ~~~~~~~~~ From 37e2a1df10f72c3cb2b9c9e2af97150388cd5595 Mon Sep 17 00:00:00 2001 From: dolfies Date: Sat, 30 Aug 2025 17:07:13 -0400 Subject: [PATCH 6/6] Update discord/user.py --- discord/user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/user.py b/discord/user.py index 6a42fdb8c6e3..83d89ce455c7 100644 --- a/discord/user.py +++ b/discord/user.py @@ -95,6 +95,8 @@ class _UserTag: class DisplayNameStyle: """Represents a user's display name style. + .. versionadded:: 2.1 + Attributes ----------- font: :class:`NameFont` @@ -103,8 +105,6 @@ class DisplayNameStyle: The visual effect applied to the display name. colors: List[:class:`Colour`] The list of colours applied to the display name. - - .. versionadded:: 2.1 """ def __init__(self, *, data: DisplayNameStylePayload) -> None: self.font: NameFont = try_enum(NameFont, data['font_id'])