Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 52 additions & 3 deletions core/src/implementations/minecraft/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ pub struct SetupConfig {
pub version: String,
pub flavour: Flavour,
pub port: u32,
pub existing_server_path: Option<String>,
pub cmd_args: Vec<String>,
pub description: Option<String>,
pub min_ram: Option<u32>,
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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| {
Expand Down