2024-07-27 00:11:41 +00:00
|
|
|
use conduit::Result;
|
2024-07-07 15:18:07 -04:00
|
|
|
use ruma::events::room::message::RoomMessageEventContent;
|
2024-04-20 19:55:14 -04:00
|
|
|
|
2024-09-01 00:44:22 -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,
|
2024-07-07 15:18:07 -04:00
|
|
|
) -> 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()
|
2024-07-07 15:18:07 -04:00
|
|
|
.filter_map(|room_id| {
|
|
|
|
|
room_id
|
|
|
|
|
.ok()
|
|
|
|
|
.filter(|room_id| {
|
|
|
|
|
if exclude_disabled
|
2024-07-27 00:11:41 +00:00
|
|
|
&& self
|
|
|
|
|
.services
|
2024-07-07 15:18:07 -04:00
|
|
|
.rooms
|
|
|
|
|
.metadata
|
|
|
|
|
.is_disabled(room_id)
|
|
|
|
|
.unwrap_or(false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if exclude_banned
|
2024-07-27 00:11:41 +00:00
|
|
|
&& self
|
|
|
|
|
.services
|
2024-07-07 15:18:07 -04:00
|
|
|
.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-07-07 15:18:07 -04:00
|
|
|
})
|
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!(
|
2024-09-01 00:44:22 -04:00
|
|
|
"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")
|
|
|
|
|
);
|
2024-09-01 00:44:22 -04:00
|
|
|
|
|
|
|
|
Ok(RoomMessageEventContent::notice_markdown(output_plain))
|
2024-04-20 19:55:14 -04:00
|
|
|
}
|