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 1/6] 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: From 90898ba42919ebc6ae811652573cef3f06743285 Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Sun, 18 May 2025 16:38:30 -0700 Subject: [PATCH 2/6] fixed a bug and probably added 3 more at the same time --- discord/clantag.py | 8 ++++---- discord/user.py | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/discord/clantag.py b/discord/clantag.py index e8805f3c3..be7e67a27 100644 --- a/discord/clantag.py +++ b/discord/clantag.py @@ -38,10 +38,10 @@ 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"] + self.identity_guild_id: int = int(data.get("identity_guild_id", 0)) + self.identity_enabled: bool = data.get("identity_enabled", False) + self.tag: str = data.get("tag", "null") + self.badge: str = data.get("badge", "null") def __repr__(self) -> str: return f"" \ No newline at end of file diff --git a/discord/user.py b/discord/user.py index d3352ecf0..0affceddf 100644 --- a/discord/user.py +++ b/discord/user.py @@ -129,7 +129,8 @@ class BaseUser(_UserTag): 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 + if clan_data: + self.clan_tag: Optional[ClanTag] = ClanTag(clan_data) @classmethod From b7a82873a009d89988e4fef5a7dc3fb04bf4458a Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Sun, 18 May 2025 16:44:26 -0700 Subject: [PATCH 3/6] the previous commit message is true. --- discord/clantag.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/discord/clantag.py b/discord/clantag.py index be7e67a27..046a30e12 100644 --- a/discord/clantag.py +++ b/discord/clantag.py @@ -23,7 +23,7 @@ DEALINGS IN THE SOFTWARE. """ from __future__ import annotations -from typing import TypedDict +from typing import TypedDict, Optional from .types.snowflake import Snowflake @@ -38,10 +38,10 @@ class ClanTag: __slots__ = ("identity_guild_id", "identity_enabled", "tag", "badge") def __init__(self, data: ClanTagPayload): - self.identity_guild_id: int = int(data.get("identity_guild_id", 0)) + 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: str = data.get("tag", "null") - self.badge: str = data.get("badge", "null") + 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 From 5778ad7d1bcac707221e0523d34aca83ec1c2781 Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Sun, 18 May 2025 17:05:56 -0700 Subject: [PATCH 4/6] moved clan and primary_guild from PartialUser to User --- 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 9671c9509..291c50a54 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -40,8 +40,6 @@ 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] @@ -57,3 +55,5 @@ class User(PartialUser, total=False): flags: int premium_type: PremiumType public_flags: int + clan: NotRequired[ClanTagPayload] + primary_guild: NotRequired[ClanTagPayload] From f3183b1e3c6d1b13f7fa7e3c93b4b9aaa20a0b44 Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Sun, 18 May 2025 18:01:41 -0700 Subject: [PATCH 5/6] is this why its broken? lets find out! --- 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 291c50a54..9671c9509 100644 --- a/discord/types/user.py +++ b/discord/types/user.py @@ -40,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] @@ -55,5 +57,3 @@ class User(PartialUser, total=False): flags: int premium_type: PremiumType public_flags: int - clan: NotRequired[ClanTagPayload] - primary_guild: NotRequired[ClanTagPayload] From 2dd33ce1e8ec4e3e42110ddbd416baff0b31c521 Mon Sep 17 00:00:00 2001 From: ! Sleepy <109904491+eepyfemboi@users.noreply.github.com> Date: Mon, 19 May 2025 18:17:06 -0700 Subject: [PATCH 6/6] Update discord/user.py Co-authored-by: DA344 <108473820+DA-344@users.noreply.github.com> --- discord/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/user.py b/discord/user.py index 0affceddf..4c1ca6257 100644 --- a/discord/user.py +++ b/discord/user.py @@ -128,7 +128,7 @@ class BaseUser(_UserTag): 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") + clan_data = data.get("primary_guild") if clan_data: self.clan_tag: Optional[ClanTag] = ClanTag(clan_data)