use serde::Deserialize;
use crate::Error;
use crate::api::http;
use crate::handler::player_data::Client;
#[derive(Deserialize)]
pub struct PlayerResponse {
pub player: Player
}
#[derive(Debug, Deserialize)]
pub struct Player {
pub uuid: String,
#[serde(rename = "displayname")]
pub display_name: Option<String>,
pub rank: Option<String>,
#[serde(rename = "packageRank")]
pub package_rank: Option<String>,
#[serde(rename = "newPackageRank")]
pub new_package_rank: Option<String>,
#[serde(rename = "firstLogin")]
pub first_login: usize,
#[serde(rename = "lastLogin")]
pub last_login: usize,
#[serde(rename = "lastLogout")]
pub last_logout: usize,
#[serde(rename = "achievementsOneTime")]
pub one_time_achievements: Vec<String>,
#[serde(rename = "knownAliases")]
pub known_aliases: Vec<String>,
#[serde(rename = "playername")]
pub name: String,
}
impl Player {
pub async fn friends(&self, client: &Client)-> Result<Vec<Friend>, Error> {
let res = http::fetch::<FriendsResponse>(
&format!("friends?uuid={}&key={}", &self.uuid, client.key())
).await?;
Ok(res.friends)
}
pub async fn recent_games(&self, client: &Client) -> Result<Vec<Game>, Error> {
let res = http::fetch::<RecentGamesResponse>(
&format!("recentgames?uuid={}&key={}", &self.uuid, client.key())
).await?;
Ok(res.games)
}
pub async fn ranked_skywars(&self, client: &Client) -> Result<RankedSkywars, Error> {
let res = http::fetch::<RankedSkywarsResponse>(
&format!("player/ranked/skywars?uuid={}&key={}", &self.uuid, client.key())
).await?;
Ok(res.result)
}
pub async fn guild(&self, client: &Client) -> Result<Option<Guild>, Error> {
let res = http::fetch::<GuildResponse>(
&format!("guild?player={}&key={}", &self.uuid, client.key())
).await?;
Ok(res.guild)
}
}
#[derive(Deserialize)]
pub struct FriendsResponse {
#[serde(rename = "records")]
pub friends: Vec<Friend>
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Friend {
pub uuid_sender: String,
pub uuid_receiver: String,
pub started: usize
}
#[derive(Deserialize)]
pub struct RecentGamesResponse {
pub games: Vec<Game>
}
#[derive(Debug, Deserialize)]
pub struct Game {
pub date: usize,
#[serde(rename = "gameType")]
pub game_type: String,
pub mode: String,
pub map: String,
pub ended: usize
}
#[derive(Deserialize)]
pub struct RankedSkywarsResponse {
pub result: RankedSkywars
}
#[derive(Debug, Deserialize)]
pub struct RankedSkywars {
pub key: String,
pub position: usize,
pub score: usize
}
#[derive(Deserialize)]
pub struct GuildResponse {
pub guild: Option<Guild>
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Guild {
pub name: String,
pub coins: usize,
pub coins_ever: usize,
pub created: usize,
pub members: Vec<GuildMember>,
pub exp: usize,
pub guild_exp_by_game_type: GuildExpDist
}
#[derive(Debug, Deserialize)]
pub struct GuildMember {
pub uuid: String,
pub rank: String,
pub joined: usize
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub struct GuildExpDist {
pub build_battle: usize,
pub prototype: usize,
pub walls: usize,
pub battleground: usize,
pub murder_mystery: usize,
pub arena: usize,
pub duels: usize,
pub skyblock: usize,
pub housing: usize,
pub paintball: usize,
pub vampirez: usize,
pub pit: usize,
pub mcgo: usize,
pub walls3: usize,
pub super_smash: usize,
pub tntgames: usize,
pub quakecraft: usize,
pub skywars: usize,
pub bedwars: usize,
pub survival_games: usize,
pub wool_games: usize,
pub legacy: usize,
pub replay: usize,
pub speed_uhc: usize,
pub smp: usize,
pub gingerbread: usize,
pub uhc: usize,
pub arcade: usize
}