add exclude_disabled and exclude_banned room list admin cmd arguments

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-07-07 15:18:07 -04:00 committed by June 🍓🦴
parent 0fa6976d86
commit 192c1e08da
2 changed files with 43 additions and 5 deletions

View file

@ -16,6 +16,14 @@ pub(super) enum RoomCommand {
/// - List all rooms the server knows about /// - List all rooms the server knows about
List { List {
page: Option<usize>, page: Option<usize>,
/// Excludes rooms that we have federation disabled with
#[arg(long)]
exclude_disabled: bool,
/// Excludes rooms that we have banned
#[arg(long)]
exclude_banned: bool,
}, },
#[command(subcommand)] #[command(subcommand)]
@ -179,6 +187,8 @@ pub(super) async fn process(command: RoomCommand, body: Vec<&str>) -> Result<Roo
RoomCommand::List { RoomCommand::List {
page, page,
} => list(body, page).await?, exclude_disabled,
exclude_banned,
} => list(body, page, exclude_disabled, exclude_banned).await?,
}) })
} }

View file

@ -1,18 +1,46 @@
use std::fmt::Write; use std::fmt::Write;
use ruma::{events::room::message::RoomMessageEventContent, OwnedRoomId}; use ruma::events::room::message::RoomMessageEventContent;
use crate::{escape_html, get_room_info, handler::PAGE_SIZE, services, Result}; use crate::{escape_html, get_room_info, handler::PAGE_SIZE, services, Result};
pub(super) async fn list(_body: Vec<&str>, page: Option<usize>) -> Result<RoomMessageEventContent> { pub(super) async fn list(
_body: Vec<&str>, page: Option<usize>, exclude_disabled: bool, exclude_banned: bool,
) -> Result<RoomMessageEventContent> {
// TODO: i know there's a way to do this with clap, but i can't seem to find it // 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); let page = page.unwrap_or(1);
let mut rooms = services() let mut rooms = services()
.rooms .rooms
.metadata .metadata
.iter_ids() .iter_ids()
.filter_map(Result::ok) .filter_map(|room_id| {
.map(|id: OwnedRoomId| get_room_info(&id)) room_id
.ok()
.filter(|room_id| {
if exclude_disabled
&& services()
.rooms
.metadata
.is_disabled(room_id)
.unwrap_or(false)
{
return false;
}
if exclude_banned
&& services()
.rooms
.metadata
.is_banned(room_id)
.unwrap_or(false)
{
return false;
}
true
})
.map(|room_id| get_room_info(&room_id))
})
.collect::<Vec<_>>(); .collect::<Vec<_>>();
rooms.sort_by_key(|r| r.1); rooms.sort_by_key(|r| r.1);
rooms.reverse(); rooms.reverse();