use anyhow::anyhow; #[derive(Debug)] pub enum InstallType { STEAM, ORIGIN, EAPLAY, UNKNOWN, } /// Check version number of a mod pub fn check_mod_version_number(path_to_mod_folder: String) -> Result { // println!("{}", format!("{}/mod.json", path_to_mod_folder)); let data = std::fs::read_to_string(format!("{}/mod.json", path_to_mod_folder))?; let parsed_json: serde_json::Value = serde_json::from_str(&data)?; // println!("{}", parsed_json); let mod_version_number = match parsed_json.get("Version").and_then(|value| value.as_str()) { Some(version_number) => version_number, None => return Err(anyhow!("No version number found")), }; println!("{}", mod_version_number); Ok(mod_version_number.to_string()) } /// Attempts to find the game install location pub fn find_game_install_location() -> Result<(String, InstallType), anyhow::Error> { // Attempt parsing Steam library directly match steamlocate::SteamDir::locate() { Some(mut steamdir) => { let titanfall2_steamid = 1237970; match steamdir.app(&titanfall2_steamid) { Some(app) => { // println!("{:#?}", app); return Ok((app.path.to_str().unwrap().to_string(), InstallType::STEAM)); } None => println!("Couldn't locate Titanfall2"), } } None => println!("Couldn't locate Steam on this computer!"), } Err(anyhow!( "Could not auto-detect game install location! Please enter it manually." )) } /// Returns the current Northstar version number as a string pub fn get_northstar_version_number() -> Result { // TODO: if `find_game_install_location` is unable to find game_path then function will fail to detect // Northstar install, even if game_path is known due to user entering it manually let (install_location, install_type) = match find_game_install_location() { Ok((path, install_type)) => (path, install_type), Err(err) => return Err(err), }; println!("{}", install_location); println!("{:?}", install_type); // TODO: // Check if NorthstarLauncher.exe exists and check its version number let profile_folder = "R2Northstar"; let core_mods = [ "Northstar.Client", "Northstar.Custom", "Northstar.CustomServers", ]; let initial_version_number = match check_mod_version_number(format!( "{}/{}/mods/{}", install_location, profile_folder, core_mods[0] )) { Ok(version_number) => version_number, Err(err) => return Err(err), }; for core_mod in core_mods { let current_version_number = match check_mod_version_number(format!( "{}/{}/mods/{}", install_location, profile_folder, core_mod )) { Ok(version_number) => version_number, Err(err) => return Err(err), }; if current_version_number != initial_version_number { // We have a version number mismatch return Err(anyhow!("Found version number mismatch")); } } println!("All mods same version"); Ok(initial_version_number) } /// Checks whether the provided path is a valid Titanfall2 gamepath by checking against a certain set of criteria pub fn check_is_valid_game_path(game_install_path: &str) -> Result<(), anyhow::Error> { let is_correct_game_path = std::path::Path::new(&format!("{}/Titanfall2.exe", game_install_path)).exists(); println!("Titanfall2.exe exists in path? {}", is_correct_game_path); // Exit early if wrong game path if !is_correct_game_path { return Err(anyhow!("Incorrect game path \"{}\"", game_install_path)); // Return error cause wrong game path } Ok(()) }