Skip to main content

tuwunel_admin/debug/
get_room_state.rs

1use 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}