tuwunel_admin/room/
list.rs1use 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 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}