diff --git a/youmubot-osu/src/discord/announcer.rs b/youmubot-osu/src/discord/announcer.rs index c06910d..ffceb7e 100644 --- a/youmubot-osu/src/discord/announcer.rs +++ b/youmubot-osu/src/discord/announcer.rs @@ -1,15 +1,5 @@ -use super::db::{OsuSavedUsers, OsuUser}; -use super::{calculate_weighted_map_length, OsuClient}; -use super::{embeds::score_embed, BeatmapWithMode}; -use crate::{ - discord::beatmap_cache::BeatmapMetaCache, - discord::cache::save_beatmap, - discord::oppai_cache::{BeatmapCache, BeatmapContent}, - models::{Mode, Score, User, UserEventRank}, - request::UserID, - Client as Osu, -}; -use announcer::MemberToChannels; +use std::{convert::TryInto, sync::Arc}; + use serenity::builder::CreateMessage; use serenity::{ http::CacheHttp, @@ -18,11 +8,25 @@ use serenity::{ id::{ChannelId, UserId}, }, }; -use std::{convert::TryInto, sync::Arc}; + +use announcer::MemberToChannels; use youmubot_prelude::announcer::CacheAndHttp; -use youmubot_prelude::stream::{FuturesUnordered, TryStreamExt}; +use youmubot_prelude::stream::TryStreamExt; use youmubot_prelude::*; +use crate::{ + discord::beatmap_cache::BeatmapMetaCache, + discord::cache::save_beatmap, + discord::oppai_cache::{BeatmapCache, BeatmapContent}, + models::{Mode, Score, User, UserEventRank}, + request::UserID, + Client as Osu, +}; + +use super::db::{OsuSavedUsers, OsuUser}; +use super::{calculate_weighted_map_length, OsuClient}; +use super::{embeds::score_embed, BeatmapWithMode}; + /// osu! announcer's unique announcer key. pub const ANNOUNCER_KEY: &str = "osu"; diff --git a/youmubot-osu/src/discord/server_rank.rs b/youmubot-osu/src/discord/server_rank.rs index a890f14..40bc22e 100644 --- a/youmubot-osu/src/discord/server_rank.rs +++ b/youmubot-osu/src/discord/server_rank.rs @@ -16,7 +16,11 @@ use serenity::{ model::channel::Message, utils::MessageBuilder, }; -use youmubot_prelude::{stream::FuturesUnordered, *}; +use youmubot_prelude::{ + stream::FuturesUnordered, + table_format::{table_formatting, Align}, + *, +}; #[derive(Debug, Clone, Copy)] enum RankQuery { @@ -37,75 +41,6 @@ impl FromStr for RankQuery { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -enum Align { - Left, - Middle, - Right, -} - -impl Align { - fn pad(self, input: &str, len: usize) -> String { - match self { - Align::Left => format!("{: format!("{:^len$}", input), - Align::Right => format!("{:>len$}", input), - } - } -} - -fn table_formatting + std::fmt::Debug, Ts: AsRef<[[S; N]]>>( - headers: &[&'static str; N], - padding: &[Align; N], - table: Ts, -) -> String { - let table = table.as_ref(); - // get length for each column - let lens = headers - .iter() - .enumerate() - .map(|(i, header)| { - table - .iter() - .map(|r| r.as_ref()[i].as_ref().len()) - .max() - .unwrap_or(0) - .max(header.len()) - }) - .collect::>(); - // paint with message builder - let mut m = MessageBuilder::new(); - m.push_line("```"); - // headers first - for (i, header) in headers.iter().enumerate() { - if i > 0 { - m.push(" | "); - } - m.push(padding[i].pad(header, lens[i])); - } - m.push_line(""); - // separator - m.push_line(format!( - "{:-() + (lens.len() - 1) * 3 - )); - // table itself - for row in table { - let row = row.as_ref(); - for (i, cell) in row.iter().enumerate() { - if i > 0 { - m.push(" | "); - } - let cell = cell.as_ref(); - m.push(padding[i].pad(cell, lens[i])); - } - m.push_line(""); - } - m.push("```"); - m.build() -} - #[command("ranks")] #[description = "See the server's ranks"] #[usage = "[mode (Std, Taiko, Catch, Mania) = Std]"] diff --git a/youmubot-prelude/src/lib.rs b/youmubot-prelude/src/lib.rs index c46025d..6ca7c07 100644 --- a/youmubot-prelude/src/lib.rs +++ b/youmubot-prelude/src/lib.rs @@ -11,6 +11,7 @@ pub mod member_cache; pub mod pagination; pub mod ratelimit; pub mod setup; +pub mod table_format; pub use announcer::{Announcer, AnnouncerHandler}; pub use args::{ChannelId, Duration, RoleId, UserId, UsernameArg}; diff --git a/youmubot-prelude/src/table_format.rs b/youmubot-prelude/src/table_format.rs new file mode 100644 index 0000000..f44cf06 --- /dev/null +++ b/youmubot-prelude/src/table_format.rs @@ -0,0 +1,70 @@ +use serenity::all::MessageBuilder; + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum Align { + Left, + Middle, + Right, +} + +impl Align { + fn pad(self, input: &str, len: usize) -> String { + match self { + Align::Left => format!("{: format!("{:^len$}", input), + Align::Right => format!("{:>len$}", input), + } + } +} + +pub fn table_formatting + std::fmt::Debug, Ts: AsRef<[[S; N]]>>( + headers: &[&'static str; N], + padding: &[Align; N], + table: Ts, +) -> String { + let table = table.as_ref(); + // get length for each column + let lens = headers + .iter() + .enumerate() + .map(|(i, header)| { + table + .iter() + .map(|r| r.as_ref()[i].as_ref().len()) + .max() + .unwrap_or(0) + .max(header.len()) + }) + .collect::>(); + // paint with message builder + let mut m = MessageBuilder::new(); + m.push_line("```"); + // headers first + for (i, header) in headers.iter().enumerate() { + if i > 0 { + m.push(" | "); + } + m.push(padding[i].pad(header, lens[i])); + } + m.push_line(""); + // separator + m.push_line(format!( + "{:-() + (lens.len() - 1) * 3 + )); + // table itself + for row in table { + let row = row.as_ref(); + for (i, cell) in row.iter().enumerate() { + if i > 0 { + m.push(" | "); + } + let cell = cell.as_ref(); + m.push(padding[i].pad(cell, lens[i])); + } + m.push_line(""); + } + m.push("```"); + m.build() +}