Skip to content

Commit 368ee5b

Browse files
authored
fix(gateway): fix missing user_update event for new attributes, missing attributes in member_update event (#1350)
1 parent 9817b6c commit 368ee5b

File tree

4 files changed

+36
-41
lines changed

4 files changed

+36
-41
lines changed

changelog/1350.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix missing :attr:`~Member.avatar_decoration` on the old :class:`Member` in :func:`on_member_update` events.

disnake/member.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ class Member(disnake.abc.Messageable, _UserTag):
298298
banner: Optional[Asset]
299299
accent_color: Optional[Colour]
300300
accent_colour: Optional[Colour]
301+
avatar_decoration: Optional[Asset]
301302
collectibles: Collectibles
302303
primary_guild: Optional[PrimaryGuild]
303304

@@ -421,6 +422,7 @@ def _copy(cls, member: Member) -> Self:
421422
self._banner = member._banner
422423
self._communication_disabled_until = member.current_timeout
423424
self._flags = member._flags
425+
self._avatar_decoration_data = member._avatar_decoration_data
424426

425427
# Reference will not be copied unless necessary by PRESENCE_UPDATE
426428
# See below
@@ -471,32 +473,35 @@ def _update_inner_user(self, user: UserPayload) -> Optional[Tuple[User, User]]:
471473
u = self._user
472474
original = (
473475
u.name,
474-
u._avatar,
475476
u.discriminator,
476477
u.global_name,
477-
u._public_flags,
478+
u._avatar,
478479
u._avatar_decoration_data,
480+
u._public_flags,
481+
u._collectibles,
479482
u._primary_guild,
480483
)
481484
# These keys seem to always be available
482485
modified = (
483486
user["username"],
484-
user["avatar"],
485487
user["discriminator"],
486488
user.get("global_name"),
489+
user["avatar"],
490+
user.get("avatar_decoration_data"),
487491
user.get("public_flags", 0),
488-
user.get("avatar_decoration_data", None),
492+
user.get("collectibles"),
489493
user.get("primary_guild"),
490494
)
491495
if original != modified:
492496
to_return = User._copy(self._user)
493497
(
494498
u.name,
495-
u._avatar,
496499
u.discriminator,
497500
u.global_name,
498-
u._public_flags,
501+
u._avatar,
499502
u._avatar_decoration_data,
503+
u._public_flags,
504+
u._collectibles,
500505
u._primary_guild,
501506
) = modified
502507
# Signal to dispatch on_user_update

disnake/types/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class PartialUser(TypedDict):
5353
discriminator: str # may be removed in future API versions
5454
global_name: NotRequired[Optional[str]]
5555
avatar: Optional[str]
56+
avatar_decoration_data: NotRequired[Optional[AvatarDecorationData]]
5657
collectibles: NotRequired[Optional[Collectibles]]
5758
primary_guild: NotRequired[Optional[UserPrimaryGuild]]
5859

@@ -72,4 +73,3 @@ class User(PartialUser, total=False):
7273
flags: int
7374
premium_type: PremiumType
7475
public_flags: int
75-
avatar_decoration_data: Optional[AvatarDecorationData]

disnake/user.py

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -58,33 +58,17 @@ class BaseUser(_UserTag):
5858
"_avatar",
5959
"_banner",
6060
"_avatar_decoration_data",
61-
"_collectibles",
6261
"_accent_colour",
6362
"_public_flags",
64-
"_state",
63+
"_collectibles",
6564
"_primary_guild",
65+
"_state",
6666
)
6767

68-
if TYPE_CHECKING:
69-
name: str
70-
id: int
71-
discriminator: str
72-
global_name: Optional[str]
73-
bot: bool
74-
system: bool
75-
_state: ConnectionState
76-
_avatar: Optional[str]
77-
_banner: Optional[str]
78-
_avatar_decoration_data: Optional[AvatarDecorationDataPayload]
79-
_collectibles: Optional[CollectiblesPayload]
80-
_accent_colour: Optional[int]
81-
_public_flags: int
82-
_primary_guild: Optional[UserPrimaryGuildPayload]
83-
8468
def __init__(
8569
self, *, state: ConnectionState, data: Union[UserPayload, PartialUserPayload]
8670
) -> None:
87-
self._state = state
71+
self._state: ConnectionState = state
8872
self._update(data)
8973

9074
def __repr__(self) -> str:
@@ -110,24 +94,27 @@ def __hash__(self) -> int:
11094
return self.id >> 22
11195

11296
def _update(self, data: Union[UserPayload, PartialUserPayload]) -> None:
113-
self.name = data["username"]
114-
self.id = int(data["id"])
115-
self.discriminator = data["discriminator"]
116-
self.global_name = data.get("global_name")
117-
self._avatar = data["avatar"]
118-
self._banner = data.get("banner", None)
119-
self._avatar_decoration_data = data.get("avatar_decoration_data", None)
120-
self._collectibles = data.get("collectibles")
121-
self._accent_colour = data.get("accent_color", None)
122-
self._public_flags = data.get("public_flags", 0)
123-
self.bot = data.get("bot", False)
124-
self.system = data.get("system", False)
125-
self._primary_guild = data.get("primary_guild")
97+
self.name: str = data["username"]
98+
self.id: int = int(data["id"])
99+
self.discriminator: str = data["discriminator"]
100+
self.global_name: Optional[str] = data.get("global_name")
101+
self._avatar: Optional[str] = data["avatar"]
102+
self._banner: Optional[str] = data.get("banner")
103+
self._avatar_decoration_data: Optional[AvatarDecorationDataPayload] = data.get(
104+
"avatar_decoration_data"
105+
)
106+
self._accent_colour: Optional[int] = data.get("accent_color")
107+
self._public_flags: int = data.get("public_flags", 0)
108+
self._collectibles: Optional[CollectiblesPayload] = data.get("collectibles")
109+
self._primary_guild: Optional[UserPrimaryGuildPayload] = data.get("primary_guild")
110+
self.bot: bool = data.get("bot", False)
111+
self.system: bool = data.get("system", False)
126112

127113
@classmethod
128114
def _copy(cls, user: BaseUser) -> Self:
129115
self = cls.__new__(cls) # bypass __init__
130116

117+
self._state = user._state
131118
self.name = user.name
132119
self.id = user.id
133120
self.discriminator = user.discriminator
@@ -136,9 +123,11 @@ def _copy(cls, user: BaseUser) -> Self:
136123
self._banner = user._banner
137124
self._avatar_decoration_data = user._avatar_decoration_data
138125
self._accent_colour = user._accent_colour
139-
self.bot = user.bot
140-
self._state = user._state
141126
self._public_flags = user._public_flags
127+
self._collectibles = user._collectibles
128+
self._primary_guild = user._primary_guild
129+
self.bot = user.bot
130+
self.system = user.system
142131

143132
return self
144133

0 commit comments

Comments
 (0)