Add score endpoint and expose more apiv2 stuff

This commit is contained in:
Natsu Kagami 2024-06-19 20:25:08 +02:00 committed by Natsu Kagami
parent e61cbb327a
commit a158e8fbe1
5 changed files with 21 additions and 35 deletions

2
Cargo.lock generated
View file

@ -1804,7 +1804,7 @@ dependencies = [
[[package]] [[package]]
name = "rosu-v2" name = "rosu-v2"
version = "0.8.0" version = "0.8.0"
source = "git+https://github.com/MaxOhn/rosu-v2?rev=d2cd3ff8417e66890f0cd8ca38bc34717a9629dd#d2cd3ff8417e66890f0cd8ca38bc34717a9629dd" source = "git+https://github.com/MaxOhn/rosu-v2?branch=lazer#4fb91316a00f78c322fc43a71b25ab6b4d080b16"
dependencies = [ dependencies = [
"bytes", "bytes",
"dashmap", "dashmap",

View file

@ -15,7 +15,7 @@ lazy_static = "1.4.0"
regex = "1.5.6" regex = "1.5.6"
reqwest = "0.11.10" reqwest = "0.11.10"
rosu-pp = "1.0" rosu-pp = "1.0"
rosu-v2 = { git = "https://github.com/MaxOhn/rosu-v2", rev = "d2cd3ff8417e66890f0cd8ca38bc34717a9629dd" } rosu-v2 = { git = "https://github.com/MaxOhn/rosu-v2", branch = "lazer" }
rosu-map = "0.1" rosu-map = "0.1"
time = "0.3" time = "0.3"
serde = { version = "1.0.137", features = ["derive"] } serde = { version = "1.0.137", features = ["derive"] }

View file

@ -95,4 +95,13 @@ impl Client {
f(&mut r); f(&mut r);
r.build(self).await r.build(self).await
} }
pub async fn score(&self, score_id: u64) -> Result<Option<Score>, Error> {
let s = match self.rosu.score(score_id).await {
Ok(v) => v,
Err(rosu_v2::error::OsuError::NotFound) => return Ok(None),
e @ _ => e?,
};
Ok(Some(s.into()))
}
} }

View file

@ -558,43 +558,17 @@ pub struct Score {
pub max_combo: u64, pub max_combo: u64,
pub perfect: bool, pub perfect: bool,
// Some APIv2 stats
pub server_accuracy: f64,
pub global_rank: Option<u32>,
pub effective_pp: Option<f64>,
pub lazer_build_id: Option<u32>, pub lazer_build_id: Option<u32>,
} }
impl Score { impl Score {
/// Given the play's mode, calculate the score's accuracy. /// Given the play's mode, calculate the score's accuracy.
pub fn accuracy(&self, mode: Mode) -> f64 { pub fn accuracy(&self, _mode: Mode) -> f64 {
100.0 self.server_accuracy
* match mode {
Mode::Std => {
(6 * self.count_300 + 2 * self.count_100 + self.count_50) as f64
/ (6.0
* (self.count_300 + self.count_100 + self.count_50 + self.count_miss)
as f64)
}
Mode::Taiko => {
(2 * self.count_300 + self.count_100) as f64
/ 2.0
/ (self.count_300 + self.count_100 + self.count_miss) as f64
}
Mode::Catch => {
(self.count_300 + self.count_100) as f64
/ (self.count_300 + self.count_100 + self.count_miss + self.count_katu/* # of droplet misses */)
as f64
}
Mode::Mania => {
((self.count_geki /* MAX */ + self.count_300) * 6
+ self.count_katu /* 200 */ * 4
+ self.count_100 * 2
+ self.count_50) as f64
/ 6.0
/ (self.count_geki
+ self.count_300
+ self.count_katu
+ self.count_100
+ self.count_50
+ self.count_miss) as f64
}
}
} }
} }

View file

@ -124,6 +124,9 @@ impl From<rosu::score::Score> for Score {
normalized_score: s.score, normalized_score: s.score,
pp: s.pp.map(|v| v as f64), pp: s.pp.map(|v| v as f64),
rank: if s.passed { s.grade.into() } else { Rank::F }, rank: if s.passed { s.grade.into() } else { Rank::F },
server_accuracy: s.accuracy as f64,
global_rank: s.rank_global,
effective_pp: s.weight.map(|w| w.pp as f64),
mods: s mods: s
.mods .mods
.iter() .iter()