diff --git a/src/bot.rs b/src/bot.rs
index d7c6b9b..d656052 100644
--- a/src/bot.rs
+++ b/src/bot.rs
@@ -8,7 +8,11 @@ use crate::state::DiceBotState;
use dirs;
use futures::stream::{self, StreamExt};
use log::info;
-use matrix_sdk::{self, identifiers::RoomId, Client, ClientConfig, JoinedRoom, SyncSettings};
+use matrix_sdk::{
+ self,
+ identifiers::{EventId, RoomId},
+ Client, ClientConfig, JoinedRoom, SyncSettings,
+};
use std::clone::Clone;
use std::path::PathBuf;
use std::sync::{Arc, RwLock};
@@ -59,9 +63,10 @@ async fn handle_single_result(
cmd_result: &ExecutionResult,
respond_to: &str,
room_id: &RoomId,
+ event_id: EventId,
) {
let html = cmd_result.message_html(respond_to);
- matrix::send_message(client, room_id, &html).await;
+ matrix::send_message(client, room_id, &html, Some(event_id)).await;
}
/// Handle responding to multiple commands being executed. Will print
@@ -98,7 +103,7 @@ async fn handle_multiple_results(
.replace("\n", "
")
};
- matrix::send_message(client, room_id, &message).await;
+ matrix::send_message(client, room_id, &message, None).await;
}
impl DiceBot {
@@ -176,7 +181,13 @@ impl DiceBot {
Ok(())
}
- async fn execute_commands(&self, room: &JoinedRoom, sender_username: &str, msg_body: &str) {
+ async fn execute_commands(
+ &self,
+ room: &JoinedRoom,
+ sender_username: &str,
+ msg_body: &str,
+ event_id: EventId,
+ ) {
let room_name: &str = &room.display_name().await.ok().unwrap_or_default();
let room_id = room.room_id().clone();
@@ -208,7 +219,14 @@ impl DiceBot {
if results.len() >= 1 {
if results.len() == 1 {
- handle_single_result(&self.client, &results[0].1, sender_username, &room_id).await;
+ handle_single_result(
+ &self.client,
+ &results[0].1,
+ sender_username,
+ &room_id,
+ event_id,
+ )
+ .await;
} else if results.len() > 1 {
handle_multiple_results(&self.client, &results, sender_username, &room_id).await;
}
diff --git a/src/bot/event_handlers.rs b/src/bot/event_handlers.rs
index f6f323a..cbc895c 100644
--- a/src/bot/event_handlers.rs
+++ b/src/bot/event_handlers.rs
@@ -211,7 +211,7 @@ impl EventEmitter for DiceBot {
return;
};
- self.execute_commands(&room, &sender_username, &msg_body)
+ self.execute_commands(&room, &sender_username, &msg_body, event.event_id.clone())
.await;
}
}
diff --git a/src/matrix.rs b/src/matrix.rs
index 525466e..d0480ab 100644
--- a/src/matrix.rs
+++ b/src/matrix.rs
@@ -1,5 +1,9 @@
use log::error;
-use matrix_sdk::Error as MatrixError;
+use matrix_sdk::{
+ events::room::message::{InReplyTo, Relation},
+ identifiers::EventId,
+ Error as MatrixError,
+};
use matrix_sdk::{
events::{
room::message::{MessageEventContent::Notice, NoticeMessageEventContent},
@@ -38,12 +42,20 @@ pub async fn get_users_in_room(client: &Client, room_id: &RoomId) -> Vec
}
}
-pub async fn send_message(client: &Client, room_id: &RoomId, message: &str) {
+pub async fn send_message(
+ client: &Client,
+ room_id: &RoomId,
+ message: &str,
+ reply_to: Option,
+) {
let plain = html2text::from_read(message.as_bytes(), message.len());
- let response = RoomMessage(Notice(NoticeMessageEventContent::html(
- plain.trim(),
- message,
- )));
+ let mut content = NoticeMessageEventContent::html(plain.trim(), message);
+
+ content.relates_to = reply_to.map(|event_id| Relation::Reply {
+ in_reply_to: InReplyTo { event_id },
+ });
+
+ let response = RoomMessage(Notice(content));
let result = client.room_send(&room_id, response, None).await;
if let Err(e) = result {