OneLauncher-Cracked/packages/core/src/game/metadata.rs

73 lines
No EOL
2 KiB
Rust

use interpulse::api::{minecraft::{Version, VersionInfo}, modded::LoaderVersion};
use crate::{api::ingress::{init_ingress, send_ingress_ref_opt}, error::LauncherResult, store::{ingress::{IngressRef, IngressType}, Dirs}, utils::{http::fetch_json_advanced, io}};
#[tracing::instrument]
pub async fn download_minecraft(version: &VersionInfo) -> LauncherResult<()> {
let id = init_ingress(IngressType::MinecraftDownload, "Downloading Minecraft", 100.0).await?;
// tokio::try_join! {
// }?;
Ok(())
}
#[tracing::instrument]
pub async fn download_version_info(
version: &Version,
loader: Option<&LoaderVersion>,
force: Option<bool>,
ingress_ref: Option<&IngressRef<'_>>,
) -> LauncherResult<VersionInfo> {
let version_id = loader.map_or(version.id.clone(), |it| format!("{}-{}", version.id, it.id));
let ingress_ref = ingress_ref.map(|i| i.with_increment(i.increment_by / 3.33));
let ingress_ref = ingress_ref.as_ref();
tracing::debug!("loading minecraft version info for minecraft version {version_id}");
let path = Dirs::get_version_infos_dir().await?.join(format!("{version_id}.json"));
let result = if path.exists() && !force.unwrap_or(false) {
let data = io::read(path).await?;
serde_json::from_slice(&data)?
} else {
tracing::info!(
"downloading minecraft version info for minecraft version {}",
&version_id
);
let mut info = fetch_json_advanced(
reqwest::Method::GET,
&version.url,
None,
None,
None,
ingress_ref
).await?;
if let Some(loader) = loader {
let partial: interpulse::api::modded::PartialVersionInfo = fetch_json_advanced(
reqwest::Method::GET,
&loader.url,
None,
None,
None,
ingress_ref
).await?;
info = interpulse::api::modded::merge_partial_version(partial, info);
}
info.id.clone_from(&version_id);
io::write(&path, &serde_json::to_vec(&info)?).await?;
info
};
send_ingress_ref_opt(ingress_ref).await?;
tracing::debug!("loaded minecraft version info for minecraft version {version_id}");
Ok(result)
}