@@ -402,37 +402,76 @@ def _dispatch_event(self, event: str, data: dict) -> None:
402
402
data ["_client" ] = self ._http
403
403
obj = model (** data )
404
404
405
+ _cache : "Storage" = self ._http .cache [model ]
406
+
407
+ if isinstance (obj , Member ):
408
+ id = (Snowflake (data ["guild_id" ]), obj .id )
409
+ else :
410
+ id = getattr (obj , "id" , None )
411
+
412
+ if id is None :
413
+ if model .__name__ .startswith ("Guild" ):
414
+ if model .__name__ == "GuildScheduledEventUser" :
415
+ id = model .guild_scheduled_event_id
416
+ elif model .__name__ in [
417
+ "Invite" ,
418
+ "GuildBan" ,
419
+ "ChannelPins" ,
420
+ "MessageReaction" ,
421
+ "ReactionRemove" ,
422
+ # Extend this for everything that should not be cached
423
+ ]:
424
+ id = None
425
+ else :
426
+ model_name = model .__name__ [5 :]
427
+ if _data := getattr (obj , model_name , None ):
428
+ id = (
429
+ getattr (_data , "id" )
430
+ if not isinstance (_data , dict )
431
+ else Snowflake (_data ["id" ])
432
+ )
433
+ elif hasattr (obj , f"{ model_name } _id" ):
434
+ id = getattr (obj , f"{ model_name } _id" )
435
+ else :
436
+ id = None
437
+
405
438
def __modify_guild_cache ():
406
439
if not (
407
440
(guild_id := data .get ("guild_id" ))
408
441
and not isinstance (obj , Guild )
409
442
and "message" not in name
443
+ and id is not None
410
444
):
411
445
return
412
446
if guild := self ._http .cache [Guild ].get (Snowflake (guild_id )):
413
- model_name = model .__name__ . lower ()
447
+ model_name : str = model .__name__
414
448
if "guild" in model_name :
415
449
model_name = model_name [5 :]
416
- _obj = getattr (guild , f"{ model_name } s" , None )
450
+ elif model_name == "threadmembers" :
451
+ return
452
+ _obj = getattr (guild , f"{ model_name .lower ()} s" , None )
417
453
if _obj is not None and isinstance (_obj , list ):
418
- for __obj in _obj :
419
- if __obj .id == obj .id :
420
- _obj .remove (__obj )
454
+ _data = getattr (obj , model_name , None )
455
+
456
+ if "_create" in name or "_add" in name :
457
+ _obj .append (obj )
458
+
459
+ for index , __obj in enumerate (_obj ):
460
+ if __obj .id == id :
461
+ if "_remove" in name or "_delete" in name :
462
+ _obj .remove (__obj )
463
+
464
+ elif "_update" in name and hasattr (obj , "id" ):
465
+ _obj [index ] = _data
421
466
break
422
467
setattr (guild , f"{ model_name } s" , _obj )
423
468
self ._http .cache [Guild ].add (guild )
424
469
425
- _cache : "Storage" = self ._http .cache [model ]
426
-
427
- if isinstance (obj , Member ):
428
- id = (Snowflake (data ["guild_id" ]), obj .id )
429
- else :
430
- id = getattr (obj , "id" , None )
431
-
432
470
if "_create" in name or "_add" in name :
433
- _cache . merge ( obj , id )
434
- __modify_guild_cache ( )
471
+ if id :
472
+ _cache . merge ( obj , id )
435
473
self ._dispatch .dispatch (f"on_{ name } " , obj )
474
+ __modify_guild_cache ()
436
475
437
476
elif "_update" in name and hasattr (obj , "id" ):
438
477
old_obj = self ._http .cache [model ].get (id )
@@ -448,12 +487,13 @@ def __modify_guild_cache():
448
487
449
488
before = model (** old_obj ._json )
450
489
old_obj .update (** obj ._json )
490
+
491
+ _cache .add (old_obj , id )
451
492
else :
452
493
before = None
453
494
old_obj = obj
454
-
455
- _cache .add (old_obj , id )
456
495
__modify_guild_cache ()
496
+
457
497
self ._dispatch .dispatch (
458
498
f"on_{ name } " , before , old_obj
459
499
) # give previously stored and new one
@@ -462,8 +502,9 @@ def __modify_guild_cache():
462
502
elif "_remove" in name or "_delete" in name :
463
503
self ._dispatch .dispatch (f"on_raw_{ name } " , obj )
464
504
__modify_guild_cache ()
465
- old_obj = _cache .pop (id )
466
- self ._dispatch .dispatch (f"on_{ name } " , old_obj )
505
+ if id :
506
+ old_obj = _cache .pop (id )
507
+ self ._dispatch .dispatch (f"on_{ name } " , old_obj )
467
508
468
509
else :
469
510
self ._dispatch .dispatch (f"on_{ name } " , obj )
0 commit comments