use crate::client::SteamClient;
use crate::errors::SteamError;
use serde::Deserialize;
const ENDPOINT_USER_STATS_FOR_GAME: &str =
"https://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002";
#[derive(Debug, Deserialize)]
struct PlayerStatsResponse {
#[serde(rename(deserialize = "playerstats"))]
response: Option<PlayerStats>,
}
#[derive(Debug, Default, Deserialize)]
pub struct PlayerStats {
#[serde(rename(deserialize = "gameName"))]
pub game_name: String,
pub achievements: Vec<Achievement>,
pub stats: Vec<Stat>,
}
impl From<PlayerStatsResponse> for PlayerStats {
fn from(value: PlayerStatsResponse) -> Self {
let v = value.response.unwrap_or_default();
Self {
game_name: v.game_name,
achievements: v.achievements,
stats: v.stats,
}
}
}
#[derive(Debug, Deserialize)]
pub struct Achievement {
pub name: String,
}
#[derive(Debug, Deserialize)]
pub struct Stat {
pub name: String,
pub value: u16,
}
impl SteamClient {
pub fn get_player_stats(
&self,
steam_id: &str,
app_id: &str,
) -> Result<PlayerStats, SteamError> {
let response = self.get_request(
ENDPOINT_USER_STATS_FOR_GAME,
vec![("steamid", steam_id), ("appid", app_id)],
)?;
let stats = self
.parse_response::<PlayerStatsResponse, PlayerStats>(response)
.unwrap();
Ok(stats)
}
}