/ src / matrix / utils.rs
utils.rs
 1  use std::future::Future;
 2  
 3  use matrix_sdk::{
 4      Room,
 5      ruma::{
 6          api::client::message::send_message_event,
 7          events::room::message::{OriginalRoomMessageEvent, Relation, RoomMessageEventContent},
 8      },
 9  };
10  
11  pub trait RoomExt {
12      fn reply_to(
13          &self,
14          event: &OriginalRoomMessageEvent,
15          content: RoomMessageEventContent,
16      ) -> impl Future<Output = Result<send_message_event::v3::Response, matrix_sdk::Error>> + Send;
17  }
18  
19  impl RoomExt for Room {
20      async fn reply_to(
21          &self,
22          event: &OriginalRoomMessageEvent,
23          mut content: RoomMessageEventContent,
24      ) -> Result<send_message_event::v3::Response, matrix_sdk::Error> {
25          content.relates_to = event
26              .content
27              .relates_to
28              .as_ref()
29              .filter(|rl| matches!(rl, Relation::Thread(_)))
30              .cloned();
31          self.send(content).await
32      }
33  }
34  
35  pub fn message(text: impl AsRef<str> + Into<String>) -> RoomMessageEventContent {
36      RoomMessageEventContent::text_markdown(text)
37  }
38  
39  pub fn notice(text: impl AsRef<str> + Into<String>) -> RoomMessageEventContent {
40      RoomMessageEventContent::notice_markdown(text)
41  }
42  
43  pub fn html_notice(text: impl Into<String> + Clone) -> RoomMessageEventContent {
44      RoomMessageEventContent::notice_html(text.clone(), text)
45  }
46  
47  pub fn html_message(html: impl Into<String> + Clone) -> RoomMessageEventContent {
48      RoomMessageEventContent::text_html(html.clone(), html)
49  }
50  
51  pub fn error_message(text: impl AsRef<str>) -> RoomMessageEventContent {
52      message(format!("❌ Error: {}", text.as_ref()))
53  }