game_manager_lib\commands/
achievements.rs

1//! Comando para buscar conquistas recentes do Steam para o dashboard.
2//!
3//! Retorna as 5 conquistas mais recentes dos jogos jogados nas últimas 2 semanas.
4
5use 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/// Busca as 5 conquistas mais recentes dos jogos jogados nas últimas 2 semanas.
20/// Retorna uma lista vazia se não houver conquistas ou se as credenciais não estiverem configuradas.
21#[tauri::command]
22pub async fn get_recent_achievements(
23    app: AppHandle,
24) -> Result<Vec<DashboardAchievement>, AppError> {
25    // 1. Pega credenciais
26    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    // 2. Busca jogos recentes (últimas 2 semanas)
34    let recent_games = steam::get_recently_played_games(&api_key, &steam_id).await?;
35
36    let mut all_achievements = Vec::new();
37
38    // 3. Para cada jogo recente, busca as conquistas
39    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                // Filtra apenas as desbloqueadas (achieved == 1)
45                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    // 4. Ordena: Mais recentes primeiro (unlock_time decrescente)
58    all_achievements.sort_by(|a, b| b.unlock_time.cmp(&a.unlock_time));
59
60    // 5. Pega apenas as 5 últimas
61    all_achievements.truncate(5);
62
63    Ok(all_achievements)
64}