diff --git a/src/handlers/event/analyze_logs/issues.rs b/src/handlers/event/analyze_logs/issues.rs index e7769be..26654c5 100644 --- a/src/handlers/event/analyze_logs/issues.rs +++ b/src/handlers/event/analyze_logs/issues.rs @@ -23,6 +23,15 @@ pub async fn find(log: &str, data: &Data) -> Result> { optinotfine, pre_1_12_native_transport_java_9, wrong_java, + forge_missing_dependencies, + legacyjavafixer, + locked_jar, + offline_launch, + frapi, + no_disk_space, + java_32_bit, + intermediary_mappings, + old_forge_new_java, ]; let mut res: Vec<(String, String)> = issues.iter().filter_map(|issue| issue(log)).collect(); @@ -166,7 +175,7 @@ fn oom(log: &str) -> Issue { "Allocating more RAM to your instance could help prevent this crash.".to_string(), ); - let found = log.contains("java.lang.OutOfMemoryError") || log.contains("-805306369"); + let found = log.contains("java.lang.OutOfMemoryError"); found.then_some(issue) } @@ -216,10 +225,17 @@ async fn outdated_launcher(log: &str, data: &Data) -> Result { || (log_version_parts[0] == latest_version_parts[0] && log_version_parts[1] < latest_version_parts[1]) { - let issue = ( - "Outdated Prism Launcher".to_string(), - format!("Your installed version is {log_version}, while the newest version is {latest_version}.\nPlease update; for more info see https://prismlauncher.org/download/") - ); + let issue = if log_version_parts[0] < 8 { + ( + "Outdated Prism Launcher".to_string(), + format!("Your installed version is {log_version}, while the newest version is {latest_version}.\nPlease update; for more info see https://prismlauncher.org/download/") + ) + } else { + ( + "Outdated Prism Launcher".to_string(), + format!("Your installed version is {log_version}, while the newest version is {latest_version}.\nPlease update by pressing the `Update` button in the launcher or using your package manager.") + ) + }; Ok(Some(issue)) } else { @@ -271,3 +287,115 @@ fn wrong_java(log: &str) -> Issue { log.contains("Java major version is incompatible. Things might break.") .then_some(issue) } + +fn forge_missing_dependencies(log: &str) -> Issue { + let issue = ( + "Missing mod dependencies".to_string(), + "You seem to be missing mod dependencies. + Search for \"mandatory dependencies\" in your log." + .to_string(), + ); + + let found = log.contains("Missing or unsupported mandatory dependencies"); + found.then_some(issue) +} + +fn legacyjavafixer(log: &str) -> Issue { + let issue = ( + "LegacyJavaFixer".to_string(), + "You are using a modern Java version with an old Forge version, which is causing this crash. + MinecraftForge provides a coremod to fix this issue, download it [here](https://dist.creeper.host/FTB2/maven/net/minecraftforge/lex/legacyjavafixer/1.0/legacyjavafixer-1.0.jar)." + .to_string(), + ); + + let found = log.contains( + "[SEVERE] [ForgeModLoader] Unable to launch\njava.util.ConcurrentModificationException", + ); + found.then_some(issue) +} + +fn locked_jar(log: &str) -> Issue { + let issue = ( + "Locked Jars".to_string(), + "Something is locking your library jars. + To fix this, try rebooting your PC." + .to_string(), + ); + + let found = log.contains("Couldn't extract native jar"); + found.then_some(issue) +} + +fn offline_launch(log: &str) -> Issue { + let issue = ( + "Missing Libraries".to_string(), + "You seem to be missing libraries. This is usually caused by launching offline before they can be downloaded. + To fix this, first ensure you are connected to the internet. Then, try selecting Edit > Version > Download All and launching your instance again." + .to_string(), + ); + + let found = log.contains("(missing)\n"); + found.then_some(issue) +} + +fn frapi(log: &str) -> Issue { + let issue = ( + "Missing Indium".to_string(), + "You are using a mod that needs Indium. + Please install it by going to Edit > Mods > Download Mods." + .to_string(), + ); + + let found = log + .contains("Cannot invoke \"net.fabricmc.fabric.api.renderer.v1.Renderer.meshBuilder()\""); + found.then_some(issue) +} + +fn no_disk_space(log: &str) -> Issue { + let issue = ( + "Out of disk space".to_string(), + "You ran out of disk space. You should free up some space on it.".to_string(), + ); + + let found = log.contains("There is not enough space on the disk"); + found.then_some(issue) +} + +fn java_32_bit(log: &str) -> Issue { + let issue = ( + "32 bit Java crash".to_string(), + "You are using a 32 bit Java version. Please select 64 bit Java instead. + Check `/tag java` for more information." + .to_string(), + ); + + let found = log.contains("Could not reserve enough space for ") + || log.contains("Invalid maximum heap size: "); + found.then_some(issue) +} + +fn intermediary_mappings(log: &str) -> Issue { + let issue = ( + "Wrong Intermediary Mappings version".to_string(), + "You are using Intermediary Mappings for the wrong Minecraft version. + Please select Change Version while it is selected in Edit > Version." + .to_string(), + ); + + let found = log.contains("Mapping source name conflicts detected:"); + found.then_some(issue) +} + +fn old_forge_new_java(log: &str) -> Issue { + let issue = ( + "Forge on old Minecraft versions".to_string(), + "This crash is caused by using an old Forge version with a modern Java version. + To fix it, add the flag `-Dfml.ignoreInvalidMinecraftCertificates=true` to Edit > Settings > Java arguments." + .to_string(), + ); + + let found = log.contains( + "add the flag -Dfml.ignoreInvalidMinecraftCertificates=true to the 'JVM settings'", + ); + found.then_some(issue) +}