Skip to content

Commit 4e853f8

Browse files
authored
feat: ✨ Parse data as message in parse_message_update instead of using _update (#2780)
2 parents 34af9de + 69458ad commit 4e853f8

File tree

4 files changed

+20
-33
lines changed

4 files changed

+20
-33
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ These changes are available on the `master` branch, but have not yet been releas
1212

1313
### Added
1414

15+
- Added `RawMessageUpdateEvent.new_message` - message update events now contain full
16+
message objects ([#2780](https://github.com/Pycord-Development/pycord/pull/2780))
17+
1518
### Changed
1619

1720
### Fixed

discord/message.py

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

1211-
def _update(self, data):
1212-
# In an update scheme, 'author' key has to be handled before 'member'
1213-
# otherwise they overwrite each other which is undesirable.
1214-
# Since there's no good way to do this we have to iterate over every
1215-
# handler rather than iterating over the keys which is a little slower
1216-
for key, handler in self._HANDLERS:
1217-
try:
1218-
value = data[key]
1219-
except KeyError:
1220-
continue
1221-
else:
1222-
handler(self, value)
1223-
1224-
# clear the cached properties
1225-
for attr in self._CACHED_SLOTS:
1226-
try:
1227-
delattr(self, attr)
1228-
except AttributeError:
1229-
pass
1230-
12311211
def _handle_edited_timestamp(self, value: str) -> None:
12321212
self._edited_timestamp = utils.parse_time(value)
12331213

discord/raw_models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,21 @@ class RawMessageUpdateEvent(_RawReprMixin):
185185
cached_message: Optional[:class:`Message`]
186186
The cached message, if found in the internal message cache. Represents the message before
187187
it is modified by the data in :attr:`RawMessageUpdateEvent.data`.
188+
new_message: :class:`Message`
189+
The new message object. Represents the message after it is modified by the data in
190+
:attr:`RawMessageUpdateEvent.data`.
191+
192+
.. versionadded:: 2.7
188193
"""
189194

190195
__slots__ = ("message_id", "channel_id", "guild_id", "data", "cached_message")
191196

192-
def __init__(self, data: MessageUpdateEvent) -> None:
197+
def __init__(self, data: MessageUpdateEvent, new_message: Message) -> None:
193198
self.message_id: int = int(data["id"])
194199
self.channel_id: int = int(data["channel_id"])
195200
self.data: MessageUpdateEvent = data
196201
self.cached_message: Message | None = None
202+
self.new_message: Message = new_message
197203

198204
try:
199205
self.guild_id: int | None = int(data["guild_id"])

discord/state.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -775,21 +775,19 @@ def parse_message_delete_bulk(self, data) -> None:
775775
self._messages.remove(msg) # type: ignore
776776

777777
def parse_message_update(self, data) -> None:
778-
raw = RawMessageUpdateEvent(data)
779-
message = self._get_message(raw.message_id)
780-
if message is not None:
781-
older_message = copy.copy(message)
782-
raw.cached_message = older_message
783-
self.dispatch("raw_message_edit", raw)
784-
message._update(data)
785-
# Coerce the `after` parameter to take the new updated Member
786-
# ref: #5999
787-
older_message.author = message.author
788-
self.dispatch("message_edit", older_message, message)
778+
old_message = self._get_message(raw.message_id)
779+
if old_message is not None:
780+
self._messages.remove(old_message)
781+
channel, _ = self._get_guild_channel(data)
782+
message = Message(channel=channel, data=data, state=self)
783+
self._messages.append(message)
784+
raw = RawMessageUpdateEvent(data, message)
785+
self.dispatch("raw_message_edit", raw)
786+
if old_message is not None:
787+
self.dispatch("message_edit", old_message, message)
789788
else:
790789
if poll_data := data.get("poll"):
791790
self.store_raw_poll(poll_data, raw)
792-
self.dispatch("raw_message_edit", raw)
793791

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

0 commit comments

Comments
 (0)