veloren/server-cli/src/cli.rs
2024-04-21 09:48:35 +00:00

160 lines
4.5 KiB
Rust

#![allow(
clippy::needless_pass_by_ref_mut //until we find a better way for specs
)]
use clap::Parser;
use common::comp;
use server::persistence::SqlLogMode;
use std::sync::mpsc::Sender;
use tracing::error;
#[derive(Clone, Debug, Parser)]
pub enum Admin {
/// Adds an admin
Add {
/// Name of the admin to whom to assign a role
username: String,
/// role to assign to the admin
#[arg(ignore_case = true, value_parser = clap::value_parser!(comp::AdminRole))]
role: comp::AdminRole,
},
Remove {
/// Name of the admin from whom to remove any existing roles
username: String,
},
}
#[derive(Clone, Debug, Parser)]
pub enum Shutdown {
/// Closes the server immediately
Immediate,
/// Shuts down the server gracefully
Graceful {
/// Number of seconds to wait before shutting down
seconds: u64,
#[arg(short, long, default_value = "The server is shutting down")]
/// Shutdown reason
reason: String,
},
/// Cancel any pending graceful shutdown.
Cancel,
}
#[derive(Clone, Debug, Parser)]
pub enum SharedCommand {
/// Perform operations on the admin list
Admin {
#[command(subcommand)]
command: Admin,
},
}
#[derive(Debug, Clone, Parser)]
pub enum Message {
#[command(flatten)]
Shared(SharedCommand),
/// Shut down the server (or cancel a shut down)
Shutdown {
#[command(subcommand)]
command: Shutdown,
},
/// Loads up the chunks at map center and adds a entity that mimics a
/// player to keep them from despawning
#[cfg(feature = "worldgen")]
LoadArea {
/// View distance of the loaded area
view_distance: u32,
},
/// Enable or disable sql logging
SqlLogMode {
#[arg(default_value_t, value_parser = clap::value_parser!(SqlLogMode))]
mode: SqlLogMode,
},
/// Disconnects all connected clients
DisconnectAllClients,
/// returns active player names
ListPlayers,
ListLogs,
/// sends a msg to everyone on the server
SendGlobalMsg {
msg: String,
},
}
#[derive(Debug, Clone)]
pub enum MessageReturn {
Players(Vec<String>),
Logs(Vec<String>),
}
#[derive(Parser)]
#[command(
name = "Veloren server TUI",
version = common::util::DISPLAY_VERSION_LONG.as_str(),
about = "The veloren server tui allows sending commands directly to the running server.",
author = "The veloren devs <https://gitlab.com/veloren/veloren>",
)]
#[clap(no_binary_name = true)]
pub struct TuiApp {
#[command(subcommand)]
command: Message,
}
#[derive(Debug, Clone, Copy, Parser)]
pub struct BenchParams {
/// View distance of the loaded area (in chunks)
#[arg(long)]
pub view_distance: u32,
/// Duration to run after loading completes (in seconds).
#[arg(long)]
pub duration: u32,
}
#[derive(Parser)]
pub enum ArgvCommand {
#[command(flatten)]
Shared(SharedCommand),
/// Load an area, run the server for some time, and then exit (useful for
/// profiling).
Bench(BenchParams),
}
#[derive(Parser)]
#[command(
name = "Veloren server CLI",
version = common::util::DISPLAY_VERSION_LONG.as_str(),
about = "The veloren server cli provides an easy to use interface to start a veloren server.",
author = "The veloren devs <https://gitlab.com/veloren/veloren>",
)]
pub struct ArgvApp {
#[arg(long, short)]
/// Enables the tui
pub tui: bool,
#[arg(long, short)]
/// Doesn't listen on STDIN
///
/// Useful if you want to send the server in background, and your kernels
/// terminal driver will send SIGTTIN to it otherwise. (https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections) and you dont want to use `stty -tostop`
/// or `nohub` or `tmux` or `screen` or `<<< \"\\004\"` to the program.
pub non_interactive: bool,
#[arg(long)]
/// Run without auth enabled
pub no_auth: bool,
#[arg(default_value_t, long, short, value_parser = clap::value_parser!(SqlLogMode))]
/// Enables SQL logging
pub sql_log_mode: SqlLogMode,
#[command(subcommand)]
pub command: Option<ArgvCommand>,
}
pub fn parse_command(input: &str, msg_s: &mut Sender<Message>) {
match TuiApp::try_parse_from(shell_words::split(input).unwrap_or_default()) {
Ok(message) => {
msg_s
.send(message.command)
.unwrap_or_else(|e| error!(?e, "Failed to send CLI message"));
},
Err(e) => error!("{}", e),
}
}