Experimental query members by iterator

This commit is contained in:
Natsu Kagami 2023-12-27 18:02:21 +01:00
parent 125bc3bd61
commit a64b9e1157
Signed by: nki
GPG key ID: 55A032EB38B49ADB

View file

@ -1,4 +1,4 @@
use std::str::FromStr; use std::{collections::HashMap, str::FromStr};
use super::{ use super::{
db::{OsuSavedUsers, OsuUserBests}, db::{OsuSavedUsers, OsuUserBests},
@ -49,32 +49,37 @@ pub async fn server_rank(ctx: &Context, m: &Message, mut args: Args) -> CommandR
.single::<ModeOrTotal>() .single::<ModeOrTotal>()
.unwrap_or(ModeOrTotal::Mode(Mode::Std)); .unwrap_or(ModeOrTotal::Mode(Mode::Std));
let guild = m.guild_id.expect("Guild-only command"); let guild = m.guild_id.expect("Guild-only command");
let member_cache = data.get::<MemberCache>().unwrap(); // let member_cache = data.get::<MemberCache>().unwrap();
let users = data let osu_users = data
.get::<OsuSavedUsers>() .get::<OsuSavedUsers>()
.unwrap() .unwrap()
.all() .all()
.await? .await?
.into_iter() .into_iter()
.map(|osu_user| async move { .map(|v| (v.user_id, v))
member_cache .collect::<HashMap<_, _>>();
.query(&ctx, osu_user.user_id, guild) let users = guild
.await .members_iter(ctx)
.and_then(|member| { .filter_map(|m| {
let pp = match mode { future::ready(
ModeOrTotal::Total m.ok()
if osu_user.pp.iter().any(|v| v.is_some_and(|v| v > 0.0)) => .and_then(|m| osu_users.get(&m.user.id).map(|ou| (m, ou))),
{ )
Some(osu_user.pp.iter().map(|v| v.unwrap_or(0.0)).sum()) })
} .filter_map(|(member, osu_user)| {
ModeOrTotal::Mode(m) => osu_user.pp.get(m as usize).and_then(|v| *v), future::ready(|| -> Option<_> {
_ => None, let pp = match mode {
}?; ModeOrTotal::Total
Some((pp, member.user.name, osu_user.last_update)) if osu_user.pp.iter().any(|v| v.is_some_and(|v| v > 0.0)) =>
}) {
Some(osu_user.pp.iter().map(|v| v.unwrap_or(0.0)).sum())
}
ModeOrTotal::Mode(m) => osu_user.pp.get(m as usize).and_then(|v| *v),
_ => None,
}?;
Some((pp, member.user.name, osu_user.last_update))
}())
}) })
.collect::<stream::FuturesUnordered<_>>()
.filter_map(future::ready)
.collect::<Vec<_>>() .collect::<Vec<_>>()
.await; .await;
let last_update = users.iter().map(|(_, _, a)| a).min().cloned(); let last_update = users.iter().map(|(_, _, a)| a).min().cloned();