use crate::client::SteamClient;
use crate::errors::SteamError;
use serde::Deserialize;
use std::fmt::Formatter;
const ENDPOINT_GET_FRIENDLIST: &str = "https://api.steampowered.com/ISteamUser/GetFriendList/v0001";
#[derive(Debug, Deserialize)]
struct FriendsResponse {
#[serde(rename(deserialize = "friendslist"))]
response: Option<FriendsList>,
}
#[derive(Debug, Default, Deserialize)]
pub struct FriendsList {
pub friends: Vec<Friend>,
}
impl From<FriendsResponse> for FriendsList {
fn from(value: FriendsResponse) -> Self {
let v = value.response.unwrap_or_default();
Self { friends: v.friends }
}
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Friend {
#[serde(rename(deserialize = "steamid"))]
pub steam_id: String,
pub relationship: SteamRelationship,
pub friend_since: i64,
}
impl std::fmt::Display for Friend {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Friend ID: {}, friends since {}",
self.steam_id, self.friend_since
)
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[non_exhaustive]
pub enum SteamRelationship {
#[serde(rename(deserialize = "friend"))]
Friend,
}
impl SteamClient {
pub fn get_friends(&self, steam_id: &str) -> Result<Vec<Friend>, SteamError> {
let response = self.get_request(
ENDPOINT_GET_FRIENDLIST,
vec![("steamid", steam_id), ("relationship", "friend")],
)?;
let friends_list = self
.parse_response::<FriendsResponse, FriendsList>(response)
.unwrap();
Ok(friends_list.friends)
}
}