You've already forked AstralRinth
forked from didirus/AstralRinth
* Add launcher_feature_version to Profile * Misc fixes - Add typing to theme and settings stuff - Push instance route on creation from installing a modpack - Fixed servers not reloading properly when first added * Make old instances scan the logs folder for joined servers on launcher startup * Create AttachedWorldData * Change AttachedWorldData interface * Rename WorldType::World to WorldType::Singleplayer * Implement world display status system * Fix Minecraft font * Fix set_world_display_status Tauri error * Add 'Play instance' option * Add option to disable worlds showing in Home * Fixes - Fix available server filter only showing if there are some available - Fixed server and singleplayer filters sometimes showing when there are only servers or singleplayer worlds - Fixed new worlds not being automatically added when detected - Rephrased Jump back into worlds option description * Fixed sometimes more than 6 items showing up in Jump back in * Fix servers.dat issue with instances you haven't played before * Update a bunch of app dependencies in non-breaking ways * Update dependencies in app-lib that had breaking updates * Update dependencies in app that had breaking updates * Fix too large of bulk requests being made, limit max to 800 #3430 * Also update tauri-plugin-opener * Update app-lib to Rust 2024 * Non-breaking updates in ariadne * Breaking updates in ariadne * Ariadne Rust 2024 * Add hiding from home page, add types to Mods.vue * Make recent worlds go into grid when display is huge * Fix lint * Remove redundant media query * Fix protocol version on home page, and home page being blocked by pinging servers * Clippy fix in app-lib * Clippy fix in app * Clippy fix * More Clippy fixes * Fix Prettier lints * Undo `from_string` changes * Update macos dependencies * Apply updates to app-playground as well * Update Wry + Tauri * Update sysinfo * Update theseus_gui to Rust 2024 * Downgrade rand in ariadne to fix labrinth Labrinth can't use rand 0.9 due to argon2 * Cargo format --------- Signed-off-by: Josiah Glosson <soujournme@gmail.com> Co-authored-by: Prospector <prospectordev@gmail.com> Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> Co-authored-by: Alejandro González <me@alegon.dev>
118 lines
3.5 KiB
Rust
118 lines
3.5 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::{State, prelude::ModLoader, state::ProfileInstallStage, util::io};
|
|
|
|
use super::{copy_dotminecraft, recache_icon};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct GDLauncherConfig {
|
|
pub background: Option<String>,
|
|
pub loader: GDLauncherLoader,
|
|
// pub mods: Vec<GDLauncherMod>,
|
|
}
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct GDLauncherLoader {
|
|
pub loader_type: ModLoader,
|
|
pub loader_version: Option<String>,
|
|
pub mc_version: String,
|
|
pub source: Option<String>,
|
|
pub source_name: Option<String>,
|
|
}
|
|
|
|
// Check if folder has a config.json that parses
|
|
pub async fn is_valid_gdlauncher(instance_folder: PathBuf) -> bool {
|
|
let config: String =
|
|
io::read_to_string(&instance_folder.join("config.json"))
|
|
.await
|
|
.unwrap_or("".to_string());
|
|
let config: Result<GDLauncherConfig, serde_json::Error> =
|
|
serde_json::from_str::<GDLauncherConfig>(&config);
|
|
config.is_ok()
|
|
}
|
|
|
|
pub async fn import_gdlauncher(
|
|
gdlauncher_instance_folder: PathBuf, // instance's folder
|
|
profile_path: &str, // path to profile
|
|
) -> crate::Result<()> {
|
|
// Load config.json
|
|
let config: String =
|
|
io::read_to_string(&gdlauncher_instance_folder.join("config.json"))
|
|
.await?;
|
|
let config: GDLauncherConfig =
|
|
serde_json::from_str::<GDLauncherConfig>(&config)?;
|
|
let override_title: Option<String> = config.loader.source_name.clone();
|
|
let backup_name = format!(
|
|
"GDLauncher-{}",
|
|
gdlauncher_instance_folder
|
|
.file_name()
|
|
.map(|a| a.to_string_lossy().to_string())
|
|
.unwrap_or("Unknown".to_string())
|
|
);
|
|
|
|
// Re-cache icon
|
|
let icon = config
|
|
.background
|
|
.clone()
|
|
.map(|b| gdlauncher_instance_folder.join(b));
|
|
let icon = if let Some(icon) = icon {
|
|
recache_icon(icon).await?
|
|
} else {
|
|
None
|
|
};
|
|
|
|
let game_version = config.loader.mc_version;
|
|
let mod_loader = config.loader.loader_type;
|
|
let loader_version = config.loader.loader_version;
|
|
|
|
let loader_version = if mod_loader != ModLoader::Vanilla {
|
|
crate::launcher::get_loader_version_from_profile(
|
|
&game_version,
|
|
mod_loader,
|
|
loader_version.as_deref(),
|
|
)
|
|
.await?
|
|
} else {
|
|
None
|
|
};
|
|
|
|
// Set profile data to created default profile
|
|
crate::api::profile::edit(profile_path, |prof| {
|
|
prof.name = override_title
|
|
.clone()
|
|
.unwrap_or_else(|| backup_name.to_string());
|
|
prof.install_stage = ProfileInstallStage::PackInstalling;
|
|
prof.icon_path = icon.clone().map(|x| x.to_string_lossy().to_string());
|
|
prof.game_version.clone_from(&game_version);
|
|
prof.loader_version = loader_version.clone().map(|x| x.id);
|
|
prof.loader = mod_loader;
|
|
|
|
async { Ok(()) }
|
|
})
|
|
.await?;
|
|
|
|
// Copy in contained folders as overrides
|
|
let state = State::get().await?;
|
|
let loading_bar = copy_dotminecraft(
|
|
profile_path,
|
|
gdlauncher_instance_folder,
|
|
&state.io_semaphore,
|
|
None,
|
|
)
|
|
.await?;
|
|
|
|
if let Some(profile_val) = crate::api::profile::get(profile_path).await? {
|
|
crate::launcher::install_minecraft(
|
|
&profile_val,
|
|
Some(loading_bar),
|
|
false,
|
|
)
|
|
.await?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|