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

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

57 lines
1.5 KiB
Rust
Raw Normal View History

2024-05-23 01:27:04 -04:00
use std::fmt::Write;
2024-04-20 19:55:14 -04:00
use ruma::{events::room::message::RoomMessageEventContent, OwnedRoomId};
2024-05-09 15:59:08 -07:00
use crate::{escape_html, get_room_info, handler::PAGE_SIZE, services, Result};
2024-04-20 19:55:14 -04:00
2024-04-22 23:48:57 -04:00
pub(crate) async fn list(_body: Vec<&str>, page: Option<usize>) -> 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);
let mut rooms = services()
.rooms
.metadata
.iter_ids()
.filter_map(Result::ok)
.map(|id: OwnedRoomId| get_room_info(&id))
.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{}",
rooms
.iter()
.map(|(id, members, name)| format!("{id}\tMembers: {members}\tName: {name}"))
.collect::<Vec<_>>()
.join("\n")
);
let output_html = format!(
"<table><caption>Room list - page \
{page}</caption>\n<tr><th>id</th>\t<th>members</th>\t<th>name</th></tr>\n{}</table>",
rooms
.iter()
.fold(String::new(), |mut output, (id, members, name)| {
writeln!(
output,
"<tr><td>{}</td>\t<td>{}</td>\t<td>{}</td></tr>",
escape_html(id.as_ref()),
members,
escape_html(name)
)
2024-05-23 01:27:04 -04:00
.expect("should be able to write to string buffer");
2024-04-20 19:55:14 -04:00
output
})
);
Ok(RoomMessageEventContent::text_html(output_plain, output_html))
}