use chrono::{serde::ts_seconds, DateTime, Utc};
use serde::Deserialize;
#[cfg(feature = "weekly_races")]
use crate::types::WeeklyRaceId;
use crate::{
helpers::string_u64,
types::{MinecraftSeed, Rank, Time},
user::UserProfile,
};
pub mod requests;
pub mod result;
#[cfg(test)]
pub mod tests;
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WeeklyRaceSeedInfo {
#[serde(deserialize_with = "string_u64")]
overworld: MinecraftSeed,
#[serde(deserialize_with = "string_u64")]
nether: MinecraftSeed,
#[serde(deserialize_with = "string_u64")]
the_end: MinecraftSeed,
#[serde(deserialize_with = "string_u64")]
rng: MinecraftSeed,
}
impl WeeklyRaceSeedInfo {
pub fn overworld(&self) -> MinecraftSeed {
self.overworld
}
pub fn nether(&self) -> MinecraftSeed {
self.nether
}
pub fn end(&self) -> MinecraftSeed {
self.the_end
}
pub fn rng(&self) -> MinecraftSeed {
self.rng
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WeeklyRaceLeaderboardRecord {
rank: Rank,
player: UserProfile,
time: Time,
replay_exist: bool,
}
impl WeeklyRaceLeaderboardRecord {
pub fn rank(&self) -> Rank {
self.rank
}
pub fn player(&self) -> &UserProfile {
&self.player
}
pub fn time(&self) -> Time {
self.time
}
pub fn replay_exists(&self) -> bool {
self.replay_exist
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WeeklyRaceLeaderboardInfo {
id: WeeklyRaceId,
seed: WeeklyRaceSeedInfo,
#[serde(with = "ts_seconds")]
ends_at: DateTime<Utc>,
leaderboard: Box<[WeeklyRaceLeaderboardRecord]>,
}
impl WeeklyRaceLeaderboardInfo {
pub fn id(&self) -> &WeeklyRaceId {
&self.id
}
pub fn seeds(&self) -> &WeeklyRaceSeedInfo {
&self.seed
}
pub fn ends_at(&self) -> &DateTime<Utc> {
&self.ends_at
}
pub fn leaderboard(&self) -> &[WeeklyRaceLeaderboardRecord] {
&self.leaderboard
}
}