From 824ef40bd94a23b4bb9947f11cf256b2c14fc3aa Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Thu, 18 Nov 2021 20:20:43 +0100 Subject: [PATCH] events: Move message reply helper functions into a separate module --- crates/ruma-events/src/room/message.rs | 284 +------------------ crates/ruma-events/src/room/message/reply.rs | 277 ++++++++++++++++++ 2 files changed, 286 insertions(+), 275 deletions(-) create mode 100644 crates/ruma-events/src/room/message/reply.rs diff --git a/crates/ruma-events/src/room/message.rs b/crates/ruma-events/src/room/message.rs index c3252332..394f0862 100644 --- a/crates/ruma-events/src/room/message.rs +++ b/crates/ruma-events/src/room/message.rs @@ -2,7 +2,6 @@ use std::{borrow::Cow, fmt}; -use indoc::formatdoc; use js_int::UInt; use ruma_events_macros::EventContent; #[cfg(feature = "unstable-pre-spec")] @@ -19,6 +18,7 @@ use crate::key::verification::VerificationMethod; mod content_serde; pub mod feedback; mod relation_serde; +mod reply; /// The content of an `m.room.message` event. /// @@ -82,7 +82,7 @@ impl RoomMessageEventContent { /// Creates a plain text reply to a message. pub fn text_reply_plain(reply: impl fmt::Display, original_message: &RoomMessageEvent) -> Self { - let quoted = get_plain_quote_fallback(original_message); + let quoted = reply::get_plain_quote_fallback(original_message); let body = format!("{}\n\n{}", quoted, reply); @@ -100,8 +100,8 @@ impl RoomMessageEventContent { html_reply: impl fmt::Display, original_message: &RoomMessageEvent, ) -> Self { - let quoted = get_plain_quote_fallback(original_message); - let quoted_html = get_html_quote_fallback(original_message); + let quoted = reply::get_plain_quote_fallback(original_message); + let quoted_html = reply::get_html_quote_fallback(original_message); let body = format!("{}\n\n{}", quoted, reply); let html_body = format!("{}\n\n{}", quoted_html, html_reply); @@ -119,7 +119,7 @@ impl RoomMessageEventContent { reply: impl fmt::Display, original_message: &RoomMessageEvent, ) -> Self { - let quoted = get_plain_quote_fallback(original_message); + let quoted = reply::get_plain_quote_fallback(original_message); let body = format!("{}\n\n{}", quoted, reply); Self { @@ -136,8 +136,8 @@ impl RoomMessageEventContent { html_reply: impl fmt::Display, original_message: &RoomMessageEvent, ) -> Self { - let quoted = get_plain_quote_fallback(original_message); - let quoted_html = get_html_quote_fallback(original_message); + let quoted = reply::get_plain_quote_fallback(original_message); + let quoted_html = reply::get_html_quote_fallback(original_message); let body = format!("{}\n\n{}", quoted, reply); let html_body = format!("{}\n\n{}", quoted_html, html_reply); @@ -979,263 +979,13 @@ pub struct CustomEventContent { data: JsonObject, } -fn get_plain_quote_fallback(original_message: &RoomMessageEvent) -> String { - match &original_message.content.msgtype { - MessageType::Audio(_) => { - format!("> <{:?}> sent an audio file.", original_message.sender) - } - MessageType::Emote(content) => { - format!("> * <{:?}> {}", original_message.sender, content.body) - } - MessageType::File(_) => { - format!("> <{:?}> sent a file.", original_message.sender) - } - MessageType::Image(_) => { - format!("> <{:?}> sent an image.", original_message.sender) - } - MessageType::Location(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - MessageType::Notice(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - MessageType::ServerNotice(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - MessageType::Text(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - MessageType::Video(_) => { - format!("> <{:?}> sent a video.", original_message.sender) - } - MessageType::_Custom(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - #[cfg(feature = "unstable-pre-spec")] - MessageType::VerificationRequest(content) => { - format!("> <{:?}> {}", original_message.sender, content.body) - } - } - .replace('\n', "\n> ") -} - -#[allow(clippy::nonstandard_macro_braces)] -fn get_html_quote_fallback(original_message: &RoomMessageEvent) -> String { - match &original_message.content.msgtype { - MessageType::Audio(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent an audio file. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Emote(content) => { - formatdoc!( - " - -
- In reply to - * {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::File(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a file. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Image(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent an image. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Location(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a location. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Notice(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::ServerNotice(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) - } - MessageType::Text(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::Video(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a video. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::_Custom(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) - } - #[cfg(feature = "unstable-pre-spec")] - MessageType::VerificationRequest(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - server_name = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) - } - } -} - -fn formatted_or_plain_body<'a>(formatted: &'a Option, body: &'a str) -> &'a str { - if let Some(formatted_body) = formatted { - &formatted_body.body - } else { - body - } -} - #[cfg(test)] mod tests { - use std::convert::TryFrom; - use matches::assert_matches; - use ruma_identifiers::{event_id, EventId, RoomId, UserId}; + use ruma_identifiers::event_id; use serde_json::{from_value as from_json_value, json}; - use super::{InReplyTo, MessageType, Relation, RoomMessageEvent, RoomMessageEventContent}; + use super::{InReplyTo, MessageType, Relation, RoomMessageEventContent}; #[test] fn deserialize_reply() { @@ -1259,20 +1009,4 @@ mod tests { } if event_id == ev_id ); } - - #[test] - fn plain_quote_fallback_multiline() { - let sender = UserId::try_from("@alice:example.com").unwrap(); - assert_eq!( - super::get_plain_quote_fallback(&RoomMessageEvent { - content: RoomMessageEventContent::text_plain("multi\nline"), - event_id: EventId::new(sender.server_name()), - sender, - origin_server_ts: ruma_common::MilliSecondsSinceUnixEpoch::now(), - room_id: RoomId::try_from("!n8f893n9:example.com").unwrap(), - unsigned: crate::Unsigned::new(), - }), - "> <@alice:example.com> multi\n> line" - ); - } } diff --git a/crates/ruma-events/src/room/message/reply.rs b/crates/ruma-events/src/room/message/reply.rs new file mode 100644 index 00000000..4547ec36 --- /dev/null +++ b/crates/ruma-events/src/room/message/reply.rs @@ -0,0 +1,277 @@ +use indoc::formatdoc; + +use super::{FormattedBody, MessageType, RoomMessageEvent}; + +pub fn get_plain_quote_fallback(original_message: &RoomMessageEvent) -> String { + match &original_message.content.msgtype { + MessageType::Audio(_) => { + format!("> <{:?}> sent an audio file.", original_message.sender) + } + MessageType::Emote(content) => { + format!("> * <{:?}> {}", original_message.sender, content.body) + } + MessageType::File(_) => { + format!("> <{:?}> sent a file.", original_message.sender) + } + MessageType::Image(_) => { + format!("> <{:?}> sent an image.", original_message.sender) + } + MessageType::Location(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + MessageType::Notice(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + MessageType::ServerNotice(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + MessageType::Text(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + MessageType::Video(_) => { + format!("> <{:?}> sent a video.", original_message.sender) + } + MessageType::_Custom(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + #[cfg(feature = "unstable-pre-spec")] + MessageType::VerificationRequest(content) => { + format!("> <{:?}> {}", original_message.sender, content.body) + } + } + .replace('\n', "\n> ") +} + +#[allow(clippy::nonstandard_macro_braces)] +pub fn get_html_quote_fallback(original_message: &RoomMessageEvent) -> String { + match &original_message.content.msgtype { + MessageType::Audio(_) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ sent an audio file. +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + ) + } + MessageType::Emote(content) => { + formatdoc!( + " + +
+ In reply to + * {sender} +
+ {body} +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = formatted_or_plain_body(&content.formatted, &content.body), + ) + } + MessageType::File(_) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ sent a file. +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + ) + } + MessageType::Image(_) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ sent an image. +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + ) + } + MessageType::Location(_) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ sent a location. +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + ) + } + MessageType::Notice(content) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ {body} +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = formatted_or_plain_body(&content.formatted, &content.body), + ) + } + MessageType::ServerNotice(content) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ {body} +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = content.body, + ) + } + MessageType::Text(content) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ {body} +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = formatted_or_plain_body(&content.formatted, &content.body), + ) + } + MessageType::Video(_) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ sent a video. +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + ) + } + MessageType::_Custom(content) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ {body} +
+
+ ", + room_id = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = content.body, + ) + } + #[cfg(feature = "unstable-pre-spec")] + MessageType::VerificationRequest(content) => { + formatdoc!( + " + +
+ In reply to + {sender} +
+ {body} +
+
+ ", + server_name = original_message.room_id, + event_id = original_message.event_id, + sender = original_message.sender, + body = content.body, + ) + } + } +} + +fn formatted_or_plain_body<'a>(formatted: &'a Option, body: &'a str) -> &'a str { + if let Some(formatted_body) = formatted { + &formatted_body.body + } else { + body + } +} + +#[cfg(test)] +mod tests { + use std::convert::TryFrom; + + use ruma_identifiers::{EventId, RoomId, UserId}; + + use super::RoomMessageEvent; + use crate::room::message::RoomMessageEventContent; + + #[test] + fn plain_quote_fallback_multiline() { + let sender = UserId::try_from("@alice:example.com").unwrap(); + assert_eq!( + super::get_plain_quote_fallback(&RoomMessageEvent { + content: RoomMessageEventContent::text_plain("multi\nline"), + event_id: EventId::new(sender.server_name()), + sender, + origin_server_ts: ruma_common::MilliSecondsSinceUnixEpoch::now(), + room_id: RoomId::try_from("!n8f893n9:example.com").unwrap(), + unsigned: crate::Unsigned::new(), + }), + "> <@alice:example.com> multi\n> line" + ); + } +}