1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
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<String, anyhow::Error> {
// 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<String, anyhow::Error> {
// 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(())
}
|