ddapi-rs 0.10.0

A simple Rust library to get data from DDNet and DDStats APIs
Documentation
use crate::scheme::DDSTATS_BASE_URL;
use crate::util::prelude::{encode, seconds_to_hours, slugify2};
use serde_derive::{Deserialize, Serialize};

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Player {
    pub points_graph: Vec<PointsGraph>,
    pub recent_finishes: Vec<RecentFinish>,
    pub favourite_teammates: Vec<FavouriteTeammate>,
    pub profile: Profile,
    pub is_mapper: bool,
    pub finishes: Vec<Finish>,
    pub unfinished_maps: Vec<UnfinishedMap>,
    pub points: Points,
    pub recent_activity: Vec<RecentActivity>,
    pub recent_player_info: Vec<RecentPlayerInfo>,
    pub most_played_maps: Vec<MostPlayedMap>,
    pub most_played_gametypes: Vec<MostPlayed>,
    pub most_played_categories: Vec<MostPlayed>,
    pub most_played_locations: Vec<MostPlayed>,
    pub playtime_per_month: Vec<PlaytimePerMonth>,
    pub general_activity: Option<GeneralActivity>,
    pub favourite_rank1s_teammates: Vec<FavouriteRank1sTeammates>,
    pub all_top_10s: Vec<AllTop10>,
    pub recent_top_10s: Vec<RecentTop10>,
}

impl Player {
    pub fn url(&self) -> String {
        format!(
            "https://{}/player/{}",
            DDSTATS_BASE_URL,
            encode(&self.profile.name)
        )
    }

    pub fn url_with_name(player: &str) -> String {
        format!("https://{}/player/{}", DDSTATS_BASE_URL, encode(player))
    }

