Speed up ST command at the cost of large servers

This commit is contained in:
bluepython508
2024-12-09 18:40:38 +00:00
parent 062a419c94
commit 78fa121404

View File

@@ -1,7 +1,7 @@
use std::path::Path; use std::path::Path;
use eyre::{Context as _, Error, OptionExt, Result}; use eyre::{Context as _, Error, OptionExt, Result};
use futures::{FutureExt, TryStreamExt}; use futures::FutureExt;
use poise::serenity_prelude as serenity; use poise::serenity_prelude as serenity;
use rand::seq::SliceRandom; use rand::seq::SliceRandom;
use rusqlite::OptionalExtension; use rusqlite::OptionalExtension;
@@ -179,7 +179,11 @@ async fn dawn(ctx: Context<'_>) -> Result<()> {
} }
#[poise::command(slash_command, ephemeral)] #[poise::command(slash_command, ephemeral)]
async fn join(ctx: Context<'_>, to: serenity::UserId, user: Option<serenity::UserId>) -> Result<()> { async fn join(
ctx: Context<'_>,
to: serenity::UserId,
user: Option<serenity::UserId>,
) -> Result<()> {
let guild = ctx let guild = ctx
.guild_id() .guild_id()
.ok_or_eyre("This bot only works in servers")?; .ok_or_eyre("This bot only works in servers")?;
@@ -195,7 +199,9 @@ async fn join(ctx: Context<'_>, to: serenity::UserId, user: Option<serenity::Use
match channel { match channel {
Some(channel) => { Some(channel) => {
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?; ctx.reply("Joined player").await?;
} }
None => { None => {
@@ -213,18 +219,18 @@ async fn st(ctx: Context<'_>, mut spectators: Vec<serenity::UserId>) -> Result<(
let GuildData { st, .. } = ctx.data().get(guild).await?; let GuildData { st, .. } = ctx.data().get(guild).await?;
spectators.push(ctx.author().id); spectators.push(ctx.author().id);
guild futures::future::try_join_all(guild.members(&ctx, None, None).await?.into_iter().map(
.members_iter(&ctx) |member| {
.try_for_each(|member| {
let spectators = &spectators; let spectators = &spectators;
async move { async move {
if spectators.contains(&member.user.id) { match (spectators.contains(&member.user.id), member.roles.contains(&st)) {
member.add_role(&ctx, st).await (true, true) | (false, false) => Ok(()),
} else { (true, false) => member.add_role(&ctx, st).await,
member.remove_role(&ctx, st).await (false, true) => member.remove_role(&ctx, st).await,
} }
} }
}) },
))
.await?; .await?;
ctx.reply(format!("{} members given ST", spectators.len())) ctx.reply(format!("{} members given ST", spectators.len()))
@@ -313,7 +319,14 @@ async fn main() -> Result<()> {
let framework = poise::Framework::builder() let framework = poise::Framework::builder()
.options(poise::FrameworkOptions { .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(), event_handler: |ctx, ev, ctxf, data| on_event(ctx, ev, ctxf, data).boxed(),
..Default::default() ..Default::default()
}) })