Skip to content

Commit 36c1f0e

Browse files
authored
Keep message reference when updating cache messages (#1192)
- Deserialize `referenced_message` as the partial message it is
1 parent 22b6766 commit 36c1f0e

6 files changed

Lines changed: 17 additions & 10 deletions

File tree

changes/1192.bugfix.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Properly garbage collect message references in the cache
2+
- Properly deserialize `PartialMessage.referenced_message` as a partial message

hikari/impl/cache.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,12 @@ def _set_message(
15631563

15641564
referenced_message: typing.Optional[cache_utility.RefCell[cache_utility.MessageData]] = None
15651565
if message.referenced_message:
1566-
referenced_message = self._set_message(message.referenced_message)
1566+
reference_id = message.referenced_message.id
1567+
referenced_message = self._message_entries.get(reference_id) or self._referenced_messages.get(reference_id)
1568+
1569+
if referenced_message:
1570+
# Since the message is partial, if we don't have it cached, there is nothing we can do about it
1571+
referenced_message.object.update(message.referenced_message)
15671572

15681573
# Only increment ref counts if this wasn't previously cached.
15691574
if message.id not in self._referenced_messages and message.id not in self._message_entries:

hikari/impl/entity_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2534,9 +2534,9 @@ def deserialize_message(
25342534
if "message_reference" in payload:
25352535
message_reference = self._deserialize_message_reference(payload["message_reference"])
25362536

2537-
referenced_message: typing.Optional[message_models.Message] = None
2537+
referenced_message: typing.Optional[message_models.PartialMessage] = None
25382538
if referenced_message_payload := payload.get("referenced_message"):
2539-
referenced_message = self.deserialize_message(referenced_message_payload)
2539+
referenced_message = self.deserialize_partial_message(referenced_message_payload)
25402540

25412541
application: typing.Optional[message_models.MessageApplication] = None
25422542
if "application" in payload:

hikari/internal/cache.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -723,9 +723,6 @@ def build_from_entity(
723723
if not member and message.member:
724724
member = RefCell(MemberData.build_from_entity(message.member))
725725

726-
if not referenced_message and message.referenced_message:
727-
referenced_message = RefCell(MessageData.build_from_entity(message.referenced_message))
728-
729726
interaction = (
730727
MessageInteractionData.build_from_entity(message.interaction, user=interaction_user)
731728
if message.interaction

hikari/messages.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ class PartialMessage(snowflakes.Unique):
895895
This is a string used for validating a message was sent.
896896
"""
897897

898-
referenced_message: undefined.UndefinedNoneOr[Message] = attr.field(hash=False, eq=False, repr=False)
898+
referenced_message: undefined.UndefinedNoneOr[PartialMessage] = attr.field(hash=False, eq=False, repr=False)
899899
"""The message that was replied to.
900900
901901
If `type` is `MessageType.REPLY` and `hikari.undefined.UNDEFINED`, Discord's
@@ -1737,8 +1737,11 @@ class Message(PartialMessage):
17371737
nonce: typing.Optional[str] = attr.field(hash=False, eq=False, repr=False)
17381738
"""The message nonce. This is a string used for validating a message was sent."""
17391739

1740-
referenced_message: typing.Optional[Message] = attr.field(hash=False, eq=False, repr=False)
1741-
"""The message that was replied to."""
1740+
referenced_message: typing.Optional[PartialMessage] = attr.field(hash=False, eq=False, repr=False)
1741+
"""The message that was replied to.
1742+
1743+
If `type` is `MessageType.REPLY` and `builtins.None`, the message was deleted.
1744+
"""
17421745

17431746
interaction: typing.Optional[MessageInteraction] = attr.field(hash=False, eq=False, repr=False)
17441747
"""Information about the interaction this message was created by."""

tests/hikari/impl/test_entity_factory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4854,7 +4854,7 @@ def test_deserialize_message(
48544854
assert message.message_reference.guild_id == 278325129692446720
48554855
assert isinstance(message.message_reference, message_models.MessageReference)
48564856

4857-
assert message.referenced_message == entity_factory_impl.deserialize_message(referenced_message)
4857+
assert message.referenced_message == entity_factory_impl.deserialize_partial_message(referenced_message)
48584858
assert message.flags == message_models.MessageFlag.IS_CROSSPOST
48594859

48604860
# Sticker

0 commit comments

Comments
 (0)