Skip to content
Open
Show file tree
Hide file tree
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
12 changes: 9 additions & 3 deletions src-tauri/src/instance/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -928,7 +928,10 @@ pub async fn create_instance(

// Download version info
let mut version_info = client
.get(&game.url)
.get(&game.url.replace(
"zkitefly.github.io/unlisted-versions-of-minecraft",
"alist.8mi.tech/d/mirror/unlisted-versions-of-minecraft/Auto",
))
.send()
.await
.map_err(|_| InstanceError::NetworkError)?
Expand Down Expand Up @@ -956,8 +959,11 @@ pub async fn create_instance(
.ok_or(InstanceError::ClientJsonParseError)?;

task_params.push(PTaskParam::Download(DownloadParam {
src: Url::parse(&client_download_info.url.clone())
.map_err(|_| InstanceError::ClientJsonParseError)?,
src: Url::parse(&client_download_info.url.replace(
"zkitefly.github.io/unlisted-versions-of-minecraft",
"alist.8mi.tech/d/mirror/unlisted-versions-of-minecraft/Auto",
))
.map_err(|_| InstanceError::ClientJsonParseError)?,
dest: instance.version_path.join(format!("{}.jar", name)),
filename: None,
sha1: Some(client_download_info.sha1.clone()),
Expand Down
4 changes: 3 additions & 1 deletion src-tauri/src/instance/helpers/client_json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use regex::RegexBuilder;
use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
use serde_with::formats::PreferMany;
use serde_with::{serde_as, OneOrMany};
use serde_with::{serde_as, DisplayFromStr, OneOrMany, PickFirst};
use serialize_skip_none_derive::serialize_skip_none;
use std::cmp::Ordering;
use std::collections::HashMap;
Expand Down Expand Up @@ -236,10 +236,12 @@ pub struct AssetIndexInfo {
pub url: String,
}

#[serde_as]
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
#[serde(rename_all = "camelCase", default)]
pub struct DownloadsValue {
pub sha1: String,
#[serde_as(as = "PickFirst<(_, DisplayFromStr)>")]
pub size: i64,
pub url: String,
}
Expand Down
33 changes: 30 additions & 3 deletions src-tauri/src/resource/helpers/version_manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ use serde::{Deserialize, Serialize};
use std::fs;
use tauri::{AppHandle, Manager};
use tauri_plugin_http::reqwest;
use url::Url;

#[derive(Serialize, Deserialize, Default)]
struct VersionManifest {
#[serde(default)]
pub latest: LatestVersion,
pub versions: Vec<GameResource>,
}
Expand Down Expand Up @@ -47,18 +49,31 @@ pub async fn get_game_version_manifest(
Err(_) => return Err(ResourceError::ParseError.into()),
};

save_version_list_to_cache(app, &manifest.versions);
let unlisted_url = Url::parse(
"https://alist.8mi.tech/d/mirror/unlisted-versions-of-minecraft/Auto/version_manifest.json",
)
.or_else(|_| {
Url::parse("https://zkitefly.github.io/unlisted-versions-of-minecraft/version_manifest.json")
})?;
let unlisted_response = client.get(unlisted_url).send().await?;
let unlisted_manifest = unlisted_response.json::<VersionManifest>().await?;

let merged_manifest = merge_manifests(manifest, unlisted_manifest);

save_version_list_to_cache(app, &merged_manifest.versions);
// update list saved in cache dir, may be used in version compare.

let game_info_list = manifest
let game_info_list = merged_manifest
.versions
.into_iter()
.map(|info| {
let april_fool = info.release_time.contains("04-01");
let april_fool = info.release_time.contains("04-01") || info.id.contains("point");
GameClientResourceInfo {
id: info.id,
game_type: if april_fool {
"april_fools".to_string()
} else if info.game_type == "pending" {
"snapshot".to_string()
} else {
info.game_type
},
Expand All @@ -74,6 +89,18 @@ pub async fn get_game_version_manifest(
Err(ResourceError::NetworkError.into())
}

fn merge_manifests(a: VersionManifest, b: VersionManifest) -> VersionManifest {
let mut versions = a.versions;
versions.extend(b.versions);

versions.sort_by(|x, y| y.release_time.cmp(&x.release_time));

VersionManifest {
latest: a.latest,
versions,
}
}

fn save_version_list_to_cache(app: &AppHandle, versions: &[GameResource]) {
let cache_dir = match app.path().app_cache_dir().ok() {
Some(dir) => dir,
Expand Down
Loading