From 31f5d7b2ea8386ff522259a5da2a5c90b715e263 Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Thu, 23 Jan 2025 16:57:10 +0100 Subject: [PATCH] all the data --- src/main.rs | 133 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 35 deletions(-) diff --git a/src/main.rs b/src/main.rs index 096468e..a86f857 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,7 @@ struct IniGame { #[derive(Debug)] struct Game { app_id: u32, + name: String, achievements: Vec, } @@ -91,7 +92,8 @@ async fn main() { &game_name_cache_path, &game_name_list, dirs, - ).await; + ) + .await; println!("games: {:#?}", games); } @@ -122,6 +124,43 @@ async fn get_steam_data(client: &Client, key: &str, appid: u32, lang: &str) -> J serde_json::from_str(&json).unwrap() } +async fn get_achievement_data( + client: &Client, + api_key: &str, + app_id: u32, + game_name_cache_path: &str, + game_name_list: &Vec, +) -> Game { + let mut game = Game { + name: get_game_name(&client, &game_name_cache_path, &game_name_list, app_id) + .await + .unwrap(), + app_id, + achievements: Vec::new(), + }; + let game_data = get_steam_data(&client, api_key, app_id, "en").await; + for json_achievement in &game_data.game.available_game_stats.achievements { + game.achievements.push(Achievement { + achieved: false, + max_progress: 0, + current_progress: 0, + unlock_time: 0, + description: json_achievement.description.clone(), + name: json_achievement.display_name.clone(), + hidden: if json_achievement.hidden == 1 { + true + } else if json_achievement.hidden == 0 { + false + } else { + panic!("Unexpected hidden value") + }, + icon: json_achievement.icon.clone(), + icongray: json_achievement.icongray.clone(), + }); + } + game +} + async fn get_achievement_data_all( client: &Client, api_key: &str, @@ -135,41 +174,54 @@ async fn get_achievement_data_all( let mut game = Game { app_id: ini_game.id, achievements: Vec::new(), - }; - let game_data = get_steam_data(&client, api_key, ini_game.id, "en").await; - println!( - "game: \"{}\", id: {}, total achievements: {}/{}", - get_game_name(&client, &game_name_cache_path, &game_name_list, ini_game.id) + name: get_game_name(&client, &game_name_cache_path, &game_name_list, ini_game.id) .await .unwrap(), - ini_game.id, - ini_game.achievements.len(), - game_data.game.available_game_stats.achievements.len(), - ); - for ini_achievement in ini_game.achievements { - if ini_achievement.achieved { - for json_achievement in &game_data.game.available_game_stats.achievements { - if json_achievement.name == ini_achievement.name { - game.achievements.push(Achievement { - achieved: ini_achievement.achieved, - max_progress: ini_achievement.max_progress, - current_progress: ini_achievement.current_progress, - description: json_achievement.description.clone(), - name: json_achievement.display_name.clone(), - hidden: if json_achievement.hidden == 1 { - true - } else if json_achievement.hidden == 0 { - false - } else { - panic!("Unexpected hidden value") - }, - icon: json_achievement.icon.clone(), - icongray: json_achievement.icongray.clone(), - unlock_time: ini_achievement.unlock_time, - }); - } + }; + let game_data = get_steam_data(&client, api_key, ini_game.id, "en").await; + for json_achievement in &game_data.game.available_game_stats.achievements { + let mut found_in_ini = false; + for ini_achievement in &ini_game.achievements { + if json_achievement.name == ini_achievement.name { + game.achievements.push(Achievement { + achieved: ini_achievement.achieved, + max_progress: ini_achievement.max_progress, + current_progress: ini_achievement.current_progress, + description: json_achievement.description.clone(), + name: json_achievement.display_name.clone(), + hidden: if json_achievement.hidden == 1 { + true + } else if json_achievement.hidden == 0 { + false + } else { + panic!("Unexpected hidden value") + }, + icon: json_achievement.icon.clone(), + icongray: json_achievement.icongray.clone(), + unlock_time: ini_achievement.unlock_time, + }); + found_in_ini = true; } } + if !found_in_ini { + game.achievements.push(Achievement { + achieved: false, + max_progress: 0, + current_progress: 0, + unlock_time: 0, + description: json_achievement.description.clone(), + name: json_achievement.display_name.clone(), + hidden: if json_achievement.hidden == 1 { + true + } else if json_achievement.hidden == 0 { + false + } else { + panic!("Unexpected hidden value") + }, + icon: json_achievement.icon.clone(), + icongray: json_achievement.icongray.clone(), + }); + } } games.push(game); } @@ -295,10 +347,21 @@ mod tests { async fn check_id_to_name() { let client = Client::new(); let config_dir = dirs::config_dir().unwrap().to_str().unwrap().to_owned(); + let cache_dir = dirs::cache_dir().unwrap().to_str().unwrap().to_owned(); + let game_name_cache_path = format!("{cache_dir}/achievement-watcher/game_names.txt"); + let game_name_list = get_game_name_file_cache(&game_name_cache_path); let api_key = fs::read_to_string(format!("{config_dir}/achievement-watcher/api-key.txt")).unwrap(); - let json_game = get_steam_data(&client, &api_key, 570940, "en").await; - println!("game name: {}", json_game.game.game_name); - assert!(json_game.game.game_name.to_lowercase() == "Dark Souls Remastered"); + let api_key = api_key.trim(); + let game = get_achievement_data( + &client, + api_key, + 570940, + &game_name_cache_path, + &game_name_list, + ) + .await; + println!("game name: \"{}\"", game.name); + assert_eq!(game.name, "DARK SOULS™: REMASTERED"); } }