diff --git a/crates/ruma-events/src/room/message.rs b/crates/ruma-events/src/room/message.rs index 76521f68..24f8f204 100644 --- a/crates/ruma-events/src/room/message.rs +++ b/crates/ruma-events/src/room/message.rs @@ -6,7 +6,7 @@ use std::borrow::Cow; use ruma_common::{ serde::{JsonObject, StringEnum}, - EventId, + EventId, OwnedEventId, }; #[cfg(feature = "html")] use ruma_html::{sanitize_html, HtmlSanitizerMode, RemoveReplyFallback}; @@ -264,7 +264,11 @@ impl RoomMessageEventContent { self } - /// Turns `self` into a [replacement] (or edit) for the message with the given event ID. + /// Turns `self` into a [replacement] (or edit) for a given message. + /// + /// The first argument after `self` can be `&OriginalRoomMessageEvent` or + /// `&OriginalSyncRoomMessageEvent` if you don't want to create `ReplacementMetadata` separately + /// before calling this function. /// /// This takes the content and sets it in `m.new_content`, and modifies the `content` to include /// a fallback. @@ -287,15 +291,17 @@ impl RoomMessageEventContent { #[track_caller] pub fn make_replacement( mut self, - original_message: &OriginalSyncRoomMessageEvent, + metadata: impl Into, replied_to_message: Option<&OriginalRoomMessageEvent>, ) -> Self { + let metadata = metadata.into(); + // Prepare relates_to with the untouched msgtype. let relates_to = Relation::Replacement(Replacement { - event_id: original_message.event_id.clone(), + event_id: metadata.event_id, new_content: RoomMessageEventContentWithoutRelation { msgtype: self.msgtype.clone(), - mentions: original_message.content.mentions.clone(), + mentions: metadata.mentions, }, }); @@ -939,6 +945,30 @@ impl TryFrom> for RelationWithoutReplacement { } } +#[derive(Debug)] +pub struct ReplacementMetadata { + event_id: OwnedEventId, + mentions: Option, +} + +impl ReplacementMetadata { + pub fn new(event_id: OwnedEventId, mentions: Option) -> Self { + Self { event_id, mentions } + } +} + +impl From<&OriginalRoomMessageEvent> for ReplacementMetadata { + fn from(value: &OriginalRoomMessageEvent) -> Self { + ReplacementMetadata::new(value.event_id.to_owned(), value.content.mentions.clone()) + } +} + +impl From<&OriginalSyncRoomMessageEvent> for ReplacementMetadata { + fn from(value: &OriginalSyncRoomMessageEvent) -> Self { + ReplacementMetadata::new(value.event_id.to_owned(), value.content.mentions.clone()) + } +} + /// The format for the formatted representation of a message body. #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))] #[derive(Clone, PartialEq, Eq, StringEnum)]