Skip to main content

tuwunel_admin/room/
list.rs

1use futures::StreamExt;
2use tuwunel_core::{Err, Result};
3
4use crate::{PAGE_SIZE, admin_command, get_room_info};
5
6#[admin_command]
7pub(super) async fn room_list(
8	&self,
9	page: Option<usize>,
10	exclude_disabled: bool,
11	exclude_banned: bool,
12	no_details: bool,
13) -> Result {
14	// TODO: i know there's a way to do this with clap, but i can't seem to find it
15	let page = page.unwrap_or(1);
16	let mut rooms = self
17		.services
18		.metadata
19		.iter_ids()
20		.filter_map(async |room_id| {
21			(!exclude_disabled || !self.services.metadata.is_disabled(room_id).await)
22				.then_some(room_id)
23		})
24		.filter_map(async |room_id| {
25			(!exclude_banned || !self.services.metadata.is_banned(room_id).await)
26				.then_some(room_id)
27		})
28		.then(|room_id| get_room_info(self.services, room_id))
29		.collect::<Vec<_>>()
30		.await;
31
32	rooms.sort_by_key(|r| r.1);
33	rooms.reverse();
34
35	let rooms = rooms
36		.into_iter()
37		.skip(page.saturating_sub(1).saturating_mul(PAGE_SIZE))
38		.take(PAGE_SIZE)
39		.collect::<Vec<_>>();
40
41	if rooms.is_empty() {
42		return Err!("No more rooms.");
43	}
44
45	write!(self, "Rooms ({}):\n```\n", rooms.len()).await?;
46	for (id, members, name) in &rooms {
47		if no_details {
48			writeln!(self, "{id}").await?;
49		} else {
50			writeln!(self, "{id}\tMembers: {members}\tName: {name}").await?;
51		}
52	}
53	write!(self, "```").await
54}