Skip to content

Commit 0265ff7

Browse files
fix: attempt to fix several issues related to the new cache (#921)
* fix: Fix order in `getattr` calls of get * fix: Attempt to fix issue with item assignment * fix: Attempt to fix issues cache * ci: correct from checks. * fix: Attempt to fix issues cache * fix: Attempt to fix issues cache * fix: Attempt to fix issues cache * fix: Attempt to fix issues cache * fix: Attempt to fix issues cache Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 95a822c commit 0265ff7

File tree

6 files changed

+54
-28
lines changed

6 files changed

+54
-28
lines changed

interactions/api/cache.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,19 @@ def merge(self, item: _T, id: Optional["Key"] = None) -> None:
6161
continue
6262
# we can only assume that discord did not provide it, falsely deleting is worse than not deleting
6363
if getattr(old_item, attrib) != getattr(item, attrib):
64-
if isinstance(item.attrib, list) and not isinstance(
65-
old_item.attrib, list
64+
65+
if isinstance(getattr(item, attrib), list) and not isinstance(
66+
getattr(old_item, attrib), list
6667
): # could be None
67-
old_item.attrib = []
68-
if isinstance(old_item.attrib, list):
69-
for value in item.attrib:
70-
if value not in old_item.attrib:
71-
old_item.attrib.append(value)
68+
setattr(old_item, attrib, [])
69+
if isinstance(getattr(old_item, attrib), list):
70+
for value in getattr(item, attrib):
71+
old_item_attrib = getattr(old_item, attrib)
72+
if value not in getattr(old_item, attrib):
73+
old_item_attrib.append(value)
74+
setattr(old_item, attrib, old_item_attrib)
7275
else:
73-
setattr(old_item, attrib, item.attrib)
76+
setattr(old_item, attrib, getattr(item, attrib))
7477

7578
self.values[_id] = old_item
7679

interactions/api/gateway/client.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,11 @@ def _dispatch_event(self, event: str, data: dict) -> None:
402402

403403
if "_create" in name or "_add" in name:
404404
_cache.merge(obj, id)
405-
if guild_id := data.get("guild_id") and not isinstance(obj, Guild):
405+
if (
406+
guild_id := data.get("guild_id")
407+
and not isinstance(obj, Guild)
408+
and "message" not in name
409+
):
406410
guild = self._http.cache[Guild].get(Snowflake(guild_id))
407411
model_name = model.__name__.lower()
408412
_obj = getattr(guild, f"{model_name}s", None)
@@ -420,6 +424,10 @@ def _dispatch_event(self, event: str, data: dict) -> None:
420424
old_obj = self._http.cache[model].get(id)
421425

422426
if old_obj:
427+
for key, value in old_obj._json.items():
428+
if hasattr(value, "_json"):
429+
old_obj._json[key] = value._json
430+
423431
before = model(**old_obj._json)
424432
old_obj.update(**obj._json)
425433
else:
@@ -428,7 +436,11 @@ def _dispatch_event(self, event: str, data: dict) -> None:
428436

429437
_cache.add(old_obj, id)
430438

431-
if guild_id := data.get("guild_id") and not isinstance(obj, Guild):
439+
if (
440+
guild_id := data.get("guild_id")
441+
and not isinstance(obj, Guild)
442+
and "message" not in name
443+
):
432444
guild = self._http.cache[Guild].get(Snowflake(guild_id))
433445
model_name = model.__name__.lower()
434446
_obj = getattr(guild, f"{model_name}s", None)
@@ -453,7 +465,11 @@ def _dispatch_event(self, event: str, data: dict) -> None:
453465
elif "_remove" in name or "_delete" in name:
454466
self._dispatch.dispatch(f"on_raw_{name}", obj)
455467

456-
if guild_id := data.get("guild_id") and not isinstance(obj, Guild):
468+
if (
469+
guild_id := data.get("guild_id")
470+
and not isinstance(obj, Guild)
471+
and "message" not in name
472+
):
457473
guild = self._http.cache[Guild].get(Snowflake(guild_id))
458474
model_name = model.__name__.lower()
459475
_obj = getattr(guild, f"{model_name}s", None)

interactions/api/http/guild.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,6 @@ async def add_guild_member(
585585
},
586586
)
587587

588-
589588
return request
590589

591590
async def remove_guild_member(

interactions/api/models/channel.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,9 @@ class Channel(ClientSerializerMixin, IDMixin):
168168

169169
def __attrs_post_init__(self): # sourcery skip: last-if-guard
170170
if self._client:
171-
if not self.recipients:
172-
self.recipients = self._client.cache[Channel].get(self.id).recipients
171+
if channel := self._client.cache[Channel].get(self.id):
172+
if not self.recipients:
173+
self.recipients = channel.recipients
173174

174175
def __repr__(self) -> str:
175176
return self.name

interactions/api/models/guild.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -345,18 +345,19 @@ def __attrs_post_init__(self): # sourcery skip: last-if-guard
345345
if self.members:
346346
self._client.cache[Member].update({(self.id, m.id): m for m in self.members})
347347

348-
if not self.channels:
349-
self.channels = self._client.cache[Guild].get(self.id).channels
350-
if not self.threads:
351-
self.threads = self._client.cache[Guild].get(self.id).threads
352-
if not self.roles:
353-
self.roles = self._client.cache[Guild].get(self.id).roles
354-
if not self.members:
355-
self.members = self._client.cache[Guild].get(self.id).members
356-
if not self.member_count:
357-
self.member_count = self._client.cache[Guild].get(self.id).member_count
358-
if not self.presences:
359-
self.presences = self._client.cache[Guild].get(self.id).presences
348+
if guild := self._client.cache[Guild].get(self.id):
349+
if not self.channels:
350+
self.channels = guild.channels
351+
if not self.threads:
352+
self.threads = guild.threads
353+
if not self.roles:
354+
self.roles = guild.roles
355+
if not self.members:
356+
self.members = guild.members
357+
if not self.member_count:
358+
self.member_count = guild.member_count
359+
if not self.presences:
360+
self.presences = guild.presences
360361

361362
def __repr__(self) -> str:
362363
return self.name

interactions/api/models/message.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -842,8 +842,8 @@ class Message(ClientSerializerMixin, IDMixin):
842842
author: User = field(converter=User, add_client=True, default=None)
843843
member: Optional[Member] = field(converter=Member, default=None, add_client=True)
844844
content: str = field(default=None)
845-
timestamp: datetime = field(converter=datetime.fromisoformat, default=None)
846-
edited_timestamp: Optional[datetime] = field(converter=datetime.fromisoformat, default=None)
845+
timestamp: datetime = field(converter=str, default=None)
846+
edited_timestamp: Optional[datetime] = field(converter=str, default=None)
847847
tts: bool = field(default=None)
848848
mention_everyone: bool = field(default=None)
849849
# mentions: array of Users, and maybe partial members
@@ -882,6 +882,12 @@ class Message(ClientSerializerMixin, IDMixin):
882882
converter=convert_list(Sticker), default=None
883883
) # deprecated
884884

885+
def __attrs_post_init__(self):
886+
if self.timestamp and isinstance(self.timestamp, str):
887+
self.timestamp = datetime.fromisoformat(self.timestamp)
888+
if self.edited_timestamp and isinstance(self.edited_timestamp, str):
889+
self.edited_timestamp = datetime.fromisoformat(self.edited_timestamp)
890+
885891
async def get_channel(self) -> Channel:
886892
"""
887893
Gets the channel where the message was sent.

0 commit comments

Comments
 (0)