fix: os rule validation now checks whether the version is new or not

This commit is contained in:
LynithDev 2025-11-08 17:39:48 +01:00
parent 7b1161cbf5
commit 878f7ed5ab
7 changed files with 58 additions and 25 deletions

View file

@ -1,5 +1,9 @@
use anyhow::anyhow;
use onelauncher_core::{api::{game::metadata::{download_minecraft_ingressed, download_version_info}, proxy::ProxyDynamic}, error::LauncherResult, initialize_core, store::{CoreOptions, State}};
use onelauncher_core::api::game::metadata::{download_minecraft_ingressed, download_version_info};
use onelauncher_core::api::proxy::ProxyDynamic;
use onelauncher_core::error::LauncherResult;
use onelauncher_core::initialize_core;
use onelauncher_core::store::{CoreOptions, State};
#[tokio::main]
async fn main() -> LauncherResult<()> {
@ -9,10 +13,16 @@ async fn main() -> LauncherResult<()> {
let mut metadata = state.metadata.write().await;
let versions = metadata.get_vanilla_or_fetch().await?;
let version = versions.versions.iter().find(|v| v.id == "1.20.4").ok_or_else(|| anyhow!("couldn't find 1.8.9 in version list"))?;
let version = versions
.versions
.iter()
.find(|v| v.id == "1.20.4")
.ok_or_else(|| anyhow!("couldn't find 1.20.4 in version list"))?;
let version_info = download_version_info(version, None, None, Some(true)).await?;
download_minecraft_ingressed(&version_info, "x86", Some(true)).await?;
let minecraft_updated = true;
download_minecraft_ingressed(&version_info, "x86", minecraft_updated, Some(true)).await?;
Ok(())
}
}

View file

@ -173,15 +173,16 @@ async fn install_cluster(cluster: &clusters::Model, force: Option<bool>) -> Laun
let state = State::get().await?;
let mut metadata = state.metadata.write().await;
let versions_list = &metadata.get_vanilla_or_fetch().await?.versions;
let version = metadata
.get_vanilla_or_fetch()
.await?
.versions
let version_index = versions_list
.iter()
.find(|v| v.id == cluster.mc_version)
.ok_or_else(|| ClusterError::InvalidVersion(cluster.mc_version.clone()))?
.clone();
.position(|v| v.id == cluster.mc_version)
.ok_or_else(|| ClusterError::InvalidVersion(cluster.mc_version.clone()))?;
let version = versions_list[version_index].clone();
let minecraft_updated = metadata::is_version_updated(version_index, &versions_list);
drop(metadata);
@ -218,6 +219,7 @@ async fn install_cluster(cluster: &clusters::Model, force: Option<bool>) -> Laun
&version_info,
&java_version.arch,
Some(&SubIngress::new(&ingress_id, INGRESS_STEP)),
minecraft_updated,
force,
)
.await?;

View file

