Add !admin space roles subcommands: list, add, remove, assign, revoke, require, unrequire, user, room, enable, disable, status. The remove command uses cascade_remove_role macro to deduplicate member and room cleanup loops. Role definitions, assignments, and room requirements are managed via state events.
103 lines
2.7 KiB
Rust
103 lines
2.7 KiB
Rust
use clap::Parser;
|
|
use conduwuit::Result;
|
|
|
|
use crate::{
|
|
appservice::{self, AppserviceCommand},
|
|
check::{self, CheckCommand},
|
|
context::Context,
|
|
debug::{self, DebugCommand},
|
|
federation::{self, FederationCommand},
|
|
media::{self, MediaCommand},
|
|
query::{self, QueryCommand},
|
|
room::{self, RoomCommand},
|
|
server::{self, ServerCommand},
|
|
space::{self, SpaceCommand},
|
|
token::{self, TokenCommand},
|
|
user::{self, UserCommand},
|
|
};
|
|
|
|
#[derive(Debug, Parser)]
|
|
#[command(name = conduwuit_core::name(), version = conduwuit_core::version())]
|
|
pub enum AdminCommand {
|
|
#[command(subcommand)]
|
|
/// Commands for managing appservices
|
|
Appservices(AppserviceCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing local users
|
|
Users(UserCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing registration tokens
|
|
Token(TokenCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing rooms
|
|
Rooms(RoomCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing space permissions
|
|
Spaces(SpaceCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing federation
|
|
Federation(FederationCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing the server
|
|
Server(ServerCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for managing media
|
|
Media(MediaCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for checking integrity
|
|
Check(CheckCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Commands for debugging things
|
|
Debug(DebugCommand),
|
|
|
|
#[command(subcommand)]
|
|
/// Low-level queries for database getters and iterators
|
|
Query(QueryCommand),
|
|
}
|
|
|
|
#[tracing::instrument(skip_all, name = "command", level = "info")]
|
|
pub(super) async fn process(command: AdminCommand, context: &Context<'_>) -> Result {
|
|
use AdminCommand::*;
|
|
|
|
match command {
|
|
| Appservices(command) => {
|
|
// appservice commands are all restricted
|
|
context.bail_restricted()?;
|
|
appservice::process(command, context).await
|
|
},
|
|
| Media(command) => media::process(command, context).await,
|
|
| Users(command) => {
|
|
// user commands are all restricted
|
|
context.bail_restricted()?;
|
|
user::process(command, context).await
|
|
},
|
|
| Token(command) => {
|
|
// token commands are all restricted
|
|
context.bail_restricted()?;
|
|
token::process(command, context).await
|
|
},
|
|
| Rooms(command) => room::process(command, context).await,
|
|
| Spaces(command) => {
|
|
context.bail_restricted()?;
|
|
space::process(command, context).await
|
|
},
|
|
| Federation(command) => federation::process(command, context).await,
|
|
| Server(command) => server::process(command, context).await,
|
|
| Debug(command) => debug::process(command, context).await,
|
|
| Query(command) => {
|
|
// query commands are all restricted
|
|
context.bail_restricted()?;
|
|
query::process(command, context).await
|
|
},
|
|
| Check(command) => check::process(command, context).await,
|
|
}
|
|
}
|