From aff2f93714d1d0f47698faee071ef22e439eb68e Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Wed, 14 Feb 2024 14:32:26 +0100 Subject: [PATCH] Make server rank more(?) parallel and introduce calculated pp --- youmubot-osu/src/discord/server_rank.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/youmubot-osu/src/discord/server_rank.rs b/youmubot-osu/src/discord/server_rank.rs index 66304c5..2af0c9a 100644 --- a/youmubot-osu/src/discord/server_rank.rs +++ b/youmubot-osu/src/discord/server_rank.rs @@ -15,7 +15,7 @@ use serenity::{ model::channel::Message, utils::MessageBuilder, }; -use youmubot_prelude::*; +use youmubot_prelude::{stream::FuturesUnordered, *}; #[derive(Debug, Clone, Copy)] enum ModeOrTotal { @@ -238,12 +238,17 @@ pub async fn show_leaderboard(ctx: &Context, m: &Message, mut args: Args) -> Com .and_then(|m| osu_users.get(&m.user.id).map(|ou| (m.distinct(), ou.id))), ) }) - .filter_map(|(mem, osu_id)| { + .collect::>() + .await + .into_iter() + .map(|(mem, osu_id)| { osu.scores(bm.0.beatmap_id, move |f| { f.user(UserID::ID(osu_id)).mode(bm.1) }) .map(|r| Some((mem, r.ok()?))) }) + .collect::>() + .filter_map(future::ready) .collect::>() .await .into_iter() @@ -252,7 +257,7 @@ pub async fn show_leaderboard(ctx: &Context, m: &Message, mut args: Args) -> Com scores .into_iter() .filter_map(|score| { - let pp = score.pp.or_else(|| { + let pp = score.pp.map(|v| (true, v)).or_else(|| { oppai_map .get_pp_from( mode, @@ -266,6 +271,7 @@ pub async fn show_leaderboard(ctx: &Context, m: &Message, mut args: Args) -> Com score.mods, ) .ok() + .map(|v| (false, v)) })?; Some((pp, mem.clone(), score)) }) @@ -352,8 +358,8 @@ pub async fn show_leaderboard(ctx: &Context, m: &Message, mut args: Args) -> Com }; let pp = scores .iter() - .map(|(pp, _, s)| match order { - OrderBy::PP => format!("{:.2}", pp), + .map(|((official, pp), _, s)| match order { + OrderBy::PP => format!("{:.2}{}", pp, if *official { "" } else { "[?]" }), OrderBy::Score => crate::discord::embeds::grouped_number(if has_lazer_score { s.normalized_score as u64 } else { s.score.unwrap() }), }) .collect::>();