@@ -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