mirror of
https://github.com/natsukagami/youmubot.git
synced 2025-04-19 00:38:54 +00:00
Experimental query members by iterator
This commit is contained in:
parent
125bc3bd61
commit
a64b9e1157
1 changed files with 26 additions and 21 deletions
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue