From ced06645326695a66bfed1876f571eef0f466547 Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Sun, 18 May 2025 16:28:10 -0700 Subject: [PATCH] added support for clan tags (hopefully) --- discord/clantag.py | 47 +++++++++++++++++++++++++++++++++++++++++++ discord/types/user.py | 3 +++ discord/user.py | 8 ++++++++ 3 files changed, 58 insertions(+) create mode 100644 discord/clantag.py diff --git a/discord/clantag.py b/discord/clantag.py new file mode 100644 index 000000000..e8805f3c3 --- /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 +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: int = int(data["identity_guild_id"]) + self.identity_enabled: bool = data["identity_enabled"] + self.tag: str = data["tag"] + self.badge: str = data["badge"] + + 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..d3352ecf0 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,10 @@ 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("clan") or data.get("primary_guild") + self.clan_tag: Optional[ClanTag] = ClanTag(clan_data) if clan_data else None + @classmethod def _copy(cls, user: Self) -> Self: