Polish up the command's output

This commit is contained in:
Natsu Kagami 2020-02-08 14:18:37 -05:00
parent 3b24c1ec09
commit f9672de596
Signed by: nki
GPG key ID: 73376E117CD20735

View file

@ -6,9 +6,10 @@ use serenity::{
model::channel::Message, model::channel::Message,
utils::MessageBuilder, utils::MessageBuilder,
}; };
use std::collections::HashMap;
use youmubot_prelude::*; use youmubot_prelude::*;
const ITEMS_PER_PAGE: usize = 10;
#[command("ranks")] #[command("ranks")]
#[description = "See the server's ranks"] #[description = "See the server's ranks"]
#[usage = "[mode (Std, Taiko, Catch, Mania) = Std]"] #[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 { pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandResult {
let mode = args.single::<ModeArg>().map(|v| v.0).unwrap_or(Mode::Std); let mode = args.single::<ModeArg>().map(|v| v.0).unwrap_or(Mode::Std);
let guild = m.guild_id.expect("Guild-only command"); 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() .borrow()
.expect("DB initialized") .expect("DB initialized")
.iter() .iter()
@ -28,25 +29,32 @@ pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandRes
.get(mode as usize) .get(mode as usize)
.cloned() .cloned()
.and_then(|pp| pp) .and_then(|pp| pp)
.map(|pp| (pp, member.distinct())) .map(|pp| (pp, member.distinct(), osu_user.last_update.clone()))
}) })
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let last_update = users.iter().map(|(_, _, a)| a).min().cloned();
let mut users = users
.into_iter()
.map(|(a, b, _)| (a, b))
.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));
if users.is_empty() { if users.is_empty() {
m.reply(&ctx, "No saved users in the current server...")?; m.reply(&ctx, "No saved users in the current server...")?;
return Ok(()); return Ok(());
} }
let last_update = last_update.unwrap();
ctx.data.get_cloned::<ReactionWatcher>().paginate_fn( ctx.data.get_cloned::<ReactionWatcher>().paginate_fn(
ctx.clone(), ctx.clone(),
m.channel_id, m.channel_id,
move |page: u8, e: &mut EditMessage| { move |page: u8, e: &mut EditMessage| {
let start = (page as usize) * 5; let start = (page as usize) * ITEMS_PER_PAGE;
if start >= users.len() { if start >= users.len() {
return (e, Err(Error("No more items".to_owned()))); 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(); let mut content = MessageBuilder::new();
content content
.push_line("```") .push_line("```")
@ -56,12 +64,17 @@ pub fn server_rank(ctx: &mut Context, m: &Message, mut args: Args) -> CommandRes
content content
.push(format!( .push(format!(
"{:>4} | {:>7.2} | ", "{:>4} | {:>7.2} | ",
format!("#{}", id + start), format!("#{}", 1 + id + start),
pp pp
)) ))
.push_line_safe(member); .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(())) (e.content(content.build()), Ok(()))
}, },
std::time::Duration::from_secs(60), std::time::Duration::from_secs(60),