    pub fn api(player: &str) -> String {
        format!(
            "https://{}/player/json?player={}",
            DDSTATS_BASE_URL,
            encode(player)
        )
    }
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PointsGraph {
    pub date: String,
    pub points: i64,
    pub rank_points: i64,
    pub team_points: i64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RecentFinish {
    pub map: StatsMap,
    pub name: String,
    pub time: f64,
    pub timestamp: String,
    pub server: String,
    pub cp1: f64,
    pub cp2: f64,
    pub cp3: f64,
    pub cp4: f64,
    pub cp5: f64,
    pub cp6: f64,
    pub cp7: f64,
    pub cp8: f64,
    pub cp9: f64,
    pub cp10: f64,
    pub cp11: f64,
    pub cp12: f64,
    pub cp13: f64,
    pub cp14: f64,
    pub cp15: f64,
    pub cp16: f64,
    pub cp17: f64,
    pub cp18: f64,
    pub cp19: f64,
    pub cp20: f64,
    pub cp21: f64,
    pub cp22: f64,
    pub cp23: f64,
    pub cp24: f64,
    pub cp25: f64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StatsMap {
    pub map: String,
    pub server: String,
    pub points: u8,
    pub stars: u8,
    pub mapper: String,
    pub timestamp: Option<String>,
}

impl StatsMap {
    pub fn url(&self) -> String {
        format!(
            "https://{}/map/{}",
            DDSTATS_BASE_URL,
            encode(&slugify2(&self.map))
        )
    }

    pub fn url_with_name(map: &str) -> String {
        format!(
            "https://{}/map/{}",
            DDSTATS_BASE_URL,
            encode(&slugify2(map))
        )
    }

    pub fn api() -> String {
        format!("https://{}/maps/json", DDSTATS_BASE_URL)
    }
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FavouriteTeammate {
    pub name: String,
    pub ranks_together: i64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Profile {
    pub name: String,
    pub points: i32,
    pub clan: Option<String>,
    pub country: Option<i32>,
    pub skin_name: Option<String>,
    pub skin_color_body: Option<i32>,
    pub skin_color_feet: Option<i32>,
    pub most_played_location: Option<String>,
}

impl Profile {
    pub fn url(&self) -> String {
        format!("https://{}/player/{}", DDSTATS_BASE_URL, encode(&self.name))
    }

    pub fn url_with_name(player: &str) -> String {
        format!("https://{}/player/{}", DDSTATS_BASE_URL, encode(player))
    }

    pub fn api(player: &str) -> String {
        format!(
            "https://{}/profile/json?player={}",
            DDSTATS_BASE_URL,
            encode(player)
        )
    }
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Finish {
    pub map: StatsMap,
    pub name: String,
    pub time: f64,
    pub timestamp: String,
    pub server: String,
    pub rank: u64,
    pub team_rank: Option<u64>,
    pub seconds_played: Option<u64>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnfinishedMap {
    pub map: StatsMap,
    pub finishes: u64,
    pub finishes_rank: Option<u64>,
    pub median_time: Option<f64>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Points {
    pub weekly_points: Option<PPoints>,
    pub monthly_points: Option<PPoints>,
    pub yearly_points: Option<PPoints>,
    pub points: StatsPoints,
    pub rank_points: StatsPoints,
    pub team_points: StatsPoints,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PPoints {
    pub points: i64,
    pub rank: i64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct StatsPoints {
    pub moderate: Option<Type>,
    pub insane: Option<Type>,
    pub oldschool: Option<Type>,
    pub fun: Option<Type>,
    pub race: Option<Type>,
    pub total: Option<Type>,
    #[serde(rename = "DDmaX.Easy")]
    pub ddmax_easy: Option<Type>,
    pub novice: Option<Type>,
    pub dummy: Option<Type>,
    #[serde(rename = "DDmaX.Pro")]
    pub ddmax_pro: Option<Type>,
    pub brutal: Option<Type>,
    #[serde(rename = "DDmaX.Nut")]
    pub ddmax_nut: Option<Type>,
    pub solo: Option<Type>,
    #[serde(rename = "DDmaX.Next")]
    pub ddmax_next: Option<Type>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Type {
    pub points: i64,
    pub rank: i64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RecentActivity {
    pub name: String,
    pub date: String,
    pub map_name: String,
    pub map: Option<StatsMap>,
    pub seconds_played: i64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RecentPlayerInfo {
    pub name: String,
    pub clan: String,
    pub country: i16,
    pub skin_name: Option<String>,
    pub skin_color_body: Option<u64>,
    pub skin_color_feet: Option<u64>,
    pub last_seen: String,
    pub seconds_played: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MostPlayedMap {
    pub map_name: String,
    pub seconds_played: u64,
    pub map: Option<StatsMap>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MostPlayed {
    pub key: String,
    pub seconds_played: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlaytimePerMonth {
    pub year_month: String,
    pub month: String,
    pub seconds_played: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeneralActivity {
    pub total_seconds_played: u64,
    pub start_of_playtime: String,
    pub average_seconds_played: u64,
}

impl GeneralActivity {
    pub fn total_seconds_played_to_hours(&self) -> f64 {
        seconds_to_hours(self.total_seconds_played as f64)
    }

    pub fn average_seconds_played_to_hours(&self) -> f64 {
        seconds_to_hours(self.average_seconds_played as f64)
    }
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FavouriteRank1sTeammates {
    pub name: String,
    pub ranks_together: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AllTop10 {
    pub map: StatsMap,
    pub name: String,
    pub time: f64,
    pub rank: u64,
    pub team_rank: Option<u64>,
    pub team_time: Option<f64>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RecentTop10 {
    pub rank_type: String,
    pub map: String,
    pub time: f64,
    pub rank: u64,
    pub timestamp: String,
    pub server: String,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InfoSMap {
    pub map: StatsMap,
    pub finishes: u64,
    pub finishes_rank: u64,
    pub median_time: f64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RankingSMap {
    pub rank: u64,
    pub timestamp: Option<String>,
    pub name: String,
    pub time: f64,
    pub map: String,
    pub server: String,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TeamRankingSMap {
    pub rank: u64,
    pub timestamp: Option<String>,
    pub id: Vec<u64>,
    pub players: Vec<String>,
    pub time: f64,
    pub map: String,
    pub server: String,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TimeCpsSMap {
    pub name: String,
    pub cp1: f64,
    pub cp2: f64,
    pub cp3: f64,
    pub cp4: f64,
    pub cp5: f64,
    pub cp6: f64,
    pub cp7: f64,
    pub cp8: f64,
    pub cp9: f64,
    pub cp10: f64,
    pub cp11: f64,
    pub cp12: f64,
    pub cp13: f64,
    pub cp14: f64,
    pub cp15: f64,
    pub cp16: f64,
    pub cp17: f64,
    pub cp18: f64,
    pub cp19: f64,
    pub cp20: f64,
    pub cp21: f64,
    pub cp22: f64,
    pub cp23: f64,
    pub cp24: f64,
    pub cp25: f64,
    pub time: f64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PlaytimeSMap {
    pub name: String,
    pub seconds_played: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Map {
    pub info: InfoSMap,
    pub rankings: Vec<RankingSMap>,
    pub team_rankings: Vec<TeamRankingSMap>,
    pub time_cps: Vec<TimeCpsSMap>,
    pub playtime: Vec<PlaytimeSMap>,
}

impl Map {
    pub fn url(&self) -> String {
        format!(
            "https://{}/map/{}",
            DDSTATS_BASE_URL,
            encode(&self.info.map.map)
        )
    }

    pub fn url_with_name(map: &str) -> String {
        format!("https://{}/map/{}", DDSTATS_BASE_URL, encode(map))
    }

    pub fn api(map: &str) -> String {
        format!("https://{}/map/json?map={}", DDSTATS_BASE_URL, encode(map))
    }
}