From 4c03aa80ab5201f4f7e8fa1dd7950472ec547159 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 | 26 ++++++++++++++++---------- src/service/rooms/timeline/mod.rs | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index b89e8ea5..358aa996 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -16,12 +16,12 @@ use ruma::{ history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent}, join_rules::{JoinRule, RoomJoinRulesEventContent}, member::{MembershipState, RoomMemberEventContent}, - message::RoomMessageEventContent, + message::{RoomMessageEventContent, Relation::Reply}, name::RoomNameEventContent, power_levels::RoomPowerLevelsEventContent, topic::RoomTopicEventContent, }, - TimelineEventType, + TimelineEventType, relation::InReplyTo, }, EventId, OwnedRoomAliasId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId, }; @@ -285,7 +285,7 @@ enum ServerCommand { #[derive(Debug)] pub enum AdminRoomEvent { - ProcessMessage(String), + ProcessMessage(String, Arc), SendMessage(RoomMessageEventContent), } @@ -330,7 +330,11 @@ impl Service { .expect("Database data for admin room alias must be valid") .expect("Admin room must exist"); - let send_message = |message: RoomMessageEventContent, mutex_lock: &MutexGuard<'_, ()>| { + let send_message = |mut message: RoomMessageEventContent, reply: Option>, mutex_lock: &MutexGuard<'_, ()>| { + if let Some(reply) = reply { + message.relates_to = Some(Reply { in_reply_to: InReplyTo { event_id: reply.into() } }) + } + services() .rooms .timeline @@ -353,9 +357,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 (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( @@ -369,7 +375,7 @@ impl Service { let state_lock = mutex_state.lock().await; - send_message(message_content, &state_lock); + send_message(message_content, reply, &state_lock); drop(state_lock); } @@ -377,9 +383,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 25e1c54d..52947887 100644 --- a/src/service/rooms/timeline/mod.rs +++ b/src/service/rooms/timeline/mod.rs @@ -466,7 +466,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()); } } }