Skip to content

Commit 0c9677a

Browse files
committed
refactor: parsing logic
1 parent 3d1070a commit 0c9677a

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

discord/state.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,47 +1329,49 @@ def parse_guild_member_remove(self, data) -> None:
13291329

13301330
def parse_guild_member_update(self, data: MemberUpdateEvent) -> None:
13311331
guild = self._get_guild(int(data["guild_id"]))
1332-
user = data["user"]
1333-
user_id = int(user["id"])
13341332
if guild is None:
13351333
_log.debug(
13361334
"GUILD_MEMBER_UPDATE referencing an unknown guild ID: %s. Discarding.",
13371335
data["guild_id"],
13381336
)
13391337
return
13401338

1341-
if not self.member_cache_flags.joined:
1342-
old_member = guild._members.pop(user_id, None)
1343-
else:
1344-
old_member = guild.get_member(user_id)
1339+
user = data["user"]
1340+
user_id = int(user["id"])
13451341

1346-
old_member = Member._copy(old_member) if old_member is not None else None
1342+
# Try to get the old member from cache
1343+
old_member: Member | None = guild.get_member(user_id)
1344+
old_member_copy: Member | None = (
1345+
Member._copy(old_member) if old_member is not None else None
1346+
)
13471347

1348+
# Always create or update the member object
13481349
if old_member is not None:
1350+
old_member._update(data)
13491351
new_member = old_member
1350-
new_member._update(data)
1352+
else:
1353+
new_member = Member(guild=guild, data=data, state=self) # type: ignore
13511354

1352-
# handle user_update if necessary
1353-
user_update = old_member._update_inner_user(user)
1354-
if user_update:
1355-
self.dispatch("user_update", user_update[0], user_update[1])
1355+
raw = RawMemberUpdateEvent(data, new_member)
1356+
raw.cached_member = old_member_copy
1357+
self.dispatch("raw_member_update", raw)
13561358

1357-
self.dispatch("member_update", old_member, new_member)
1359+
# Update the user cache if needed
1360+
user_update = None
1361+
if old_member_copy is not None:
1362+
user_update = old_member_copy._update_inner_user(user)
13581363
else:
1359-
new_member = Member(guild=guild, data=data, state=self) # type: ignore
1364+
user_update = new_member._update_inner_user(user)
13601365

1361-
if self.member_cache_flags.joined:
1362-
# Force an update on the inner user if necessary
1363-
user_update = new_member._update_inner_user(user)
1364-
if user_update:
1365-
self.dispatch("user_update", user_update[0], user_update[1])
1366+
if user_update:
1367+
self.dispatch("user_update", user_update[0], user_update[1])
13661368

1369+
if old_member_copy is not None:
1370+
self.dispatch("member_update", old_member_copy, new_member)
1371+
else:
1372+
if self.member_cache_flags.joined:
13671373
guild._add_member(new_member)
13681374

1369-
raw = RawMemberUpdateEvent(data, new_member)
1370-
raw.cached_member = old_member
1371-
self.dispatch("raw_member_update", raw)
1372-
13731375
def parse_guild_emojis_update(self, data) -> None:
13741376
guild = self._get_guild(int(data["guild_id"]))
13751377
if guild is None:

0 commit comments

Comments
 (0)