diff options
Diffstat (limited to 'src/commands/moderation/clear.rs')
| -rw-r--r-- | src/commands/moderation/clear.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/commands/moderation/clear.rs b/src/commands/moderation/clear.rs new file mode 100644 index 0000000..677dc14 --- /dev/null +++ b/src/commands/moderation/clear.rs @@ -0,0 +1,39 @@ +use crate::Context; + +use color_eyre::eyre::{Context as _, Result}; +use log::debug; +use poise::serenity_prelude::futures::{StreamExt, TryStreamExt}; + +#[poise::command( + slash_command, + ephemeral, + required_permissions = "MANAGE_MESSAGES", + default_member_permissions = "MANAGE_MESSAGES" +)] +pub async fn clear_messages( + ctx: Context<'_>, + #[description = "How many messages to delete"] num_messages: usize, +) -> Result<()> { + ctx.defer_ephemeral().await?; + + let channel = ctx.channel_id(); + let messages = channel + .messages_iter(ctx) + .take(num_messages) + .try_fold(Vec::new(), |mut acc, msg| async move { + acc.push(msg); + Ok(acc) + }) + .await + .wrap_err_with(|| { + format!("Couldn't collect {num_messages} messages from channel {channel}") + })?; + + debug!("Clearing {num_messages} messages from channel {channel}!"); + channel.delete_messages(ctx, messages).await?; + + ctx.reply(format!("Deleted {num_messages} message(s)")) + .await?; + + Ok(()) +} |