@ -17,6 +17,7 @@ use crate::utils::io;
#[allow(clippy::too_many_arguments)]
pub fn java_arguments(
version_updated: bool,
arguments: Option<&[Argument]>,
natives_path: &Path,
libraries_path: &Path,
@ -29,6 +30,7 @@ pub fn java_arguments(
let mut parsed = Vec::new();
if let Some(args) = arguments {
parse_arguments(
version_updated,
args,
&mut parsed,
|a| {
@ -67,6 +69,7 @@ pub fn java_arguments(
#[allow(clippy::too_many_arguments)]
pub fn minecraft_arguments(
version_updated: bool,
args: Option<&[Argument]>,
legacy_args: Option<&str>,
creds: &MinecraftCredentials,
@ -81,6 +84,7 @@ pub fn minecraft_arguments(
if let Some(args) = args {
let mut parsed = Vec::new();
parse_arguments(
version_updated,
args,
&mut parsed,
|arg| {
@ -341,6 +345,7 @@ pub fn get_library(
}
fn parse_arguments<ParseFn>(
version_updated: bool,
args: &[Argument],
parsed: &mut Vec<String>,
parse_function: ParseFn,
@ -358,7 +363,7 @@ where
}
}
Argument::Ruled { rules, value } => {
if super::rules::validate_rules(rules, java_arch, true) {
if super::rules::validate_rules(rules, java_arch, version_updated) {
match value {
ArgumentValue::Single(arg) => {
parsed.push(parse_function(&arg.replace(' ', DUMMY_REPLACE_NEWLINE))?);

View file

@ -58,7 +58,7 @@ pub async fn launch_minecraft(
.ok_or_else(|| anyhow::anyhow!("invalid game version {}", cluster.mc_version))?;
let version = versions[version_index].clone();
let updated = version_index <= versions.iter().position(|x| x.id == "22w16a").unwrap_or(0);
let updated = metadata::is_version_updated(version_index, versions);
let loader_version = metadata::get_loader_version(
&cluster.mc_version,
@ -116,6 +116,7 @@ pub async fn launch_minecraft(
command
.args(
arguments::java_arguments(
updated,
args.get(&interpulse::api::minecraft::ArgumentType::Jvm)
.map(Vec::as_slice),
&dirs.natives_dir().join(&version_name),
@ -137,6 +138,7 @@ pub async fn launch_minecraft(
.arg(version_info.main_class.clone())
.args(
arguments::minecraft_arguments(
updated,
args.get(&interpulse::api::minecraft::ArgumentType::Game)
.map(Vec::as_slice),
version_info.minecraft_arguments.as_deref(),

View file

@ -18,6 +18,7 @@ use crate::utils::{http, io};
pub async fn download_minecraft_ingressed(
version: &VersionInfo,
java_arch: &str,
minecraft_updated: bool,
force: Option<bool>,
) -> LauncherResult<()> {
let id = init_ingress(
@ -31,6 +32,7 @@ pub async fn download_minecraft_ingressed(
version,
java_arch,
Some(&SubIngress::new(&id, 100.0)),
minecraft_updated,
force,
)
.await
@ -42,13 +44,15 @@ pub async fn download_minecraft(
version: &VersionInfo,
java_arch: &str,
sub_ingress: Option<&SubIngress<'_>>,
// if the version is newer than 22w16a, this should be true
minecraft_updated: bool,
force: Option<bool>,
) -> LauncherResult<()> {
let asset_index = download_assets_index(version, sub_ingress, force).await?;
tokio::try_join! {
download_assets(version.assets == "legacy", asset_index, sub_ingress, force),
download_client(version, sub_ingress, force),
download_libraries(version.id.clone(), version.libraries.clone(), java_arch.to_string(), sub_ingress, force),
download_libraries(version.id.clone(), version.libraries.clone(), java_arch.to_string(), sub_ingress, minecraft_updated, force),
}?;
Ok(())
@ -282,6 +286,7 @@ pub async fn download_libraries(
libraries: Vec<Library>,
java_arch: String,
ingress: Option<&SubIngress<'_>>,
minecraft_updated: bool,
force: Option<bool>,
) -> LauncherResult<usize> {
tracing::debug!("loading libraries for version {}", version);
@ -304,7 +309,7 @@ pub async fn download_libraries(
async move {
if let Some(rules) = &lib.rules
&& !super::rules::validate_rules(rules, &java_arch, lib.natives.is_some()) {
&& !super::rules::validate_rules(rules, &java_arch, minecraft_updated) {
tracing::debug!("skipping library {} due to rules", lib.name);
return Ok::<(), LauncherError>(());
}
@ -455,3 +460,7 @@ pub async fn get_loaders_for_version(mc_version: &str) -> LauncherResult<Vec<Gam
metadata.get_loaders_for_version(mc_version).await
}
pub fn is_version_updated(version_index: usize, versions: &[Version]) -> bool {
version_index <= versions.iter().position(|x| x.id == "22w16a").unwrap_or(0)
}

View file

@ -1,5 +1,4 @@
use interpulse::api::minecraft::{Os, OsRule, Rule, RuleAction};
use regex::Regex;
use crate::utils::os_ext::OsExt;
@ -75,11 +74,5 @@ pub fn validate_os_rule(rule: &OsRule, java_arch: &str, updated: bool) -> bool {
}
}
if let Some(version) = &rule.version
&& let Ok(regex) = Regex::new(version.as_str())
{
rule_match &= regex.is_match(&sysinfo::System::os_version().unwrap_or_default());
}
rule_match
}

View file

@ -157,7 +157,12 @@ pub async fn get_recommended_java(
}
pub async fn prepare_java(major: u32) -> LauncherResult<java_versions::Model> {
let id = init_ingress(IngressType::JavaPrepare, "preparing java", 100.0).await?;
let id = init_ingress(
IngressType::JavaPrepare,
&format!("preparing java {}", major),
100.0,
)
.await?;
let java = dao::get_latest_java_by_major(major).await?;
if let Some(java) = &java {
@ -389,8 +394,15 @@ pub async fn install_java_package(package: JavaPackage) -> LauncherResult<PathBu
let version = package.download_url;
let ingress_id =
init_ingress(IngressType::JavaPrepare, "preparing java", INGRESS_TOTAL).await?;
let ingress_id = init_ingress(
IngressType::JavaPrepare,
&format!(
"installing java {}",
package.java_version.first().unwrap_or(&0)
),
INGRESS_TOTAL,
)
.await?;
let file = fetch_advanced(
reqwest::Method::GET,