diff --git a/interactions/api/cache.py b/interactions/api/cache.py index bfe20f751..bf9e7ba17 100644 --- a/interactions/api/cache.py +++ b/interactions/api/cache.py @@ -61,16 +61,19 @@ def merge(self, item: _T, id: Optional["Key"] = None) -> None: continue # we can only assume that discord did not provide it, falsely deleting is worse than not deleting if getattr(old_item, attrib) != getattr(item, attrib): - if isinstance(item.attrib, list) and not isinstance( - old_item.attrib, list + + if isinstance(getattr(item, attrib), list) and not isinstance( + getattr(old_item, attrib), list ): # could be None - old_item.attrib = [] - if isinstance(old_item.attrib, list): - for value in item.attrib: - if value not in old_item.attrib: - old_item.attrib.append(value) + 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) else: - setattr(old_item, attrib, item.attrib) + setattr(old_item, attrib, getattr(item, attrib)) self.values[_id] = old_item diff --git a/interactions/api/gateway/client.py b/interactions/api/gateway/client.py index 3006cf068..c63d75173 100644 --- a/interactions/api/gateway/client.py +++ b/interactions/api/gateway/client.py @@ -402,7 +402,11 @@ 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): + 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) @@ -420,6 +424,10 @@ def _dispatch_event(self, event: str, data: dict) -> None: old_obj = self._http.cache[model].get(id) if old_obj: + for key, value in old_obj._json.items(): + if hasattr(value, "_json"): + old_obj._json[key] = value._json + before = model(**old_obj._json) old_obj.update(**obj._json) else: @@ -428,7 +436,11 @@ def _dispatch_event(self, event: str, data: dict) -> None: _cache.add(old_obj, id) - if guild_id := data.get("guild_id") and not isinstance(obj, Guild): + 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) @@ -453,7 +465,11 @@ 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): + 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) diff --git a/interactions/api/http/guild.py b/interactions/api/http/guild.py index 2e0edb038..816f3694d 100644 --- a/interactions/api/http/guild.py +++ b/interactions/api/http/guild.py @@ -585,7 +585,6 @@ async def add_guild_member( }, ) - return request async def remove_guild_member( diff --git a/interactions/api/models/channel.py b/interactions/api/models/channel.py index e64e51f3c..cef609b04 100644 --- a/interactions/api/models/channel.py +++ b/interactions/api/models/channel.py @@ -168,8 +168,9 @@ class Channel(ClientSerializerMixin, IDMixin): def __attrs_post_init__(self): # sourcery skip: last-if-guard if self._client: - if not self.recipients: - self.recipients = self._client.cache[Channel].get(self.id).recipients + if channel := self._client.cache[Channel].get(self.id): + if not self.recipients: + self.recipients = channel.recipients def __repr__(self) -> str: return self.name diff --git a/interactions/api/models/guild.py b/interactions/api/models/guild.py index 317d0b9fc..20964d430 100644 --- a/interactions/api/models/guild.py +++ b/interactions/api/models/guild.py @@ -345,18 +345,19 @@ def __attrs_post_init__(self): # sourcery skip: last-if-guard if self.members: self._client.cache[Member].update({(self.id, m.id): m for m in self.members}) - if not self.channels: - self.channels = self._client.cache[Guild].get(self.id).channels - if not self.threads: - self.threads = self._client.cache[Guild].get(self.id).threads - if not self.roles: - self.roles = self._client.cache[Guild].get(self.id).roles - if not self.members: - self.members = self._client.cache[Guild].get(self.id).members - if not self.member_count: - self.member_count = self._client.cache[Guild].get(self.id).member_count - if not self.presences: - self.presences = self._client.cache[Guild].get(self.id).presences + if guild := self._client.cache[Guild].get(self.id): + if not self.channels: + self.channels = guild.channels + if not self.threads: + self.threads = guild.threads + if not self.roles: + self.roles = guild.roles + if not self.members: + self.members = guild.members + if not self.member_count: + self.member_count = guild.member_count + if not self.presences: + self.presences = guild.presences def __repr__(self) -> str: return self.name diff --git a/interactions/api/models/message.py b/interactions/api/models/message.py index 1768822c0..4167c1bd0 100644 --- a/interactions/api/models/message.py +++ b/interactions/api/models/message.py @@ -842,8 +842,8 @@ class Message(ClientSerializerMixin, IDMixin): author: User = field(converter=User, add_client=True, default=None) member: Optional[Member] = field(converter=Member, default=None, add_client=True) content: str = field(default=None) - timestamp: datetime = field(converter=datetime.fromisoformat, default=None) - edited_timestamp: Optional[datetime] = field(converter=datetime.fromisoformat, default=None) + timestamp: datetime = field(converter=str, default=None) + edited_timestamp: Optional[datetime] = field(converter=str, default=None) tts: bool = field(default=None) mention_everyone: bool = field(default=None) # mentions: array of Users, and maybe partial members @@ -882,6 +882,12 @@ class Message(ClientSerializerMixin, IDMixin): converter=convert_list(Sticker), default=None ) # deprecated + def __attrs_post_init__(self): + if self.timestamp and isinstance(self.timestamp, str): + self.timestamp = datetime.fromisoformat(self.timestamp) + if self.edited_timestamp and isinstance(self.edited_timestamp, str): + self.edited_timestamp = datetime.fromisoformat(self.edited_timestamp) + async def get_channel(self) -> Channel: """ Gets the channel where the message was sent.