-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmod.rs
52 lines (47 loc) · 1.87 KB
/
mod.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::str::FromStr;
use rocket::{Rocket, Build, State, serde::json::Json};
use crate::{MarsAPIState, socket::leaderboard::{ScoreType, LeaderboardEntry, LeaderboardPeriod}, util::{r#macro::unwrap_helper, error::ApiErrorResponder}};
use crate::util::string::enumify;
const PUBLIC_SCORE_TYPES : &[ScoreType] = &[
ScoreType::Kills,
ScoreType::Deaths,
ScoreType::FirstBloods,
ScoreType::Wins,
ScoreType::Losses,
ScoreType::Ties,
ScoreType::Xp,
ScoreType::CoreLeaks,
ScoreType::CoreBlockDestroys,
ScoreType::DestroyableDestroys,
ScoreType::DestroyableBlockDestroys,
ScoreType::FlagCaptures,
ScoreType::FlagDrops,
ScoreType::FlagPickups,
ScoreType::FlagDefends,
ScoreType::FlagHoldTime,
ScoreType::WoolCaptures,
ScoreType::WoolDrops,
ScoreType::WoolPickups,
ScoreType::WoolDefends,
ScoreType::ControlPointCaptures,
ScoreType::HighestKillstreak
];
#[get("/<score_type>/<period>?<limit>")]
async fn get_leaderboard_entries(
state: &State<MarsAPIState>,
score_type: &str,
period: &str,
limit: Option<u32>
) -> Result<Json<Vec<LeaderboardEntry>>, ApiErrorResponder> {
let score_type = unwrap_helper::return_default!(ScoreType::from_str(enumify(score_type).as_str()).ok(), Err(ApiErrorResponder::validation_error()));
if !PUBLIC_SCORE_TYPES.contains(&score_type) {
return Err(ApiErrorResponder::unauthorized());
};
let period = unwrap_helper::return_default!(LeaderboardPeriod::from_str(enumify(period).as_str()).ok(), Err(ApiErrorResponder::validation_error()));
let limit = limit.unwrap_or(10);
let leaderboard = score_type.to_leaderboard(&state.leaderboards).fetch_top(&period, if limit > 50 { 50 } else { limit }).await;
Ok(Json(leaderboard))
}
pub fn mount(rocket: Rocket<Build>) -> Rocket<Build> {
rocket.mount("/mc/leaderboards", routes![get_leaderboard_entries])
}