tuwunel_admin/debug/
get_room_state.rs1use futures::TryStreamExt;
2use ruma::{OwnedRoomOrAliasId, events::AnyStateEvent, serde::Raw};
3use tuwunel_core::{Error, Result, matrix::Event, utils::stream::TryReadyExt};
4
5use crate::admin_command;
6
7#[admin_command]
8pub(super) async fn get_room_state(
9 &self,
10 room: OwnedRoomOrAliasId,
11 kind: Option<String>,
12 state_key: Option<String>,
13) -> Result {
14 let room_id = self.services.alias.maybe_resolve(&room).await?;
15
16 if state_key.is_none()
17 && let Some(kind) = kind.clone().map(Into::into)
18 {
19 return self
20 .services
21 .state_accessor
22 .room_state_type_pdus(&room_id, &kind)
23 .map_ok(Event::into_format)
24 .ready_and_then(|event: Raw<AnyStateEvent>| {
25 serde_json::to_value(&event).map_err(Error::from)
26 })
27 .ready_and_then(|event| serde_json::to_string_pretty(&event).map_err(Error::from))
28 .try_for_each(|json| writeln!(self, "```json\n{json}\n```"))
29 .await;
30 }
31
32 if let Some(state_key) = state_key
33 && let Some(kind) = kind.map(Into::into)
34 {
35 let event: Raw<AnyStateEvent> = self
36 .services
37 .state_accessor
38 .room_state_get(&room_id, &kind, &state_key)
39 .await?
40 .into_format();
41
42 let value = serde_json::to_value(&event)?;
43 let json = serde_json::to_string_pretty(&value)?;
44 return writeln!(self, "```json\n{json}\n```").await;
45 }
46
47 self.services
48 .state_accessor
49 .room_state_full_pdus(&room_id)
50 .map_ok(Event::into_format)
51 .ready_and_then(|event: Raw<AnyStateEvent>| {
52 serde_json::to_value(&event).map_err(Error::from)
53 })
54 .ready_and_then(|event| serde_json::to_string_pretty(&event).map_err(Error::from))
55 .try_for_each(|json| writeln!(self, "```json\n{json}\n```"))
56 .await
57}