Skip to content

Commit 6642d79

Browse files
committed
✨ Parse data as message in parse_message_update instead of using _update
1 parent c0c0b7c commit 6642d79

File tree

3 files changed

+14
-33
lines changed

3 files changed

+14
-33
lines changed

discord/message.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,26 +1012,6 @@ def _clear_emoji(self, emoji) -> Reaction | None:
10121012
del self.reactions[index]
10131013
return reaction
10141014

1015-
def _update(self, data):
1016-
# In an update scheme, 'author' key has to be handled before 'member'
1017-
# otherwise they overwrite each other which is undesirable.
1018-
# Since there's no good way to do this we have to iterate over every
1019-
# handler rather than iterating over the keys which is a little slower
1020-
for key, handler in self._HANDLERS:
1021-
try:
1022-
value = data[key]
1023-
except KeyError:
1024-
continue
1025-
else:
1026-
handler(self, value)
1027-
1028-
# clear the cached properties
1029-
for attr in self._CACHED_SLOTS:
1030-
try:
1031-
delattr(self, attr)
1032-
except AttributeError:
1033-
pass
1034-
10351015
def _handle_edited_timestamp(self, value: str) -> None:
10361016
self._edited_timestamp = utils.parse_time(value)
10371017

discord/raw_models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,15 +176,21 @@ class RawMessageUpdateEvent(_RawReprMixin):
176176
cached_message: Optional[:class:`Message`]
177177
The cached message, if found in the internal message cache. Represents the message before
178178
it is modified by the data in :attr:`RawMessageUpdateEvent.data`.
179+
new_message: Optional[:class:`Message`]
180+
The new message object. Represents the message after it is modified by the data in
181+
:attr:`RawMessageUpdateEvent.data`.
182+
183+
.. versionadded:: 2.7
179184
"""
180185

181186
__slots__ = ("message_id", "channel_id", "guild_id", "data", "cached_message")
182187

183-
def __init__(self, data: MessageUpdateEvent) -> None:
188+
def __init__(self, data: MessageUpdateEvent, new_message: Message) -> None:
184189
self.message_id: int = int(data["id"])
185190
self.channel_id: int = int(data["channel_id"])
186191
self.data: MessageUpdateEvent = data
187192
self.cached_message: Message | None = None
193+
self.new_message: Message = new_message
188194

189195
try:
190196
self.guild_id: int | None = int(data["guild_id"])

discord/state.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -772,21 +772,16 @@ def parse_message_delete_bulk(self, data) -> None:
772772
self._messages.remove(msg) # type: ignore
773773

774774
def parse_message_update(self, data) -> None:
775-
raw = RawMessageUpdateEvent(data)
776-
message = self._get_message(raw.message_id)
777-
if message is not None:
778-
older_message = copy.copy(message)
779-
raw.cached_message = older_message
780-
self.dispatch("raw_message_edit", raw)
781-
message._update(data)
782-
# Coerce the `after` parameter to take the new updated Member
783-
# ref: #5999
784-
older_message.author = message.author
785-
self.dispatch("message_edit", older_message, message)
775+
old_message = self._get_message(raw.message_id)
776+
channel, _ = self._get_guild_channel(data)
777+
message = Message(channel=channel, data=data, state=self)
778+
raw = RawMessageUpdateEvent(data, message)
779+
self.dispatch("raw_message_edit", raw)
780+
if old_message is not None:
781+
self.dispatch("message_edit", old_message, message)
786782
else:
787783
if poll_data := data.get("poll"):
788784
self.store_raw_poll(poll_data, raw)
789-
self.dispatch("raw_message_edit", raw)
790785

791786
if "components" in data and self._view_store.is_message_tracked(raw.message_id):
792787
self._view_store.update_from_message(raw.message_id, data["components"])

0 commit comments

Comments
 (0)