From 4f8f16ee778a08d41e3cd9356a69190c6fe61202 Mon Sep 17 00:00:00 2001 From: bluepython508 <16466646+bluepython508@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:20:02 +0100 Subject: [PATCH] Add/remove '(ST)' prefix for nickname --- src/main.rs | 58 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5e3c708..b96052c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,16 @@ use std::{future::Future, io, path::Path}; -use ::serenity::all::{ChannelId, GuildId, UserId}; +use ::serenity::all::{ChannelId, EditMember, GuildId, UserId}; use eyre::{Context as _, Error, OptionExt, Result}; use futures::{FutureExt, StreamExt, TryStreamExt}; use poise::serenity_prelude as serenity; use rand::seq::SliceRandom; use rusqlite::OptionalExtension; -use tracing_subscriber::{fmt::{self, format::FmtSpan}, layer::SubscriberExt, EnvFilter}; +use tracing_subscriber::{ + fmt::{self, format::FmtSpan}, + layer::SubscriberExt, + EnvFilter, +}; #[derive(Copy, Clone)] struct GuildData { @@ -175,7 +179,12 @@ async fn collect( .flatten() .collect::>(); - move_users(ctx, guild, users.iter().map(|user| (to, user.user.id)).collect()).await?; + move_users( + ctx, + guild, + users.iter().map(|user| (to, user.user.id)).collect(), + ) + .await?; futures::future::try_join_all(users.iter().map(|user| guild.move_member(&ctx, user, to))) .await?; @@ -253,33 +262,46 @@ async fn join( #[poise::command(slash_command, ephemeral)] #[tracing::instrument] -async fn st(ctx: Context<'_>, mut spectators: Vec) -> Result<()> { +async fn st(ctx: Context<'_>) -> Result<()> { let guild = ctx .guild_id() .ok_or_eyre("This bot only works in servers")?; let GuildData { st, .. } = ctx.data().get(guild).await?; - spectators.push(ctx.author().id); futures::future::try_join_all(guild.members(&ctx, None, None).await?.into_iter().map( - |member| { - let spectators = &spectators; - async move { - 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, + |mut member| async move { + match (&member.user == ctx.author(), member.roles.contains(&st)) { + (true, true) | (false, false) => Ok(()), + (true, false) => { + member + .edit( + &ctx, + EditMember::new().nickname(format!("(ST) {}", member.display_name())), + ) + .await?; + member.add_role(&ctx, st).await + } + (false, true) => { + member + .edit( + &ctx, + EditMember::new().nickname( + member + .display_name() + .strip_prefix("(ST) ") + .unwrap_or(member.display_name()), + ), + ) + .await?; + + member.remove_role(&ctx, st).await } } }, )) .await?; - ctx.reply(format!("{} members given ST", spectators.len())) - .await?; - + ctx.reply("You have been granted ST").await?; Ok(()) }