veloren/server/src/settings.rs

127 lines
4.2 KiB
Rust
Raw Normal View History

use portpicker::pick_unused_port;
2019-06-29 16:41:26 +00:00
use serde_derive::{Deserialize, Serialize};
2019-07-01 09:37:17 +00:00
use std::{fs, io::prelude::*, net::SocketAddr, path::PathBuf};
use world::sim::FileOpts;
const DEFAULT_WORLD_SEED: u32 = 5284;
2019-06-29 16:41:26 +00:00
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct ServerSettings {
pub gameserver_address: SocketAddr,
pub metrics_address: SocketAddr,
2019-07-01 11:19:26 +00:00
pub max_players: usize,
2019-06-29 16:41:26 +00:00
pub world_seed: u32,
//pub pvp_enabled: bool,
2019-07-01 09:37:17 +00:00
pub server_name: String,
pub server_description: String,
2019-06-29 16:41:26 +00:00
//pub login_server: whatever
2019-07-12 13:03:35 +00:00
pub start_time: f64,
2019-08-12 14:05:58 +00:00
pub admins: Vec<String>,
/// When set to None, loads the default map file (if available); otherwise, uses the value of
/// the file options to decide how to proceed.
pub map_file: Option<FileOpts>,
2019-06-29 16:41:26 +00:00
}
impl Default for ServerSettings {
fn default() -> Self {
Self {
gameserver_address: SocketAddr::from(([0; 4], 14004)),
metrics_address: SocketAddr::from(([0; 4], 14005)),
world_seed: DEFAULT_WORLD_SEED,
server_name: "Veloren Alpha".to_owned(),
2019-07-01 09:37:17 +00:00
server_description: "This is the best Veloren server.".to_owned(),
max_players: 100,
start_time: 9.0 * 3600.0,
map_file: None,
admins: [
"Pfau",
"zesterer",
"xMAC94x",
"Timo",
"Songtronix",
"Slipped",
"Sharp",
"Acrimon",
"imbris",
"YuriMomo",
"Vechro",
"AngelOnFira",
"Nancok",
"Qutrin",
"Mckol",
2019-10-23 18:23:31 +00:00
]
.iter()
.map(|n| n.to_string())
.collect(),
2019-06-29 16:41:26 +00:00
}
}
2019-07-01 09:37:17 +00:00
}
2019-06-29 16:41:26 +00:00
impl ServerSettings {
pub fn load() -> Self {
let path = ServerSettings::get_settings_path();
if let Ok(file) = fs::File::open(path) {
2019-07-04 17:37:56 +00:00
match ron::de::from_reader(file) {
Ok(x) => x,
Err(e) => {
log::warn!("Failed to parse setting file! Fallback to default. {}", e);
Self::default()
}
}
2019-06-29 16:41:26 +00:00
} else {
2019-07-04 17:37:56 +00:00
let default_settings = Self::default();
match default_settings.save_to_file() {
Err(e) => log::error!("Failed to create default setting file! {}", e),
_ => {}
}
default_settings
2019-06-29 16:41:26 +00:00
}
}
pub fn save_to_file(&self) -> std::io::Result<()> {
let path = ServerSettings::get_settings_path();
let mut config_file = fs::File::create(path)?;
2019-10-23 18:23:31 +00:00
let s: &str = &ron::ser::to_string_pretty(self, ron::ser::PrettyConfig::default())
.expect("Failed serialize settings.");
config_file
.write_all(s.as_bytes())
.expect("Failed to write to config file.");
2019-06-29 16:41:26 +00:00
Ok(())
}
pub fn singleplayer() -> Self {
2020-01-24 02:45:29 +00:00
let load = Self::load();
Self {
//BUG: theoretically another process can grab the port between here and server creation, however the timewindow is quite small
gameserver_address: SocketAddr::from((
[127, 0, 0, 1],
pick_unused_port().expect("Failed to find unused port!"),
)),
metrics_address: SocketAddr::from((
[127, 0, 0, 1],
pick_unused_port().expect("Failed to find unused port!"),
)),
2020-01-24 02:45:29 +00:00
// If loading the default map file, make sure the seed is also default.
world_seed: if load.map_file.is_some() {
load.world_seed
} else {
DEFAULT_WORLD_SEED
},
server_name: "Singleplayer".to_owned(),
server_description: "Who needs friends anyway?".to_owned(),
max_players: 100,
start_time: 9.0 * 3600.0,
admins: vec!["singleplayer".to_string()], // TODO: Let the player choose if they want to use admin commands or not
2020-01-24 02:45:29 +00:00
..load // Fill in remaining fields from settings.ron.
}
}
2019-06-29 16:41:26 +00:00
fn get_settings_path() -> PathBuf {
PathBuf::from(r"settings.ron")
}
2019-07-01 09:37:17 +00:00
}