diff --git a/interactions/api/cache.py b/interactions/api/cache.py index bf9e7ba17..d78d8eedf 100644 --- a/interactions/api/cache.py +++ b/interactions/api/cache.py @@ -67,11 +67,12 @@ def merge(self, item: _T, id: Optional["Key"] = None) -> None: ): # could be None setattr(old_item, attrib, []) if isinstance(getattr(old_item, attrib), list): - for value in getattr(item, attrib): - old_item_attrib = getattr(old_item, attrib) - if value not in getattr(old_item, attrib): - old_item_attrib.append(value) - setattr(old_item, attrib, old_item_attrib) + if _attrib := getattr(item, attrib): + for value in _attrib: + old_item_attrib = getattr(old_item, attrib) + if value not in old_item_attrib: + old_item_attrib.append(value) + setattr(old_item, attrib, old_item_attrib) else: setattr(old_item, attrib, getattr(item, attrib)) diff --git a/interactions/api/gateway/client.py b/interactions/api/gateway/client.py index 56ecfad25..fe6926dee 100644 --- a/interactions/api/gateway/client.py +++ b/interactions/api/gateway/client.py @@ -392,37 +392,44 @@ def _dispatch_event(self, event: str, data: dict) -> None: elif event != "TYPING_START": name: str = event.lower() try: + _event_path: list = [section.capitalize() for section in name.split("_")] _name: str = _event_path[0] if len(_event_path) < 3 else "".join(_event_path[:-1]) model = getattr(__import__(path), _name) data["_client"] = self._http obj = model(**data) - _cache: "Storage" = self._http.cache[model] - if isinstance(obj, Member): - id = (Snowflake(data["guild_id"]), obj.id) - else: - id = getattr(obj, "id", None) - - if "_create" in name or "_add" in name: - _cache.merge(obj, id) - if ( + def __modify_guild_cache(): + if not ( guild_id := data.get("guild_id") and not isinstance(obj, Guild) and "message" not in name ): - guild = self._http.cache[Guild].get(Snowflake(guild_id)) + return + if guild := self._http.cache[Guild].get(Snowflake(guild_id)): model_name = model.__name__.lower() + if "guild" in model_name: + model_name = model_name[5:] _obj = getattr(guild, f"{model_name}s", None) - if _obj is not None: - if isinstance(_obj, list): - _obj.append(obj) - setattr(guild, f"{model_name}s", _obj) - else: - _obj = [obj] + if _obj is not None and isinstance(_obj, list): + for __obj in _obj: + if __obj.id == obj.id: + _obj.remove(__obj) + break setattr(guild, f"{model_name}s", _obj) self._http.cache[Guild].add(guild) + + _cache: "Storage" = self._http.cache[model] + + if isinstance(obj, Member): + id = (Snowflake(data["guild_id"]), obj.id) + else: + id = getattr(obj, "id", None) + + if "_create" in name or "_add" in name: + _cache.merge(obj, id) + __modify_guild_cache() self._dispatch.dispatch(f"on_{name}", obj) elif "_update" in name and hasattr(obj, "id"): @@ -440,28 +447,7 @@ def _dispatch_event(self, event: str, data: dict) -> None: old_obj = obj _cache.add(old_obj, id) - - if ( - guild_id := data.get("guild_id") - and not isinstance(obj, Guild) - and "message" not in name - ): - guild = self._http.cache[Guild].get(Snowflake(guild_id)) - model_name = model.__name__.lower() - _obj = getattr(guild, f"{model_name}s", None) - if _obj is not None: - if isinstance(_obj, list): - for __obj in _obj: - if __obj.id == obj.id: - _obj.remove(__obj) - break - _obj.append(obj) - setattr(guild, f"{model_name}s", _obj) - else: - _obj = [obj] - setattr(guild, f"{model_name}s", _obj) - self._http.cache[Guild].add(guild) - + __modify_guild_cache() self._dispatch.dispatch( f"on_{name}", before, old_obj ) # give previously stored and new one @@ -469,24 +455,7 @@ def _dispatch_event(self, event: str, data: dict) -> None: elif "_remove" in name or "_delete" in name: self._dispatch.dispatch(f"on_raw_{name}", obj) - - if ( - guild_id := data.get("guild_id") - and not isinstance(obj, Guild) - and "message" not in name - ): - guild = self._http.cache[Guild].get(Snowflake(guild_id)) - model_name = model.__name__.lower() - _obj = getattr(guild, f"{model_name}s", None) - if _obj is not None: - if isinstance(_obj, list): - for __obj in _obj: - if __obj.id == obj.id: - _obj.remove(__obj) - break - setattr(guild, f"{model_name}s", _obj) - self._http.cache[Guild].add(guild) - + __modify_guild_cache() old_obj = _cache.pop(id) self._dispatch.dispatch(f"on_{name}", old_obj)