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 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<serenity::UserId>) -> Result<()> {
async fn join(
ctx: Context<'_>,
to: serenity::UserId,
user: Option<serenity::UserId>,
) -> 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<serenity::Use
match 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?;
}
None => {
@@ -213,19 +219,19 @@ async fn st(ctx: Context<'_>, mut spectators: Vec<serenity::UserId>) -> 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()
})