Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions interactions/api/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
81 changes: 25 additions & 56 deletions interactions/api/gateway/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"):
Expand All @@ -440,53 +447,15 @@ 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
return

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)

Expand Down