From f9672de5964b3d51f9e4f1643e4abd51aacff84a Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Sat, 8 Feb 2020 14:18:37 -0500 Subject: [PATCH] Polish up the command's output --- youmubot-osu/src/discord/server_rank.rs | 27 ++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/youmubot-osu/src/discord/server_rank.rs b/youmubot-osu/src/discord/server_rank.rs index 3365b88..b7aa618 100644 --- a/youmubot-osu/src/discord/server_rank.rs +++ b/youmubot-osu/src/discord/server_rank.rs @@ -6,9 +6,10 @@ use serenity::{ model::channel::Message, utils::MessageBuilder, }; -use std::collections::HashMap; use youmubot_prelude::*; +const ITEMS_PER_PAGE: usize = 10; + #[command("ranks")] #[description = "See the server's ranks"] #[usage = "[mode (Std, Taiko, Catch, Mania) = Std]"] @@ -17,7 +18,7 @@ use youmubot_prelude::*; pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandResult { let mode = args.single::().map(|v| v.0).unwrap_or(Mode::Std); let guild = m.guild_id.expect("Guild-only command"); - let mut users = OsuSavedUsers::open(&*ctx.data.read()) + let users = OsuSavedUsers::open(&*ctx.data.read()) .borrow() .expect("DB initialized") .iter() @@ -28,25 +29,32 @@ pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandRes .get(mode as usize) .cloned() .and_then(|pp| pp) - .map(|pp| (pp, member.distinct())) + .map(|pp| (pp, member.distinct(), osu_user.last_update.clone())) }) }) .collect::>(); + let last_update = users.iter().map(|(_, _, a)| a).min().cloned(); + let mut users = users + .into_iter() + .map(|(a, b, _)| (a, b)) + .collect::>(); users.sort_by(|(a, _), (b, _)| (*b).partial_cmp(a).unwrap_or(std::cmp::Ordering::Equal)); if users.is_empty() { m.reply(&ctx, "No saved users in the current server...")?; return Ok(()); } + let last_update = last_update.unwrap(); ctx.data.get_cloned::().paginate_fn( ctx.clone(), m.channel_id, move |page: u8, e: &mut EditMessage| { - let start = (page as usize) * 5; + let start = (page as usize) * ITEMS_PER_PAGE; if start >= users.len() { return (e, Err(Error("No more items".to_owned()))); } - let users = users.iter().skip(start).take(5); + let total_len = users.len(); + let users = users.iter().skip(start).take(ITEMS_PER_PAGE); let mut content = MessageBuilder::new(); content .push_line("```") @@ -56,12 +64,17 @@ pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandRes content .push(format!( "{:>4} | {:>7.2} | ", - format!("#{}", id + start), + format!("#{}", 1 + id + start), pp )) .push_line_safe(member); } - content.push("```"); + content.push_line("```").push_line(format!( + "Page **{}**/**{}**. Last updated: `{}`", + page + 1, + (total_len + ITEMS_PER_PAGE - 1) / ITEMS_PER_PAGE, + last_update.to_rfc2822() + )); (e.content(content.build()), Ok(())) }, std::time::Duration::from_secs(60),