support: multi-game support package dumping (#366)

This commit is contained in:
Tyler Wilding 2023-11-04 14:36:05 -04:00 committed by GitHub
parent c5c44f2921
commit 22706e13bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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()