From d1aba765e648ef81fe1f4c8c08b4d90b94144c2b Mon Sep 17 00:00:00 2001 From: EdVraz <88881326+EdVraz@users.noreply.github.com> Date: Fri, 15 Jul 2022 20:40:18 +0200 Subject: [PATCH 1/4] fix: Fix more issues with guild objects when caching a gw event --- interactions/api/gateway/client.py | 76 ++++++++++++++++-------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/interactions/api/gateway/client.py b/interactions/api/gateway/client.py index 56ecfad25..c931feea7 100644 --- a/interactions/api/gateway/client.py +++ b/interactions/api/gateway/client.py @@ -412,17 +412,19 @@ def _dispatch_event(self, event: str, data: dict) -> None: 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): - _obj.append(obj) + 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] setattr(guild, f"{model_name}s", _obj) - else: - _obj = [obj] - setattr(guild, f"{model_name}s", _obj) - self._http.cache[Guild].add(guild) + self._http.cache[Guild].merge(guild) self._dispatch.dispatch(f"on_{name}", obj) elif "_update" in name and hasattr(obj, "id"): @@ -446,21 +448,23 @@ def _dispatch_event(self, event: str, data: dict) -> None: 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) + 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): + 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) - else: - _obj = [obj] - setattr(guild, f"{model_name}s", _obj) - self._http.cache[Guild].add(guild) + self._http.cache[Guild].add(guild) self._dispatch.dispatch( f"on_{name}", before, old_obj @@ -475,17 +479,19 @@ def _dispatch_event(self, event: str, data: dict) -> None: 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) + 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): + 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) old_obj = _cache.pop(id) self._dispatch.dispatch(f"on_{name}", old_obj) From cad9e902f7aac9c1820253a37a79f3958fc96eff Mon Sep 17 00:00:00 2001 From: EdVraz <88881326+EdVraz@users.noreply.github.com> Date: Fri, 15 Jul 2022 20:55:06 +0200 Subject: [PATCH 2/4] refactor: move code into function --- interactions/api/gateway/client.py | 86 +++++++++--------------------- 1 file changed, 24 insertions(+), 62 deletions(-) diff --git a/interactions/api/gateway/client.py b/interactions/api/gateway/client.py index c931feea7..2b60f0b7e 100644 --- a/interactions/api/gateway/client.py +++ b/interactions/api/gateway/client.py @@ -392,6 +392,27 @@ def _dispatch_event(self, event: str, data: dict) -> None: elif event != "TYPING_START": name: str = event.lower() try: + + def __modify_guild_cache(): + if not ( + guild_id := data.get("guild_id") + and not isinstance(obj, Guild) + and "message" not in name + ): + 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 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) + _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) @@ -407,24 +428,7 @@ def _dispatch_event(self, event: str, data: dict) -> None: if "_create" in name or "_add" in name: _cache.merge(obj, id) - if ( - guild_id := data.get("guild_id") - and not isinstance(obj, Guild) - and "message" not in name - ): - 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] - setattr(guild, f"{model_name}s", _obj) - self._http.cache[Guild].merge(guild) + __modify_guild_cache() self._dispatch.dispatch(f"on_{name}", obj) elif "_update" in name and hasattr(obj, "id"): @@ -442,30 +446,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 - ): - 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): - 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 @@ -473,26 +454,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 - ): - 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): - 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) From 4c8f05d6d923de542f05a7da4849c342b2811aab Mon Sep 17 00:00:00 2001 From: EdVraz <88881326+EdVraz@users.noreply.github.com> Date: Sat, 16 Jul 2022 18:24:38 +0200 Subject: [PATCH 3/4] refactor: move function --- interactions/api/gateway/client.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/interactions/api/gateway/client.py b/interactions/api/gateway/client.py index 2b60f0b7e..fe6926dee 100644 --- a/interactions/api/gateway/client.py +++ b/interactions/api/gateway/client.py @@ -393,6 +393,13 @@ def _dispatch_event(self, event: str, data: dict) -> None: 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) + def __modify_guild_cache(): if not ( guild_id := data.get("guild_id") @@ -413,12 +420,6 @@ def __modify_guild_cache(): setattr(guild, f"{model_name}s", _obj) self._http.cache[Guild].add(guild) - _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): From bdd3a3dfe145ebe527338e6f4f8332acb2032ec9 Mon Sep 17 00:00:00 2001 From: EdVraz <88881326+EdVraz@users.noreply.github.com> Date: Sat, 16 Jul 2022 18:31:29 +0200 Subject: [PATCH 4/4] fix: fix NoneType iteration --- interactions/api/cache.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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))