Add username display to server ranks

This commit is contained in:
Natsu Kagami 2024-02-04 23:50:09 +01:00
parent f7ea23ed3b
commit de06c8e37f
Signed by: nki
GPG key ID: 55A032EB38B49ADB
2 changed files with 46 additions and 18 deletions

View file

@ -74,8 +74,14 @@ impl youmubot_prelude::Announcer for Announcer {
.await .await
{ {
Ok(v) => { Ok(v) => {
osu_user.pp = v
.iter()
.map(|u| u.pp.clone())
.collect::<Vec<_>>()
.try_into()
.unwrap();
osu_user.username = v.into_iter().next().unwrap().username.into();
osu_user.last_update = now; osu_user.last_update = now;
osu_user.pp = v.try_into().unwrap();
let id = osu_user.id; let id = osu_user.id;
ctx.data ctx.data
.read() .read()
@ -110,7 +116,7 @@ impl Announcer {
user_id: UserId, user_id: UserId,
channels: Vec<ChannelId>, channels: Vec<ChannelId>,
mode: Mode, mode: Mode,
) -> Result<Option<f64>, Error> { ) -> Result<User, Error> {
let days_since_last_update = (now - osu_user.last_update).num_days() + 1; let days_since_last_update = (now - osu_user.last_update).num_days() + 1;
let last_update = osu_user.last_update; let last_update = osu_user.last_update;
let (scores, user) = { let (scores, user) = {
@ -126,8 +132,8 @@ impl Announcer {
(scores, user) (scores, user)
}; };
let client = self.client.clone(); let client = self.client.clone();
let pp = user.pp;
let ctx = ctx.clone(); let ctx = ctx.clone();
let _user = user.clone();
spawn_future(async move { spawn_future(async move {
let event_scores = user let event_scores = user
.events .events
@ -162,7 +168,7 @@ impl Announcer {
.await .await
.pls_ok(); .pls_ok();
}); });
Ok(pp) Ok(_user)
} }
async fn scan_user(&self, u: &OsuUser, mode: Mode) -> Result<Vec<(u8, Score)>, Error> { async fn scan_user(&self, u: &OsuUser, mode: Mode) -> Result<Vec<(u8, Score)>, Error> {

View file

@ -77,15 +77,15 @@ pub async fn server_rank(ctx: &Context, m: &Message, mut args: Args) -> CommandR
ModeOrTotal::Mode(m) => osu_user.pp.get(m as usize).and_then(|v| *v), ModeOrTotal::Mode(m) => osu_user.pp.get(m as usize).and_then(|v| *v),
_ => None, _ => None,
}?; }?;
Some((pp, member.user.name, osu_user.last_update)) Some((pp, member.user.name, osu_user))
}()) }())
}) })
.collect::<Vec<_>>() .collect::<Vec<_>>()
.await; .await;
let last_update = users.iter().map(|(_, _, a)| a).min().cloned(); let last_update = users.iter().map(|(_, _, a)| a.last_update).min();
let mut users = users let mut users = users
.into_iter() .into_iter()
.map(|(a, b, _)| (a, b)) .map(|(a, b, u)| (a, (b, u.clone())))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
users.sort_by(|(a, _), (b, _)| (*b).partial_cmp(a).unwrap_or(std::cmp::Ordering::Equal)); users.sort_by(|(a, _), (b, _)| (*b).partial_cmp(a).unwrap_or(std::cmp::Ordering::Equal));
@ -109,20 +109,42 @@ pub async fn server_rank(ctx: &Context, m: &Message, mut args: Args) -> CommandR
} }
let total_len = users.len(); let total_len = users.len();
let users = &users[start..end]; let users = &users[start..end];
let username_len = users.iter().map(|(_, u)| u.len()).max().unwrap_or(8).max(8); let username_len = users
.iter()
.map(|(_, (_, u))| u.username.len())
.max()
.unwrap_or(8)
.max(8);
let member_len = users
.iter()
.map(|(_, (mem, _))| mem.len())
.max()
.unwrap_or(8)
.max(8);
let mut content = MessageBuilder::new(); let mut content = MessageBuilder::new();
content content
.push_line("```") .push_line("```")
.push_line("Rank | pp | Username") .push_line(format!(
.push_line(format!("-----------------{:-<uw$}", "", uw = username_len)); "Rank | pp | {:uw$} | Member",
for (id, (pp, member)) in users.iter().enumerate() { "Username",
content uw = username_len
.push(format!(
"{:>4} | {:>8.2} | ",
format!("#{}", 1 + id + start),
pp
)) ))
.push_line_safe(member); .push_line(format!(
"------------------{:-<uw$}---{:-<mw$}",
"",
"",
uw = username_len,
mw = member_len
));
for (id, (pp, (member, u))) in users.iter().enumerate() {
content.push_line_safe(format!(
"{:>4} | {:>8.2} | {:uw$} | {}",
format!("#{}", 1 + id + start),
pp,
u.username,
member,
uw = username_len
));
} }
content.push_line("```").push_line(format!( content.push_line("```").push_line(format!(
"Page **{}**/**{}**. Last updated: `{}`", "Page **{}**/**{}**. Last updated: `{}`",