Files
continuwuity/src/admin/room/commands.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

73 lines
1.5 KiB
Rust
Raw Normal View History

2024-07-27 00:11:41 +00:00
use conduit::Result;
use ruma::events::room::message::RoomMessageEventContent;
2024-04-20 19:55:14 -04:00
use crate::{admin_command, get_room_info, PAGE_SIZE};
2024-04-20 19:55:14 -04:00
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn list_rooms(
&self, page: Option<usize>, exclude_disabled: bool, exclude_banned: bool,
) -> Result<RoomMessageEventContent> {
2024-04-20 19:55:14 -04:00
// TODO: i know there's a way to do this with clap, but i can't seem to find it
let page = page.unwrap_or(1);
2024-07-27 00:11:41 +00:00
let mut rooms = self
.services
2024-04-20 19:55:14 -04:00
.rooms
.metadata
.iter_ids()
.filter_map(|room_id| {
room_id
.ok()
.filter(|room_id| {
if exclude_disabled
2024-07-27 00:11:41 +00:00
&& self
.services
.rooms
.metadata
.is_disabled(room_id)
.unwrap_or(false)
{
return false;
}
if exclude_banned
2024-07-27 00:11:41 +00:00
&& self
.services
.rooms
.metadata
.is_banned(room_id)
.unwrap_or(false)
{
return false;
}
true
})
2024-07-27 00:11:41 +00:00
.map(|room_id| get_room_info(self.services, &room_id))
})
2024-04-20 19:55:14 -04:00
.collect::<Vec<_>>();
rooms.sort_by_key(|r| r.1);
rooms.reverse();
let rooms = rooms
.into_iter()
2024-05-05 20:40:58 -04:00
.skip(page.saturating_sub(1).saturating_mul(PAGE_SIZE))
2024-04-20 19:55:14 -04:00
.take(PAGE_SIZE)
.collect::<Vec<_>>();
if rooms.is_empty() {
return Ok(RoomMessageEventContent::text_plain("No more rooms."));
};
let output_plain = format!(
"Rooms ({}):\n```\n{}\n```",
rooms.len(),
2024-04-20 19:55:14 -04:00
rooms
.iter()
.map(|(id, members, name)| format!("{id}\tMembers: {members}\tName: {name}"))
.collect::<Vec<_>>()
.join("\n")
);
Ok(RoomMessageEventContent::notice_markdown(output_plain))
2024-04-20 19:55:14 -04:00
}