Compare commits

...

1 Commits

Author SHA1 Message Date
bluepython508
4f8f16ee77 Add/remove '(ST)' prefix for nickname 2025-07-12 18:20:02 +01:00

View File

@@ -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::<Vec<_>>();
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<serenity::UserId>) -> 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(())
}