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

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

152 lines
5.1 KiB
Rust
Raw Normal View History

2024-05-23 01:27:04 -04:00
use std::fmt::Write;
2024-03-22 03:37:55 -07:00
use ruma::{events::room::message::RoomMessageEventContent, RoomAliasId};
2024-03-22 03:37:55 -07:00
2024-04-20 19:55:14 -04:00
use super::RoomAliasCommand;
2024-05-09 15:59:08 -07:00
use crate::{escape_html, services, Result};
2024-03-22 03:37:55 -07:00
pub(super) async fn process(command: RoomAliasCommand, _body: Vec<&str>) -> Result<RoomMessageEventContent> {
let server_user = &services().globals.server_user;
2024-06-12 01:42:39 -04:00
2024-03-22 03:37:55 -07:00
match command {
RoomAliasCommand::Set {
ref room_alias_localpart,
..
}
| RoomAliasCommand::Remove {
ref room_alias_localpart,
}
| RoomAliasCommand::Which {
ref room_alias_localpart,
} => {
let room_alias_str = format!("#{}:{}", room_alias_localpart, services().globals.server_name());
let room_alias = match RoomAliasId::parse_box(room_alias_str) {
Ok(alias) => alias,
2024-06-02 00:15:02 +00:00
Err(err) => return Ok(RoomMessageEventContent::text_plain(format!("Failed to parse alias: {err}"))),
2024-03-22 03:37:55 -07:00
};
match command {
RoomAliasCommand::Set {
force,
room_id,
..
} => match (force, services().rooms.alias.resolve_local_alias(&room_alias)) {
2024-06-12 01:42:39 -04:00
(true, Ok(Some(id))) => match services()
.rooms
.alias
.set_alias(&room_alias, &room_id, server_user)
2024-06-12 01:42:39 -04:00
{
2024-03-22 03:37:55 -07:00
Ok(()) => Ok(RoomMessageEventContent::text_plain(format!(
2024-06-02 00:15:02 +00:00
"Successfully overwrote alias (formerly {id})"
2024-03-22 03:37:55 -07:00
))),
2024-06-02 00:15:02 +00:00
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Failed to remove alias: {err}"))),
2024-03-22 03:37:55 -07:00
},
(false, Ok(Some(id))) => Ok(RoomMessageEventContent::text_plain(format!(
2024-06-02 00:15:02 +00:00
"Refusing to overwrite in use alias for {id}, use -f or --force to overwrite"
2024-03-22 03:37:55 -07:00
))),
2024-06-12 01:42:39 -04:00
(_, Ok(None)) => match services()
.rooms
.alias
.set_alias(&room_alias, &room_id, server_user)
2024-06-12 01:42:39 -04:00
{
2024-03-22 03:37:55 -07:00
Ok(()) => Ok(RoomMessageEventContent::text_plain("Successfully set alias")),
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Failed to remove alias: {err}"))),
},
(_, Err(err)) => Ok(RoomMessageEventContent::text_plain(format!("Unable to lookup alias: {err}"))),
},
RoomAliasCommand::Remove {
..
} => match services().rooms.alias.resolve_local_alias(&room_alias) {
2024-06-12 01:42:39 -04:00
Ok(Some(id)) => match services()
.rooms
.alias
.remove_alias(&room_alias, server_user)
2024-06-12 01:42:39 -04:00
.await
{
2024-06-02 00:15:02 +00:00
Ok(()) => Ok(RoomMessageEventContent::text_plain(format!("Removed alias from {id}"))),
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Failed to remove alias: {err}"))),
2024-03-22 03:37:55 -07:00
},
Ok(None) => Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
2024-06-02 00:15:02 +00:00
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Unable to lookup alias: {err}"))),
2024-03-22 03:37:55 -07:00
},
RoomAliasCommand::Which {
..
} => match services().rooms.alias.resolve_local_alias(&room_alias) {
2024-06-02 00:15:02 +00:00
Ok(Some(id)) => Ok(RoomMessageEventContent::text_plain(format!("Alias resolves to {id}"))),
2024-03-22 03:37:55 -07:00
Ok(None) => Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
2024-06-02 00:15:02 +00:00
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Unable to lookup alias: {err}"))),
2024-03-22 03:37:55 -07:00
},
RoomAliasCommand::List {
..
} => unreachable!(),
}
},
RoomAliasCommand::List {
room_id,
} => {
if let Some(room_id) = room_id {
2024-03-25 17:05:11 -04:00
let aliases = services()
.rooms
.alias
.local_aliases_for_room(&room_id)
.collect::<Result<Vec<_>, _>>();
2024-03-22 03:37:55 -07:00
match aliases {
Ok(aliases) => {
let plain_list = aliases.iter().fold(String::new(), |mut output, alias| {
2024-05-23 01:27:04 -04:00
writeln!(output, "- {alias}").expect("should be able to write to string buffer");
2024-03-22 03:37:55 -07:00
output
});
let html_list = aliases.iter().fold(String::new(), |mut output, alias| {
2024-05-23 01:27:04 -04:00
writeln!(output, "<li>{}</li>", escape_html(alias.as_ref()))
.expect("should be able to write to string buffer");
2024-03-22 03:37:55 -07:00
output
});
let plain = format!("Aliases for {room_id}:\n{plain_list}");
let html = format!("Aliases for {room_id}:\n<ul>{html_list}</ul>");
Ok(RoomMessageEventContent::text_html(plain, html))
},
2024-06-02 00:15:02 +00:00
Err(err) => Ok(RoomMessageEventContent::text_plain(format!("Unable to list aliases: {err}"))),
2024-03-22 03:37:55 -07:00
}
} else {
2024-03-25 17:05:11 -04:00
let aliases = services()
.rooms
.alias
.all_local_aliases()
.collect::<Result<Vec<_>, _>>();
2024-03-22 03:37:55 -07:00
match aliases {
Ok(aliases) => {
let server_name = services().globals.server_name();
2024-03-25 17:05:11 -04:00
let plain_list = aliases
.iter()
.fold(String::new(), |mut output, (alias, id)| {
2024-05-23 01:27:04 -04:00
writeln!(output, "- `{alias}` -> #{id}:{server_name}")
.expect("should be able to write to string buffer");
2024-03-25 17:05:11 -04:00
output
});
2024-03-22 03:37:55 -07:00
2024-03-25 17:05:11 -04:00
let html_list = aliases
.iter()
.fold(String::new(), |mut output, (alias, id)| {
writeln!(
output,
"<li><code>{}</code> -> #{}:{}</li>",
escape_html(alias.as_ref()),
escape_html(id.as_ref()),
server_name
)
2024-05-23 01:27:04 -04:00
.expect("should be able to write to string buffer");
2024-03-25 17:05:11 -04:00
output
});
2024-03-22 03:37:55 -07:00
let plain = format!("Aliases:\n{plain_list}");
let html = format!("Aliases:\n<ul>{html_list}</ul>");
Ok(RoomMessageEventContent::text_html(plain, html))
},
Err(e) => Ok(RoomMessageEventContent::text_plain(format!("Unable to list room aliases: {e}"))),
}
}
},
}
}