fix: os rule validation now checks whether the version is new or not
This commit is contained in:
parent
7b1161cbf5
commit
878f7ed5ab
7 changed files with 58 additions and 25 deletions
|
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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?;
|
||||
|
|
|
|||
|
|
@ -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))?);
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue