mirror of
https://github.com/open-goal/launcher.git
synced 2024-10-20 04:57:38 -04:00
support: multi-game support package dumping (#366)
This commit is contained in:
parent
c5c44f2921
commit
22706e13bc
|
@ -47,6 +47,19 @@ pub struct PerGameInfo {
|
||||||
pub jakx: GameInfo,
|
pub jakx: GameInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PerGameInfo {
|
||||||
|
// TODO - switch this to enums or w/e, being lazy
|
||||||
|
fn get_game_info(&mut self, game_name: &str) -> &mut GameInfo {
|
||||||
|
match game_name {
|
||||||
|
"jak1" => &mut self.jak1,
|
||||||
|
"jak2" => &mut self.jak2,
|
||||||
|
"jak3" => &mut self.jak3,
|
||||||
|
"jakx" => &mut self.jakx,
|
||||||
|
_ => &mut self.jak1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Serialize, Deserialize)]
|
#[derive(Default, Debug, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct SupportPackage {
|
pub struct SupportPackage {
|
||||||
|
@ -65,6 +78,115 @@ pub struct SupportPackage {
|
||||||
pub game_binary_exists: bool,
|
pub game_binary_exists: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn dump_per_game_info(
|
||||||
|
config_lock: &tokio::sync::MutexGuard<'_, LauncherConfig>,
|
||||||
|
package: &mut SupportPackage,
|
||||||
|
zip_file: &mut zip::ZipWriter<std::fs::File>,
|
||||||
|
install_path: &Path,
|
||||||
|
game_name: &str,
|
||||||
|
) -> Result<(), CommandError> {
|
||||||
|
// Save OpenGOAL config folder (this includes saves and settings)
|
||||||
|
let game_config_dir = match config_dir() {
|
||||||
|
None => {
|
||||||
|
return Err(CommandError::Support(
|
||||||
|
"Couldn't determine application config directory".to_owned(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
Some(path) => path.join("OpenGOAL"),
|
||||||
|
};
|
||||||
|
append_dir_contents_to_zip(
|
||||||
|
zip_file,
|
||||||
|
&game_config_dir.join(&game_name).join("settings"),
|
||||||
|
format!("Game Settings and Saves/{game_name}/settings").as_str(),
|
||||||
|
vec!["gc", "json"],
|
||||||
|
)
|
||||||
|
.map_err(|_| {
|
||||||
|
CommandError::Support("Unable to append game settings to the support package".to_owned())
|
||||||
|
})?;
|
||||||
|
append_dir_contents_to_zip(
|
||||||
|
zip_file,
|
||||||
|
&game_config_dir.join(&game_name).join("misc"),
|
||||||
|
format!("Game Settings and Saves/{game_name}/misc").as_str(),
|
||||||
|
vec!["gc", "json"],
|
||||||
|
)
|
||||||
|
.map_err(|_| {
|
||||||
|
CommandError::Support("Unable to append game misc settings to the support package".to_owned())
|
||||||
|
})?;
|
||||||
|
append_dir_contents_to_zip(
|
||||||
|
zip_file,
|
||||||
|
&game_config_dir.join(&game_name).join("saves"),
|
||||||
|
format!("Game Settings and Saves/{game_name}/saves").as_str(),
|
||||||
|
vec!["bin"],
|
||||||
|
)
|
||||||
|
.map_err(|_| {
|
||||||
|
CommandError::Support("Unable to append game saves to the support package".to_owned())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
// Save Logs
|
||||||
|
let active_version_dir = install_path.join("active");
|
||||||
|
let jak1_log_dir = active_version_dir.join(&game_name).join("data").join("log");
|
||||||
|
append_dir_contents_to_zip(
|
||||||
|
zip_file,
|
||||||
|
&jak1_log_dir,
|
||||||
|
format!("Game Logs and ISO Info/{game_name}").as_str(),
|
||||||
|
vec!["log", "json", "txt"],
|
||||||
|
)
|
||||||
|
.map_err(|_| CommandError::Support("Unable to append game logs to support package".to_owned()))?;
|
||||||
|
|
||||||
|
let texture_repl_dir = active_version_dir
|
||||||
|
.join(&game_name)
|
||||||
|
.join("data")
|
||||||
|
.join("texture_replacements");
|
||||||
|
package.game_info.get_game_info(game_name).has_texture_packs =
|
||||||
|
texture_repl_dir.exists() && texture_repl_dir.read_dir().unwrap().next().is_some();
|
||||||
|
let build_info_path = active_version_dir
|
||||||
|
.join(&game_name)
|
||||||
|
.join("data")
|
||||||
|
.join("iso_data")
|
||||||
|
.join(&game_name)
|
||||||
|
.join("buildinfo.json");
|
||||||
|
append_file_to_zip(
|
||||||
|
zip_file,
|
||||||
|
&build_info_path,
|
||||||
|
format!("Game Logs and ISO Info/{game_name}/buildinfo.json").as_str(),
|
||||||
|
)
|
||||||
|
.map_err(|_| {
|
||||||
|
CommandError::Support("Unable to append iso metadata to support package".to_owned())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
if config_lock.active_version_folder.is_some() && config_lock.active_version_folder.is_some() {
|
||||||
|
let data_dir = active_version_dir.join(&game_name).join("data");
|
||||||
|
let version_data_dir = install_path
|
||||||
|
.join("versions")
|
||||||
|
.join(config_lock.active_version_folder.as_ref().unwrap())
|
||||||
|
.join(config_lock.active_version.as_ref().unwrap())
|
||||||
|
.join("data");
|
||||||
|
package
|
||||||
|
.game_info
|
||||||
|
.get_game_info(game_name)
|
||||||
|
.release_integrity
|
||||||
|
.decompiler_folder_modified = dir_diff::is_different(
|
||||||
|
data_dir.join("decompiler"),
|
||||||
|
version_data_dir.join("decompiler"),
|
||||||
|
)
|
||||||
|
.unwrap_or(true);
|
||||||
|
package
|
||||||
|
.game_info
|
||||||
|
.get_game_info(game_name)
|
||||||
|
.release_integrity
|
||||||
|
.game_folder_modified =
|
||||||
|
dir_diff::is_different(data_dir.join("game"), version_data_dir.join("game")).unwrap_or(true);
|
||||||
|
package
|
||||||
|
.game_info
|
||||||
|
.get_game_info(game_name)
|
||||||
|
.release_integrity
|
||||||
|
.goal_src_modified =
|
||||||
|
dir_diff::is_different(data_dir.join("goal_src"), version_data_dir.join("goal_src"))
|
||||||
|
.unwrap_or(true);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn generate_support_package(
|
pub async fn generate_support_package(
|
||||||
config: tauri::State<'_, tokio::sync::Mutex<LauncherConfig>>,
|
config: tauri::State<'_, tokio::sync::Mutex<LauncherConfig>>,
|
||||||
|
@ -129,7 +251,7 @@ pub async fn generate_support_package(
|
||||||
|
|
||||||
for disk in system_info.disks() {
|
for disk in system_info.disks() {
|
||||||
package.disk_info.push(format!(
|
package.disk_info.push(format!(
|
||||||
"{}:{}-{}GB/{}GB",
|
"{} | Name - {} | Capacity - {}GB/{}GB",
|
||||||
disk.mount_point().to_string_lossy(),
|
disk.mount_point().to_string_lossy(),
|
||||||
disk.name().to_string_lossy(),
|
disk.name().to_string_lossy(),
|
||||||
disk.available_space() / 1024 / 1024 / 1024,
|
disk.available_space() / 1024 / 1024 / 1024,
|
||||||
|
@ -154,43 +276,6 @@ pub async fn generate_support_package(
|
||||||
.map_err(|_| CommandError::Support("Unable to create support file".to_owned()))?;
|
.map_err(|_| CommandError::Support("Unable to create support file".to_owned()))?;
|
||||||
let mut zip_file = zip::ZipWriter::new(save_file);
|
let mut zip_file = zip::ZipWriter::new(save_file);
|
||||||
|
|
||||||
// Save OpenGOAL config folder (this includes saves and settings)
|
|
||||||
let game_config_dir = match config_dir() {
|
|
||||||
None => {
|
|
||||||
return Err(CommandError::Support(
|
|
||||||
"Couldn't determine application config directory".to_owned(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
Some(path) => path.join("OpenGOAL"),
|
|
||||||
};
|
|
||||||
append_dir_contents_to_zip(
|
|
||||||
&mut zip_file,
|
|
||||||
&game_config_dir.join("jak1").join("settings"),
|
|
||||||
"Game Settings and Saves/jak1/settings",
|
|
||||||
vec!["gc", "json"],
|
|
||||||
)
|
|
||||||
.map_err(|_| {
|
|
||||||
CommandError::Support("Unable to append game settings to the support package".to_owned())
|
|
||||||
})?;
|
|
||||||
append_dir_contents_to_zip(
|
|
||||||
&mut zip_file,
|
|
||||||
&game_config_dir.join("jak1").join("misc"),
|
|
||||||
"Game Settings and Saves/jak1/misc",
|
|
||||||
vec!["gc", "json"],
|
|
||||||
)
|
|
||||||
.map_err(|_| {
|
|
||||||
CommandError::Support("Unable to append game misc settings to the support package".to_owned())
|
|
||||||
})?;
|
|
||||||
append_dir_contents_to_zip(
|
|
||||||
&mut zip_file,
|
|
||||||
&game_config_dir.join("jak1").join("saves"),
|
|
||||||
"Game Settings and Saves/jak1/saves",
|
|
||||||
vec!["bin"],
|
|
||||||
)
|
|
||||||
.map_err(|_| {
|
|
||||||
CommandError::Support("Unable to append game saves to the support package".to_owned())
|
|
||||||
})?;
|
|
||||||
|
|
||||||
// Save Launcher config folder
|
// Save Launcher config folder
|
||||||
let launcher_config_dir = match app_handle.path_resolver().app_config_dir() {
|
let launcher_config_dir = match app_handle.path_resolver().app_config_dir() {
|
||||||
None => {
|
None => {
|
||||||
|
@ -200,9 +285,17 @@ pub async fn generate_support_package(
|
||||||
}
|
}
|
||||||
Some(path) => path,
|
Some(path) => path,
|
||||||
};
|
};
|
||||||
|
let launcher_log_dir = match app_handle.path_resolver().app_log_dir() {
|
||||||
|
None => {
|
||||||
|
return Err(CommandError::Support(
|
||||||
|
"Couldn't determine launcher log directory".to_owned(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
Some(path) => path,
|
||||||
|
};
|
||||||
append_dir_contents_to_zip(
|
append_dir_contents_to_zip(
|
||||||
&mut zip_file,
|
&mut zip_file,
|
||||||
&launcher_config_dir.join("logs"),
|
&launcher_log_dir,
|
||||||
"Launcher Settings and Logs/logs",
|
"Launcher Settings and Logs/logs",
|
||||||
vec!["log"],
|
vec!["log"],
|
||||||
)
|
)
|
||||||
|
@ -218,66 +311,31 @@ pub async fn generate_support_package(
|
||||||
CommandError::Support("Unable to append launcher settings to the support package".to_owned())
|
CommandError::Support("Unable to append launcher settings to the support package".to_owned())
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Save Logs
|
|
||||||
let active_version_dir = install_path.join("active");
|
|
||||||
// TODO - for all games
|
|
||||||
let jak1_log_dir = active_version_dir.join("jak1").join("data").join("log");
|
|
||||||
append_dir_contents_to_zip(
|
|
||||||
&mut zip_file,
|
|
||||||
&jak1_log_dir,
|
|
||||||
"Game Logs and ISO Info/Jak 1",
|
|
||||||
vec!["log", "json", "txt"],
|
|
||||||
)
|
|
||||||
.map_err(|_| CommandError::Support("Unable to append game logs to support package".to_owned()))?;
|
|
||||||
|
|
||||||
// Per Game Info
|
// Per Game Info
|
||||||
let texture_repl_dir = active_version_dir
|
dump_per_game_info(
|
||||||
.join("jak1")
|
&config_lock,
|
||||||
.join("data")
|
&mut package,
|
||||||
.join("texture_replacements");
|
|
||||||
package.game_info.jak1.has_texture_packs =
|
|
||||||
texture_repl_dir.exists() && texture_repl_dir.read_dir().unwrap().next().is_some();
|
|
||||||
let build_info_path = active_version_dir
|
|
||||||
.join("jak1")
|
|
||||||
.join("data")
|
|
||||||
.join("iso_data")
|
|
||||||
.join("jak1")
|
|
||||||
.join("buildinfo.json");
|
|
||||||
append_file_to_zip(
|
|
||||||
&mut zip_file,
|
&mut zip_file,
|
||||||
&build_info_path,
|
install_path,
|
||||||
"Game Logs and ISO Info/Jak 1/buildinfo.json",
|
"jak1",
|
||||||
)
|
)
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
CommandError::Support("Unable to append iso metadata to support package".to_owned())
|
CommandError::Support(
|
||||||
})?;
|
"Unable to dump per game info for jak 1 to the support package".to_owned(),
|
||||||
|
|
||||||
if config_lock.active_version_folder.is_some() && config_lock.active_version_folder.is_some() {
|
|
||||||
let data_dir = active_version_dir.join("jak1").join("data");
|
|
||||||
let version_data_dir = install_path
|
|
||||||
.join("versions")
|
|
||||||
.join(config_lock.active_version_folder.as_ref().unwrap())
|
|
||||||
.join(config_lock.active_version.as_ref().unwrap())
|
|
||||||
.join("data");
|
|
||||||
package
|
|
||||||
.game_info
|
|
||||||
.jak1
|
|
||||||
.release_integrity
|
|
||||||
.decompiler_folder_modified = dir_diff::is_different(
|
|
||||||
data_dir.join("decompiler"),
|
|
||||||
version_data_dir.join("decompiler"),
|
|
||||||
)
|
)
|
||||||
.unwrap_or(true);
|
})?;
|
||||||
package
|
dump_per_game_info(
|
||||||
.game_info
|
&config_lock,
|
||||||
.jak1
|
&mut package,
|
||||||
.release_integrity
|
&mut zip_file,
|
||||||
.game_folder_modified =
|
install_path,
|
||||||
dir_diff::is_different(data_dir.join("game"), version_data_dir.join("game")).unwrap_or(true);
|
"jak2",
|
||||||
package.game_info.jak1.release_integrity.goal_src_modified =
|
)
|
||||||
dir_diff::is_different(data_dir.join("goal_src"), version_data_dir.join("goal_src"))
|
.map_err(|_| {
|
||||||
.unwrap_or(true);
|
CommandError::Support(
|
||||||
}
|
"Unable to dump per game info for jak 2 to the support package".to_owned(),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
// Dump High Level Info
|
// Dump High Level Info
|
||||||
let options = FileOptions::default()
|
let options = FileOptions::default()
|
||||||
|
|
Loading…
Reference in a new issue