diff --git a/core/src/implementations/minecraft/mod.rs b/core/src/implementations/minecraft/mod.rs index 8a4e04e2..2c29232f 100644 --- a/core/src/implementations/minecraft/mod.rs +++ b/core/src/implementations/minecraft/mod.rs @@ -144,6 +144,7 @@ pub struct SetupConfig { pub version: String, pub flavour: Flavour, pub port: u32, + pub existing_server_path: Option, pub cmd_args: Vec, pub description: Option, pub min_ram: Option, @@ -247,6 +248,17 @@ impl MinecraftInstance { true, ); + let existing_server_path_setting = SettingManifest::new_value_with_type( + "existing_server_path".to_string(), + "Existing Server Path".to_string(), + "Optionally specify path to an existing server to import into lodestone".to_string(), + None, + ConfigurableValueType::String { regex: None }, + None, + false, + true, + ); + let min_ram_setting = SettingManifest::new_required_value( "min_ram".to_string(), "Minimum RAM".to_string(), @@ -282,6 +294,7 @@ impl MinecraftInstance { section_1_map.insert("version".to_string(), version_setting); section_1_map.insert("port".to_string(), port_setting); + section_1_map.insert("existing_server_path".to_string(), existing_server_path_setting); let mut section_2_map = IndexMap::new(); @@ -344,6 +357,13 @@ impl MinecraftInstance { .try_as_unsigned_integer() .unwrap(); + let existing_server_path = setup_value + .get_unique_setting("existing_server_path") + .unwrap() + .get_value() + .map(|v| v.try_as_string().unwrap()) + .cloned(); + let min_ram = setup_value .get_unique_setting("min_ram") .unwrap() @@ -375,6 +395,7 @@ impl MinecraftInstance { description, version: version.clone(), port, + existing_server_path, min_ram: Some(min_ram), max_ram: Some(max_ram), cmd_args, @@ -449,15 +470,43 @@ impl MinecraftInstance { "1/4: Creating directories", 1.0, )); - tokio::fs::create_dir_all(&path_to_instance) - .await + if let Some(existing_server_path) = config.existing_server_path { + if !existing_server_path.trim().is_empty() { + let existing_server_path = std::path::Path::new(&existing_server_path); + fs_extra::dir::copy(existing_server_path, &path_to_instance, &fs_extra::dir::CopyOptions::new().content_only(true)) + .context("Could not copy existing server for instance") + .map_err(|e| { + error!("{e}"); + e + })?; + Ok(()) + } else { + tokio::fs::create_dir_all(&path_to_instance).await + } + } else { + tokio::fs::create_dir_all(&path_to_instance).await + } .and(tokio::fs::create_dir_all(&path_to_macros).await) .and(tokio::fs::create_dir_all(&path_to_resources.join("mods")).await) .and(tokio::fs::create_dir_all(&path_to_resources.join("worlds")).await) .and(tokio::fs::create_dir_all(&path_to_resources.join("defaults")).await) .and(tokio::fs::write(&path_to_eula, "#generated by Lodestone\neula=true").await) .and( - tokio::fs::write(&path_to_properties, format!("server-port={}", config.port)).await, + tokio::fs::write(&path_to_properties, + if let Ok(contents) = tokio::fs::read(&path_to_properties).await { + let contents = String::from_utf8_lossy(&contents); + if contents.contains("server-port") { + fancy_regex::Regex::new(r"server-port=[0-9]*") + .unwrap() + .replace_all(&contents, format!("server-port={}", config.port)) + .to_string() + } else { + format!("{}\nserver-port={}", contents, config.port) + } + } else { + format!("server-port={}", config.port) + } + ).await ) .context("Could not create some files or directories for instance") .map_err(|e| {