adminroom: cmds to view room topic and room members
this will be extended more Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
parent
65fbb80145
commit
305dfc3b42
2 changed files with 117 additions and 0 deletions
|
@ -7,6 +7,7 @@ use crate::Result;
|
||||||
pub(crate) mod room_alias_commands;
|
pub(crate) mod room_alias_commands;
|
||||||
pub(crate) mod room_commands;
|
pub(crate) mod room_commands;
|
||||||
pub(crate) mod room_directory_commands;
|
pub(crate) mod room_directory_commands;
|
||||||
|
pub(crate) mod room_info_commands;
|
||||||
pub(crate) mod room_moderation_commands;
|
pub(crate) mod room_moderation_commands;
|
||||||
|
|
||||||
#[cfg_attr(test, derive(Debug))]
|
#[cfg_attr(test, derive(Debug))]
|
||||||
|
@ -17,6 +18,10 @@ pub(crate) enum RoomCommand {
|
||||||
page: Option<usize>,
|
page: Option<usize>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#[command(subcommand)]
|
||||||
|
/// - View information about a room we know about
|
||||||
|
Info(RoomInfoCommand),
|
||||||
|
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
/// - Manage moderation of remote or local rooms
|
/// - Manage moderation of remote or local rooms
|
||||||
Moderation(RoomModerationCommand),
|
Moderation(RoomModerationCommand),
|
||||||
|
@ -30,6 +35,23 @@ pub(crate) enum RoomCommand {
|
||||||
Directory(RoomDirectoryCommand),
|
Directory(RoomDirectoryCommand),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(test, derive(Debug))]
|
||||||
|
#[derive(Subcommand)]
|
||||||
|
pub(crate) enum RoomInfoCommand {
|
||||||
|
/// - List joined members in a room
|
||||||
|
ListJoinedMembers {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
|
||||||
|
/// - Displays room topic
|
||||||
|
///
|
||||||
|
/// Room topics can be huge, so this is in its
|
||||||
|
/// own separate command
|
||||||
|
ViewRoomTopic {
|
||||||
|
room_id: Box<RoomId>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg_attr(test, derive(Debug))]
|
#[cfg_attr(test, derive(Debug))]
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
pub(crate) enum RoomAliasCommand {
|
pub(crate) enum RoomAliasCommand {
|
||||||
|
@ -147,6 +169,8 @@ pub(crate) enum RoomModerationCommand {
|
||||||
|
|
||||||
pub(crate) async fn process(command: RoomCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> {
|
pub(crate) async fn process(command: RoomCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> {
|
||||||
Ok(match command {
|
Ok(match command {
|
||||||
|
RoomCommand::Info(command) => room_info_commands::process(command, body).await?,
|
||||||
|
|
||||||
RoomCommand::Alias(command) => room_alias_commands::process(command, body).await?,
|
RoomCommand::Alias(command) => room_alias_commands::process(command, body).await?,
|
||||||
|
|
||||||
RoomCommand::Directory(command) => room_directory_commands::process(command, body).await?,
|
RoomCommand::Directory(command) => room_directory_commands::process(command, body).await?,
|
||||||
|
|
93
src/admin/room/room_info_commands.rs
Normal file
93
src/admin/room/room_info_commands.rs
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
use ruma::{events::room::message::RoomMessageEventContent, RoomId};
|
||||||
|
use service::services;
|
||||||
|
|
||||||
|
use super::RoomInfoCommand;
|
||||||
|
use crate::{escape_html, Result};
|
||||||
|
|
||||||
|
pub(crate) async fn process(command: RoomInfoCommand, body: Vec<&str>) -> Result<RoomMessageEventContent> {
|
||||||
|
match command {
|
||||||
|
RoomInfoCommand::ListJoinedMembers {
|
||||||
|
room_id,
|
||||||
|
} => list_joined_members(body, room_id).await,
|
||||||
|
RoomInfoCommand::ViewRoomTopic {
|
||||||
|
room_id,
|
||||||
|
} => view_room_topic(body, room_id).await,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn list_joined_members(_body: Vec<&str>, room_id: Box<RoomId>) -> Result<RoomMessageEventContent> {
|
||||||
|
let room_name = services()
|
||||||
|
.rooms
|
||||||
|
.state_accessor
|
||||||
|
.get_name(&room_id)
|
||||||
|
.ok()
|
||||||
|
.flatten()
|
||||||
|
.unwrap_or_else(|| room_id.to_string());
|
||||||
|
|
||||||
|
let members = services()
|
||||||
|
.rooms
|
||||||
|
.state_cache
|
||||||
|
.room_members(&room_id)
|
||||||
|
.filter_map(Result::ok);
|
||||||
|
|
||||||
|
let member_info = members
|
||||||
|
.into_iter()
|
||||||
|
.map(|user_id| {
|
||||||
|
(
|
||||||
|
user_id.clone(),
|
||||||
|
services()
|
||||||
|
.users
|
||||||
|
.displayname(&user_id)
|
||||||
|
.unwrap_or(None)
|
||||||
|
.unwrap_or_else(|| user_id.to_string()),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let output_plain = format!(
|
||||||
|
"{} Members in Room \"{}\":\n```\n{}\n```",
|
||||||
|
member_info.len(),
|
||||||
|
room_name,
|
||||||
|
member_info
|
||||||
|
.iter()
|
||||||
|
.map(|(mxid, displayname)| format!("{mxid} | {displayname}"))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("\n")
|
||||||
|
);
|
||||||
|
|
||||||
|
let output_html = format!(
|
||||||
|
"<table><caption>{} Members in Room \"{}\" </caption>\n<tr><th>MXID</th>\t<th>Display \
|
||||||
|
Name</th></tr>\n{}</table>",
|
||||||
|
member_info.len(),
|
||||||
|
room_name,
|
||||||
|
member_info
|
||||||
|
.iter()
|
||||||
|
.fold(String::new(), |mut output, (mxid, displayname)| {
|
||||||
|
writeln!(
|
||||||
|
output,
|
||||||
|
"<tr><td>{}</td>\t<td>{}</td></tr>",
|
||||||
|
mxid,
|
||||||
|
escape_html(displayname.as_ref())
|
||||||
|
)
|
||||||
|
.expect("should be able to write to string buffer");
|
||||||
|
output
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(output_plain, output_html))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn view_room_topic(_body: Vec<&str>, room_id: Box<RoomId>) -> Result<RoomMessageEventContent> {
|
||||||
|
let Some(room_topic) = services().rooms.state_accessor.get_room_topic(&room_id)? else {
|
||||||
|
return Ok(RoomMessageEventContent::text_plain("Room does not have a room topic set."));
|
||||||
|
};
|
||||||
|
|
||||||
|
let output_html = format!("<p>Room topic:</p>\n<hr>\n{}<hr>", escape_html(&room_topic));
|
||||||
|
|
||||||
|
Ok(RoomMessageEventContent::text_html(
|
||||||
|
format!("Room topic:\n\n```{room_topic}\n```"),
|
||||||
|
output_html,
|
||||||
|
))
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue