game_manager_lib\commands/
achievements.rs1use crate::database;
6use crate::errors::AppError;
7use crate::services::steam;
8use serde::Serialize;
9use tauri::AppHandle;
10
11#[derive(Serialize)]
12pub struct DashboardAchievement {
13 pub game_name: String,
14 pub achievement_name: String,
15 pub unlock_time: i64,
16 pub game_id: String,
17}
18
19#[tauri::command]
22pub async fn get_recent_achievements(
23 app: AppHandle,
24) -> Result<Vec<DashboardAchievement>, AppError> {
25 let api_key = database::get_secret(&app, "steam_api_key")?;
27 let steam_id = database::get_secret(&app, "steam_id")?;
28
29 if api_key.is_empty() || steam_id.is_empty() {
30 return Ok(vec![]);
31 }
32
33 let recent_games = steam::get_recently_played_games(&api_key, &steam_id).await?;
35
36 let mut all_achievements = Vec::new();
37
38 for game in recent_games {
40 if let Ok(achievements) =
41 steam::get_player_achievements(&api_key, &steam_id, game.appid).await
42 {
43 for ach in achievements {
44 if ach.achieved == 1 {
46 all_achievements.push(DashboardAchievement {
47 game_name: game.name.clone(),
48 achievement_name: ach.name.unwrap_or(ach.apiname),
49 unlock_time: ach.unlocktime,
50 game_id: game.appid.to_string(),
51 });
52 }
53 }
54 }
55 }
56
57 all_achievements.sort_by(|a, b| b.unlock_time.cmp(&a.unlock_time));
59
60 all_achievements.truncate(5);
62
63 Ok(all_achievements)
64}