From b30884c7ace5f15a363d2a8dfaf9f60b6855a803 Mon Sep 17 00:00:00 2001 From: tezlm Date: Wed, 4 Oct 2023 20:13:04 -0700 Subject: [PATCH] reply to messages --- src/service/admin/mod.rs | 49 ++++++++++++++++++------------- src/service/rooms/timeline/mod.rs | 2 +- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index 3ee2e5ea..4a964cbc 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -9,6 +9,7 @@ use clap::{Parser, Subcommand}; use regex::Regex; use ruma::{ events::{ + relation::InReplyTo, room::{ canonical_alias::RoomCanonicalAliasEventContent, create::RoomCreateEventContent, @@ -16,7 +17,7 @@ use ruma::{ history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent}, join_rules::{JoinRule, RoomJoinRulesEventContent}, member::{MembershipState, RoomMemberEventContent}, - message::RoomMessageEventContent, + message::{Relation::Reply, RoomMessageEventContent}, name::RoomNameEventContent, power_levels::RoomPowerLevelsEventContent, topic::RoomTopicEventContent, @@ -285,7 +286,7 @@ enum ServerCommand { #[derive(Debug)] pub enum AdminRoomEvent { - ProcessMessage(String), + ProcessMessage(String, Arc), SendMessage(RoomMessageEventContent), } @@ -333,9 +334,11 @@ impl Service { loop { tokio::select! { Some(event) = receiver.recv() => { - let message_content = match event { - AdminRoomEvent::SendMessage(content) => content, - AdminRoomEvent::ProcessMessage(room_message) => self.process_admin_message(room_message).await + let (mut message_content, reply) = match event { + AdminRoomEvent::SendMessage(content) => (content, None), + AdminRoomEvent::ProcessMessage(room_message, reply_id) => { + (self.process_admin_message(room_message).await, Some(reply_id)) + } }; let mutex_state = Arc::clone( @@ -349,20 +352,24 @@ impl Service { let state_lock = mutex_state.lock().await; - services().rooms.timeline.build_and_append_pdu( - PduBuilder { - event_type: TimelineEventType::RoomMessage, - content: to_raw_value(&message_content) - .expect("event is valid, we just created it"), - unsigned: None, - state_key: None, - redacts: None, - }, - &conduit_user, - &conduit_room, - &state_lock) - .await - .unwrap(); + if let Some(reply) = reply { + message_content.relates_to = Some(Reply { in_reply_to: InReplyTo { event_id: reply.into() } }) + } + + services().rooms.timeline.build_and_append_pdu( + PduBuilder { + event_type: TimelineEventType::RoomMessage, + content: to_raw_value(&message_content) + .expect("event is valid, we just created it"), + unsigned: None, + state_key: None, + redacts: None, + }, + &conduit_user, + &conduit_room, + &state_lock) + .await + .unwrap(); drop(state_lock); @@ -371,9 +378,9 @@ impl Service { } } - pub fn process_message(&self, room_message: String) { + pub fn process_message(&self, room_message: String, event_id: Arc) { self.sender - .send(AdminRoomEvent::ProcessMessage(room_message)) + .send(AdminRoomEvent::ProcessMessage(room_message, event_id)) .unwrap(); } diff --git a/src/service/rooms/timeline/mod.rs b/src/service/rooms/timeline/mod.rs index 3deac75d..bc8bf3ef 100644 --- a/src/service/rooms/timeline/mod.rs +++ b/src/service/rooms/timeline/mod.rs @@ -483,7 +483,7 @@ impl Service { && services().globals.emergency_password().is_none(); if to_conduit && !from_conduit && admin_room.as_ref() == Some(&pdu.room_id) { - services().admin.process_message(body); + services().admin.process_message(body, pdu.event_id.clone()); } } }