From 141a6bc73eec1ec8c9401f99d26e015e9d6e53e5 Mon Sep 17 00:00:00 2001 From: strawberry Date: Sat, 30 Mar 2024 21:04:57 -0400 Subject: [PATCH] dont panic when failing to create admin room response/PDU Signed-off-by: strawberry --- src/main.rs | 5 ++++- src/service/admin/mod.rs | 24 +++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6381506f..63b3b8bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -84,9 +84,12 @@ fn main() { return; }; + #[cfg(feature = "sentry_telemetry")] + let _guard; + #[cfg(feature = "sentry_telemetry")] if config.sentry { - let _guard = sentry::init(( + _guard = sentry::init(( "https://fe2eb4536aa04949e28eff3128d64757@o4506996327251968.ingest.us.sentry.io/4506996334657536", sentry::ClientOptions { release: sentry::release_name!(), diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index 8dbdafd0..2e6d61f6 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -24,7 +24,7 @@ use ruma::{ }; use serde_json::value::to_raw_value; use tokio::sync::{mpsc, Mutex}; -use tracing::warn; +use tracing::{error, warn}; use super::pdu::PduBuilder; use crate::{ @@ -148,7 +148,7 @@ impl Service { message_content.relates_to = Some(Reply { in_reply_to: InReplyTo { event_id: reply.into() } }); } - services().rooms.timeline.build_and_append_pdu( + if let Err(e) = services().rooms.timeline.build_and_append_pdu( PduBuilder { event_type: TimelineEventType::RoomMessage, content: to_raw_value(&message_content) @@ -160,7 +160,25 @@ impl Service { &conduit_user, &conduit_room, &state_lock) - .await?; + .await { + error!("Failed to build and append admin room response PDU: \"{e}\""); + + let error_room_message = RoomMessageEventContent::text_plain(format!("Failed to build and append admin room PDU: \"{e}\"\n\nThe original admin command may have finished successfully, but we could not return the output.")); + + services().rooms.timeline.build_and_append_pdu( + PduBuilder { + event_type: TimelineEventType::RoomMessage, + content: to_raw_value(&error_room_message) + .expect("event is valid, we just created it"), + unsigned: None, + state_key: None, + redacts: None, + }, + &conduit_user, + &conduit_room, + &state_lock) + .await?; + } drop(state_lock);