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.