diff --git a/packages/oneclient_app/src/components/active_cluster_panel.rs b/packages/oneclient_app/src/components/active_cluster_panel.rs index a9b99308..773865f7 100644 --- a/packages/oneclient_app/src/components/active_cluster_panel.rs +++ b/packages/oneclient_app/src/components/active_cluster_panel.rs @@ -4,7 +4,11 @@ use freya::query::QueryStateData; use freya::router::RouterContext; use crate::components::{Button, Icon, IconType}; -use crate::hooks::{use_active_cluster_id, use_clusters, use_dispatch, use_game_snapshot}; +use oneclient_core::parse_mc_version; + +use crate::hooks::{ + use_active_cluster_id, use_clusters, use_dispatch, use_game_snapshot, use_version_metadata, +}; use crate::routes::Route; use crate::theme::colors; use crate::utils::sort_clusters_for_home; @@ -56,6 +60,13 @@ impl Component for ActiveClusterPanel { let p = intro.get().value(); let slide_x = (p - 1.0) * 48.0; + let parsed = active.as_ref().and_then(|c| parse_mc_version(&c.mc_version)); + let metadata = use_version_metadata( + parsed.as_ref().map(|p| p.major), + parsed.and_then(|p| p.minor), + active.as_ref().map(|c| c.mc_loader), + ); + let Some(cluster) = active else { return rect() .vertical() @@ -70,7 +81,9 @@ impl Component for ActiveClusterPanel { }; let title = format!("{} {}", cluster.mc_version, cluster.mc_loader); - let subtitle = cluster.name.clone(); + let subtitle = metadata + .map(|m| m.name) + .unwrap_or_else(|| cluster.name.clone()); let cluster_id = cluster.id; rect() diff --git a/packages/oneclient_app/src/hooks/queries/versions.rs b/packages/oneclient_app/src/hooks/queries/versions.rs index 47f79682..8f4d053b 100644 --- a/packages/oneclient_app/src/hooks/queries/versions.rs +++ b/packages/oneclient_app/src/hooks/queries/versions.rs @@ -15,6 +15,11 @@ impl QueryCapability for VersionsMetadataQuery { async fn run(&self, _keys: &Self::Keys) -> Result { let state = LauncherState::get()?; + let metadata = state.versions.metadata().await; + if !metadata.is_empty() { + return Ok(metadata); + } + state.versions.sync(&state.services).await?; Ok(state.versions.metadata().await) } } diff --git a/packages/oneclient_core/src/bundles/install.rs b/packages/oneclient_core/src/bundles/install.rs index f5a813f6..4b2f9921 100644 --- a/packages/oneclient_core/src/bundles/install.rs +++ b/packages/oneclient_core/src/bundles/install.rs @@ -17,6 +17,10 @@ use crate::packages::store::{PackageStore, unlink_cluster_file}; use crate::packages::types::ExternalFile; use crate::state::LauncherServices; +fn is_base62(s: &str) -> bool { + !s.is_empty() && s.chars().all(|c| c.is_ascii_alphanumeric()) +} + pub async fn install_package_from_bundle( file: &BundleFile, cluster_id: i64, @@ -30,6 +34,7 @@ pub async fn install_package_from_bundle( provider, project_id, version_id, + sha1, } => { let project = crate::packages::cached_project_detail( services, @@ -39,10 +44,18 @@ pub async fn install_package_from_bundle( ) .await; - let version = + let version = if is_base62(version_id) { crate::packages::get_version_cached(services, *provider, project_id, version_id) - .await?; - + .await? + } else if let Ok(Some((_, version))) = + services.packages.lookup_version(sha1, services).await + { + version + } else { + crate::packages::get_version_cached(services, *provider, project_id, version_id) + .await? + }; + let artifact = PackageStore::install_to_cluster( *provider, &project, diff --git a/packages/oneclient_core/src/bundles/polymrpack.rs b/packages/oneclient_core/src/bundles/polymrpack.rs index 882c85d9..612afe2b 100644 --- a/packages/oneclient_core/src/bundles/polymrpack.rs +++ b/packages/oneclient_core/src/bundles/polymrpack.rs @@ -142,6 +142,7 @@ fn parse_bundle_file(file: &PolyMrpackFile) -> Option { provider: ProviderId::Modrinth, project_id: paths[0].to_string(), version_id: paths[2].to_string(), + sha1: file.hashes.sha1.to_ascii_lowercase(), }, }); } diff --git a/packages/oneclient_core/src/bundles/types.rs b/packages/oneclient_core/src/bundles/types.rs index 79b5dabf..03f51acb 100644 --- a/packages/oneclient_core/src/bundles/types.rs +++ b/packages/oneclient_core/src/bundles/types.rs @@ -59,6 +59,7 @@ pub enum BundleFileKind { provider: ProviderId, project_id: String, version_id: String, + sha1: String, }, External(ExternalFile), } diff --git a/packages/oneclient_core/src/bundles/updates.rs b/packages/oneclient_core/src/bundles/updates.rs index 989a03e6..7192da30 100644 --- a/packages/oneclient_core/src/bundles/updates.rs +++ b/packages/oneclient_core/src/bundles/updates.rs @@ -101,6 +101,7 @@ async fn check_bundle_updates_inner( provider, project_id, version_id, + .. } => { let key = managed_bundle_key(*provider, project_id); files_map.insert(key.clone(), (version_id.clone(), file.clone())); @@ -538,6 +539,7 @@ pub async fn get_bundles_with_update_status( provider, project_id, version_id, + .. } => { let key = managed_bundle_key(*provider, project_id); if let Some(installed) = installed_map.get(&key) { diff --git a/packages/oneclient_core/src/recovery.rs b/packages/oneclient_core/src/recovery.rs index 92369286..9cc497a2 100644 --- a/packages/oneclient_core/src/recovery.rs +++ b/packages/oneclient_core/src/recovery.rs @@ -312,6 +312,7 @@ pub async fn restore_bundle_tracking(state: &LauncherState) -> LauncherResult<() provider, project_id, version_id, + .. } = &file.kind else { continue;