|
85 | 85 | from .types.channel import DMChannel as DMChannelPayload |
86 | 86 | from .types.emoji import Emoji as EmojiPayload |
87 | 87 | from .types.guild import Guild as GuildPayload |
| 88 | + from .types.member import MemberUpdateEvent |
88 | 89 | from .types.message import Message as MessagePayload |
89 | 90 | from .types.poll import Poll as PollPayload |
90 | 91 | from .types.sticker import GuildSticker as GuildStickerPayload |
@@ -918,7 +919,11 @@ def parse_message_poll_vote_add(self, data) -> None: |
918 | 919 | counts[answer.id].count += 1 |
919 | 920 | else: |
920 | 921 | counts[answer.id] = PollAnswerCount( |
921 | | - {"id": answer.id, "count": 1, "me_voted": False} |
| 922 | + { |
| 923 | + "id": answer.id, |
| 924 | + "count": 1, |
| 925 | + "me_voted": False, |
| 926 | + } |
922 | 927 | ) |
923 | 928 | if poll is not None and user is not None: |
924 | 929 | answer = poll.get_answer(raw.answer_id) |
@@ -1329,40 +1334,50 @@ def parse_guild_member_remove(self, data) -> None: |
1329 | 1334 | ) |
1330 | 1335 | self.dispatch("raw_member_remove", raw) |
1331 | 1336 |
|
1332 | | - def parse_guild_member_update(self, data) -> None: |
| 1337 | + def parse_guild_member_update(self, data: MemberUpdateEvent) -> None: |
1333 | 1338 | guild = self._get_guild(int(data["guild_id"])) |
1334 | | - user = data["user"] |
1335 | | - user_id = int(user["id"]) |
1336 | 1339 | if guild is None: |
1337 | 1340 | _log.debug( |
1338 | 1341 | "GUILD_MEMBER_UPDATE referencing an unknown guild ID: %s. Discarding.", |
1339 | 1342 | data["guild_id"], |
1340 | 1343 | ) |
1341 | 1344 | return |
1342 | 1345 |
|
1343 | | - member = guild.get_member(user_id) |
1344 | | - if member is not None: |
1345 | | - old_member = Member._copy(member) |
1346 | | - member._update(data) |
1347 | | - user_update = member._update_inner_user(user) |
1348 | | - if user_update: |
1349 | | - self.dispatch("user_update", user_update[0], user_update[1]) |
| 1346 | + user = data["user"] |
| 1347 | + user_id = int(user["id"]) |
| 1348 | + |
| 1349 | + # Try to get the old member from cache |
| 1350 | + old_member: Member | None = guild.get_member(user_id) |
| 1351 | + old_member_copy: Member | None = ( |
| 1352 | + Member._copy(old_member) if old_member is not None else None |
| 1353 | + ) |
1350 | 1354 |
|
1351 | | - self.dispatch("member_update", old_member, member) |
| 1355 | + # Always create or update the member object |
| 1356 | + if old_member is not None: |
| 1357 | + old_member._update(data) |
| 1358 | + new_member: Member = old_member |
1352 | 1359 | else: |
1353 | | - if self.member_cache_flags.joined: |
1354 | | - member = Member(data=data, guild=guild, state=self) |
| 1360 | + new_member = Member(guild=guild, data=data, state=self) # type: ignore |
1355 | 1361 |
|
1356 | | - # Force an update on the inner user if necessary |
1357 | | - user_update = member._update_inner_user(user) |
1358 | | - if user_update: |
1359 | | - self.dispatch("user_update", user_update[0], user_update[1]) |
| 1362 | + raw = RawMemberUpdateEvent(data, new_member) |
| 1363 | + raw.cached_member = old_member_copy |
| 1364 | + self.dispatch("raw_member_update", raw) |
1360 | 1365 |
|
1361 | | - guild._add_member(member) |
1362 | | - _log.debug( |
1363 | | - "GUILD_MEMBER_UPDATE referencing an unknown member ID: %s. Discarding.", |
1364 | | - user_id, |
1365 | | - ) |
| 1366 | + # Update the user cache if needed |
| 1367 | + user_update = None |
| 1368 | + if old_member_copy is not None: |
| 1369 | + user_update = old_member_copy._update_inner_user(user) |
| 1370 | + else: |
| 1371 | + user_update = new_member._update_inner_user(user) |
| 1372 | + |
| 1373 | + if user_update: |
| 1374 | + self.dispatch("user_update", user_update[0], user_update[1]) |
| 1375 | + |
| 1376 | + if old_member_copy is not None: |
| 1377 | + self.dispatch("member_update", old_member_copy, new_member) |
| 1378 | + else: |
| 1379 | + if self.member_cache_flags.joined: |
| 1380 | + guild._add_member(new_member) |
1366 | 1381 |
|
1367 | 1382 | def parse_guild_emojis_update(self, data) -> None: |
1368 | 1383 | guild = self._get_guild(int(data["guild_id"])) |
|
0 commit comments