tuwunel_admin/query/
room_timeline.rs1use clap::Subcommand;
2use futures::TryStreamExt;
3use ruma::OwnedRoomOrAliasId;
4use tuwunel_core::{PduCount, Result, utils::stream::TryTools};
5
6use crate::{admin_command, admin_command_dispatch};
7
8#[admin_command_dispatch]
9#[derive(Debug, Subcommand)]
10pub(crate) enum RoomTimelineCommand {
12 Pdus {
13 room_id: OwnedRoomOrAliasId,
14
15 from: Option<String>,
16
17 #[arg(short, long)]
18 limit: Option<usize>,
19 },
20
21 Last {
22 room_id: OwnedRoomOrAliasId,
23 },
24}
25
26#[admin_command]
27pub(super) async fn last(&self, room_id: OwnedRoomOrAliasId) -> Result {
28 let room_id = self
29 .services
30 .alias
31 .maybe_resolve(&room_id)
32 .await?;
33
34 let result = self
35 .services
36 .timeline
37 .last_timeline_count(None, &room_id, None)
38 .await?;
39
40 self.write_str(&format!("{result:#?}")).await
41}
42
43#[admin_command]
44pub(super) async fn pdus(
45 &self,
46 room_id: OwnedRoomOrAliasId,
47 from: Option<String>,
48 limit: Option<usize>,
49) -> Result {
50 let room_id = self
51 .services
52 .alias
53 .maybe_resolve(&room_id)
54 .await?;
55
56 let from: Option<PduCount> = from.as_deref().map(str::parse).transpose()?;
57
58 let result: Vec<_> = self
59 .services
60 .timeline
61 .pdus_rev(None, &room_id, from)
62 .try_take(limit.unwrap_or(3))
63 .try_collect()
64 .await?;
65
66 self.write_str(&format!("{result:#?}")).await
67}