diff --git a/discord/enums.py b/discord/enums.py index 28b99ab03..04ead90ae 100644 --- a/discord/enums.py +++ b/discord/enums.py @@ -85,6 +85,8 @@ __all__ = ( 'MediaItemLoadingState', 'CollectibleType', 'NameplatePalette', + 'NameFont', + 'NameEffect', ) @@ -988,6 +990,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/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 diff --git a/discord/types/user.py b/discord/types/user.py index 639384a56..d1c218f4e 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, 12] +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] + + 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..caf4a070a 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,15 +51,39 @@ if TYPE_CHECKING: AvatarDecorationData, PrimaryGuild as PrimaryGuildPayload, UserCollectibles as UserCollectiblesPayload, + DisplayNameStyle as DisplayNameStylePayload, ) __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']) + 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 +105,7 @@ class BaseUser(_UserTag): '_avatar_decoration_data', '_primary_guild', '_collectibles', + '_display_name_style', ) if TYPE_CHECKING: @@ -98,6 +123,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 +163,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 +182,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 +368,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. diff --git a/docs/api.rst b/docs/api.rst index 1a564ddca..b650da0e5 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 + + There is a two colour gradient 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 dropshadow is shown. + .. _discord-api-audit-logs: Audit Log Data @@ -5836,6 +5916,14 @@ Collectible .. autoclass:: Collectible() :members: +DisplayNameStyle +~~~~~~~~~~~~~~~~~ + +.. attributetable:: DisplayNameStyle + +.. autoclass:: DisplayNameStyle() + :members: + CallMessage ~~~~~~~~~~~~~~~~~~~