diff --git a/discord/clantag.py b/discord/clantag.py new file mode 100644 index 000000000..046a30e12 --- /dev/null +++ b/discord/clantag.py @@ -0,0 +1,47 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-present Rapptz + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations +from typing import TypedDict, Optional +from .types.snowflake import Snowflake + + +class ClanTagPayload(TypedDict): + identity_guild_id: Snowflake + identity_enabled: bool + tag: str + badge: str + + +class ClanTag: + __slots__ = ("identity_guild_id", "identity_enabled", "tag", "badge") + + def __init__(self, data: ClanTagPayload): + self.identity_guild_id: Optional[int] = (int(data["identity_guild_id"]) if data.get("identity_guild_id") is not None else None) + self.identity_enabled: bool = data.get("identity_enabled", False) + self.tag: Optional[str] = data.get("tag", "null") + self.badge: Optional[str] = data.get("badge", "null") + + def __repr__(self) -> str: + return f"" \ No newline at end of file diff --git a/discord/types/user.py b/discord/types/user.py index 1f027ce9d..9671c9509 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -25,6 +25,7 @@ DEALINGS IN THE SOFTWARE. from .snowflake import Snowflake from typing import Literal, Optional, TypedDict from typing_extensions import NotRequired +from ..clantag import ClanTagPayload class AvatarDecorationData(TypedDict): @@ -39,6 +40,8 @@ class PartialUser(TypedDict): avatar: Optional[str] global_name: Optional[str] avatar_decoration_data: NotRequired[AvatarDecorationData] + clan: NotRequired[ClanTagPayload] + primary_guild: NotRequired[ClanTagPayload] PremiumType = Literal[0, 1, 2, 3] diff --git a/discord/user.py b/discord/user.py index c5391372a..4c1ca6257 100644 --- a/discord/user.py +++ b/discord/user.py @@ -32,6 +32,8 @@ from .colour import Colour from .enums import DefaultAvatar from .flags import PublicUserFlags from .utils import snowflake_time, _bytes_to_base64_data, MISSING, _get_as_snowflake +from .clantag import ClanTag + if TYPE_CHECKING: from typing_extensions import Self @@ -71,6 +73,7 @@ class BaseUser(_UserTag): '_public_flags', '_state', '_avatar_decoration_data', + 'clan_tag', ) if TYPE_CHECKING: @@ -86,6 +89,7 @@ class BaseUser(_UserTag): _accent_colour: Optional[int] _public_flags: int _avatar_decoration_data: Optional[AvatarDecorationData] + clan_tag: Optional[ClanTag] def __init__(self, *, state: ConnectionState, data: Union[UserPayload, PartialUserPayload]) -> None: self._state = state @@ -123,6 +127,11 @@ class BaseUser(_UserTag): self.bot = data.get('bot', False) self.system = data.get('system', False) self._avatar_decoration_data = data.get('avatar_decoration_data') + + clan_data = data.get("primary_guild") + if clan_data: + self.clan_tag: Optional[ClanTag] = ClanTag(clan_data) + @classmethod def _copy(cls, user: Self) -> Self: