osu updatelb command (#8)

* Make `paginate` take a Paginate trait impl, while `paginate_fn` takes a function

* Add `updatelb` command

* Implement a member cache

* Update member queries to use member cache

* Allow everyone to updatelb
This commit is contained in:
Natsu Kagami 2020-11-23 02:26:18 -05:00 committed by GitHub
parent b8471152d3
commit 6bf2779d61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 241 additions and 47 deletions

View file

@ -172,7 +172,7 @@ pub async fn ranks(ctx: &Context, m: &Message) -> CommandResult {
let total_pages = (ranks.len() + ITEMS_PER_PAGE - 1) / ITEMS_PER_PAGE;
let last_updated = ranks.iter().map(|(_, cfu)| cfu.last_update).min().unwrap();
paginate(
paginate_fn(
move |page, ctx, msg| {
let ranks = ranks.clone();
Box::pin(async move {
@ -255,16 +255,17 @@ pub async fn contestranks(ctx: &Context, m: &Message, mut args: Args) -> Command
let data = ctx.data.read().await;
let contest_id: u64 = args.single()?;
let guild = m.guild_id.unwrap(); // Guild-only command
let member_cache = data.get::<MemberCache>().unwrap();
let members = CfSavedUsers::open(&*data).borrow()?.clone();
let members = members
.into_iter()
.map(|(user_id, cf_user)| {
guild
.member(&ctx, user_id)
member_cache
.query(&ctx, user_id, guild)
.map(|v| v.map(|v| (cf_user.handle, v)))
})
.collect::<stream::FuturesUnordered<_>>()
.filter_map(|v| future::ready(v.ok()))
.filter_map(|v| future::ready(v))
.collect::<HashMap<_, _>>()
.await;
let http = data.get::<CFClient>().unwrap();
@ -301,7 +302,7 @@ pub async fn contestranks(ctx: &Context, m: &Message, mut args: Args) -> Command
const ITEMS_PER_PAGE: usize = 10;
let total_pages = (ranks.len() + ITEMS_PER_PAGE - 1) / ITEMS_PER_PAGE;
paginate(
paginate_fn(
move |page, ctx, msg| {
let contest = contest.clone();
let problems = problems.clone();