From 865d6ff5fa923a52c345baa3348f2ec20a44819c Mon Sep 17 00:00:00 2001 From: Soheab_ <33902984+Soheab@users.noreply.github.com> Date: Wed, 27 Aug 2025 16:44:15 +0200 Subject: [PATCH 1/5] Add support for display_name_styles --- discord/enums.py | 23 +++++++++++++++++++++++ discord/types/user.py | 11 ++++++++++- discord/user.py | 23 ++++++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/discord/enums.py b/discord/enums.py index 28b99ab03..8ccbd73c2 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -988,6 +988,29 @@ class NameplatePalette(Enum): white = 'white' +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 + + def create_unknown_value(cls: Type[E], val: Any) -> E: value_cls = cls._enum_value_cls_ # type: ignore # This is narrowed below name = f'unknown_{val}' diff --git a/discord/types/user.py b/discord/types/user.py index 639384a56..83d92ec06 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -23,12 +23,14 @@ DEALINGS IN THE SOFTWARE. """ from .snowflake import Snowflake -from typing import Literal, Optional, TypedDict +from typing import Literal, Optional, TypedDict, List from typing_extensions import NotRequired PremiumType = Literal[0, 1, 2, 3] NameplatePallete = Literal['crimson', 'berry', 'sky', 'teal', 'forest', 'bubble_gum', 'violet', 'cobalt', 'clover'] +DisplayNameFont = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +DisplayNameEffect = Literal[1, 2, 3, 4, 5] class _UserSKU(TypedDict): @@ -70,6 +72,12 @@ class PartialUser(TypedDict): collectibles: NotRequired[UserCollectibles] +class DisplayNameStyle(TypedDict): + font_id: DisplayNameFont + effect_id: DisplayNameEffect + colors: List[int] # 1-2 + + class User(PartialUser, total=False): bot: bool system: bool @@ -80,3 +88,4 @@ class User(PartialUser, total=False): flags: int premium_type: PremiumType public_flags: int + display_name_styles: DisplayNameStyle diff --git a/discord/user.py b/discord/user.py index 32edb1dc7..65f753003 100644 --- a/discord/user.py +++ b/discord/user.py @@ -29,7 +29,7 @@ from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union import discord.abc from .asset import Asset from .colour import Colour -from .enums import DefaultAvatar +from .enums import DefaultAvatar, NameEffect, NameFont, try_enum from .flags import PublicUserFlags from .utils import snowflake_time, _bytes_to_base64_data, MISSING, _get_as_snowflake from .primary_guild import PrimaryGuild @@ -51,6 +51,7 @@ if TYPE_CHECKING: AvatarDecorationData, PrimaryGuild as PrimaryGuildPayload, UserCollectibles as UserCollectiblesPayload, + DisplayNameStyle as DisplayNameStylePayload, ) @@ -60,6 +61,16 @@ __all__ = ( ) +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 _UserTag: __slots__ = () id: int @@ -81,6 +92,7 @@ class BaseUser(_UserTag): '_avatar_decoration_data', '_primary_guild', '_collectibles', + '_display_name_style', ) if TYPE_CHECKING: @@ -98,6 +110,7 @@ class BaseUser(_UserTag): _avatar_decoration_data: Optional[AvatarDecorationData] _primary_guild: Optional[PrimaryGuildPayload] _collectibles: Optional[UserCollectiblesPayload] + _display_name_style: Optional[DisplayNameStylePayload] def __init__(self, *, state: ConnectionState, data: Union[UserPayload, PartialUserPayload]) -> None: self._state = state @@ -137,6 +150,7 @@ class BaseUser(_UserTag): self._avatar_decoration_data = data.get('avatar_decoration_data') self._primary_guild = data.get('primary_guild', None) self._collectibles = data.get('collectibles', None) + self._display_name_style = data.get('display_name_styles', None) or None @classmethod def _copy(cls, user: Self) -> Self: @@ -155,6 +169,7 @@ class BaseUser(_UserTag): self._avatar_decoration_data = user._avatar_decoration_data self._primary_guild = user._primary_guild self._collectibles = user._collectibles + self._display_name_style = user._display_name_style return self @@ -340,6 +355,12 @@ class BaseUser(_UserTag): return [] return [Collectible(state=self._state, type=key, data=value) for key, value in self._collectibles.items() if value] # type: ignore + @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 412c485fc18f572aa21c0590e592a2b3b1cb5ea1 Mon Sep 17 00:00:00 2001 From: Soheab_ <33902984+Soheab@users.noreply.github.com> Date: Wed, 27 Aug 2025 16:47:03 +0200 Subject: [PATCH 2/5] Add to Member --- discord/member.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/discord/member.py b/discord/member.py index fd2cf7edb..210b470fc 100644 --- a/discord/member.py +++ b/discord/member.py @@ -76,6 +76,7 @@ if TYPE_CHECKING: ) from .primary_guild import PrimaryGuild from .collectible import Collectible + from .user import DisplayNameStyle VocalGuildChannel = Union[VoiceChannel, StageChannel] @@ -313,6 +314,7 @@ class Member(discord.abc.Messageable, _UserTag): avatar_decoration_sku_id: Optional[int] primary_guild: PrimaryGuild collectibles: List[Collectible] + display_name_style: DisplayNameStyle def __init__(self, *, data: MemberWithUserPayload, guild: Guild, state: ConnectionState): self._state: ConnectionState = state From 654c57a40eab04f0dfaede75230cfa7bdc267c68 Mon Sep 17 00:00:00 2001 From: Soheab_ <33902984+Soheab@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:04:44 +0200 Subject: [PATCH 3/5] Format and docs --- discord/enums.py | 2 ++ discord/user.py | 13 +++++++ docs/api.rst | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) diff --git a/discord/enums.py b/discord/enums.py index 8ccbd73c2..04ead90ae 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -85,6 +85,8 @@ __all__ = ( 'MediaItemLoadingState', 'CollectibleType', 'NameplatePalette', + 'NameFont', + 'NameEffect', ) diff --git a/discord/user.py b/discord/user.py index 65f753003..caf4a070a 100644 --- a/discord/user.py +++ b/discord/user.py @@ -58,10 +58,23 @@ if TYPE_CHECKING: __all__ = ( 'User', 'ClientUser', + 'DisplayNameStyle', ) class DisplayNameStyle: + """Represents a user's display name style. + + Attributes + ----------- + font: :class:`NameFont` + The font. + effect: :class:`NameEffect` + The applied effect. + colors: List[:class:`Colour`] + The colors used in the effect. Max of 2. + """ + def __init__(self, *, data: DisplayNameStylePayload) -> None: self.font: NameFont = try_enum(NameFont, data['font_id']) self.effect: NameEffect = try_enum(NameEffect, data['effect_id']) diff --git a/docs/api.rst b/docs/api.rst index 1a564ddca..0496a9a2e 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4132,6 +4132,86 @@ of :class:`enum.Enum`. The collectible nameplate palette is white. +.. class:: NameFont + + Represents the available fonts for a user display name style. + + .. versionadded:: 2.7 + + .. attribute:: default + + The default font is used. + + .. attribute:: bangers + + The 'Bangers' font is used. + + .. attribute:: bio_rhyme + + The 'BioRhyme' font is used. + + .. attribute:: cherry_bomb + + The 'Cherry Bomb' font is used. + + .. attribute:: chicle + + The 'Chicle' font is used. + + .. attribute:: compagnon + + The 'Compagnon' font is used. + + .. attribute:: museo_moderno + + The 'Museo Moderno' font is used. + + .. attribute:: neo_castel + + The 'Neo Castel' font is used. + + .. attribute:: pixelify + + The 'Pixelify' font is used. + + .. attribute:: ribes + + The 'Ribes' font is used. + + .. attribute:: sinistre + + The 'Sinistre' font is used. + + .. attribute:: zilla_slab + + The 'Zilla Slab' font is used. + +.. class:: NameEffect + + Represents the available effects for a user display name style. + + .. versionadded:: 2.7 + + .. attribute:: solid + + The first color provided is used. + + .. attribute:: gradient + + A two colour gradient is used, using both colors provided. + + .. attribute:: neon + + There is a neon glow around the name. + + .. attribute:: toon + + There is a subtle vertical gradient and stroke around the name. + + .. attribute:: pop + + A coloured drop-down shadow is shown. + .. _discord-api-audit-logs: Audit Log Data @@ -5836,6 +5916,14 @@ Collectible .. autoclass:: Collectible() :members: +DisplayNameStyle +~~~~~~~~~~~~~~~~~ + +.. attributetable:: DisplayNameStyle + +.. autoclass:: DisplayNameStyle() + :members: + CallMessage ~~~~~~~~~~~~~~~~~~~ From 135ce3f4b756b084deef3ff02fbc6c0e0ea0d418 Mon Sep 17 00:00:00 2001 From: Soheab_ <33902984+Soheab@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:10:16 +0200 Subject: [PATCH 4/5] Font 12 --- discord/types/user.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/types/user.py b/discord/types/user.py index 83d92ec06..d1c218f4e 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -29,7 +29,7 @@ from typing_extensions import NotRequired PremiumType = Literal[0, 1, 2, 3] NameplatePallete = Literal['crimson', 'berry', 'sky', 'teal', 'forest', 'bubble_gum', 'violet', 'cobalt', 'clover'] -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] @@ -75,7 +75,7 @@ class PartialUser(TypedDict): class DisplayNameStyle(TypedDict): font_id: DisplayNameFont effect_id: DisplayNameEffect - colors: List[int] # 1-2 + colors: List[int] class User(PartialUser, total=False): From c13efe12330aea5600f5b08f5378dde120a01884 Mon Sep 17 00:00:00 2001 From: Soheab_ <33902984+Soheab@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:13:50 +0200 Subject: [PATCH 5/5] Update api.rst --- docs/api.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 0496a9a2e..b650da0e5 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4198,7 +4198,7 @@ of :class:`enum.Enum`. .. attribute:: gradient - A two colour gradient is used, using both colors provided. + There is a two colour gradient using both colors provided. .. attribute:: neon @@ -4210,7 +4210,7 @@ of :class:`enum.Enum`. .. attribute:: pop - A coloured drop-down shadow is shown. + A coloured dropshadow is shown. .. _discord-api-audit-logs: