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
19 changes: 11 additions & 8 deletions interactions/api/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
22 changes: 19 additions & 3 deletions interactions/api/gateway/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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:
Expand All @@ -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)
Expand All @@ -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)
Expand Down
1 change: 0 additions & 1 deletion interactions/api/http/guild.py
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,6 @@ async def add_guild_member(
},
)


return request

async def remove_guild_member(
Expand Down
5 changes: 3 additions & 2 deletions interactions/api/models/channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 13 additions & 12 deletions interactions/api/models/guild.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 8 additions & 2 deletions interactions/api/models/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down