From 78fa1214043adccd407449b0dd728270ce8ad442 Mon Sep 17 00:00:00 2001 From: bluepython508 <16466646+bluepython508@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:40:38 +0000 Subject: [PATCH] Speed up ST command at the cost of large servers --- src/main.rs | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 21cbf03..2b4a584 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use std::path::Path; use eyre::{Context as _, Error, OptionExt, Result}; -use futures::{FutureExt, TryStreamExt}; +use futures::FutureExt; use poise::serenity_prelude as serenity; use rand::seq::SliceRandom; use rusqlite::OptionalExtension; @@ -179,7 +179,11 @@ async fn dawn(ctx: Context<'_>) -> Result<()> { } #[poise::command(slash_command, ephemeral)] -async fn join(ctx: Context<'_>, to: serenity::UserId, user: Option) -> Result<()> { +async fn join( + ctx: Context<'_>, + to: serenity::UserId, + user: Option, +) -> Result<()> { let guild = ctx .guild_id() .ok_or_eyre("This bot only works in servers")?; @@ -195,7 +199,9 @@ async fn join(ctx: Context<'_>, to: serenity::UserId, user: Option { - guild.move_member(ctx, user.unwrap_or(ctx.author().id), channel).await?; + guild + .move_member(ctx, user.unwrap_or(ctx.author().id), channel) + .await?; ctx.reply("Joined player").await?; } None => { @@ -213,19 +219,19 @@ async fn st(ctx: Context<'_>, mut spectators: Vec) -> Result<( let GuildData { st, .. } = ctx.data().get(guild).await?; spectators.push(ctx.author().id); - guild - .members_iter(&ctx) - .try_for_each(|member| { + futures::future::try_join_all(guild.members(&ctx, None, None).await?.into_iter().map( + |member| { let spectators = &spectators; async move { - if spectators.contains(&member.user.id) { - member.add_role(&ctx, st).await - } else { - member.remove_role(&ctx, st).await + match (spectators.contains(&member.user.id), member.roles.contains(&st)) { + (true, true) | (false, false) => Ok(()), + (true, false) => member.add_role(&ctx, st).await, + (false, true) => member.remove_role(&ctx, st).await, } } - }) - .await?; + }, + )) + .await?; ctx.reply(format!("{} members given ST", spectators.len())) .await?; @@ -313,7 +319,14 @@ async fn main() -> Result<()> { let framework = poise::Framework::builder() .options(poise::FrameworkOptions { - commands: vec![dusk(), dawn(), st(), currently_playing(), join(), configure()], + commands: vec![ + dusk(), + dawn(), + st(), + currently_playing(), + join(), + configure(), + ], event_handler: |ctx, ev, ctxf, data| on_event(ctx, ev, ctxf, data).boxed(), ..Default::default() })