summaryrefslogtreecommitdiff
path: root/src/commands/moderation/clear.rs
blob: 677dc140ecb6b5f8cd47ab98c6f8fd6be962c328 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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(())
}