discord-multipurpose-bot/commands/moderation/purge.js

146 lines
4.8 KiB
JavaScript

const {
SlashCommandBuilder,
EmbedBuilder,
PermissionFlagsBits,
} = require("discord.js");
module.exports = {
data: new SlashCommandBuilder()
.setName("purge")
.setDescription("Deletes messages from the channel")
.addStringOption((option) =>
option
.setName("type")
.setDescription("Type of purge operation")
.setRequired(true)
.addChoices(
{ name: "Purge Specific Number", value: "specific" },
{ name: "Purge All", value: "all" }
)
)
.addIntegerOption((option) =>
option
.setName("amount")
.setDescription("The number of messages to delete (1-100)")
.setRequired(false)
.setMinValue(1)
.setMaxValue(100)
),
isModOnly: true,
async execute(interaction) {
try {
// Check if the user has the Manage Messages permission
if (
!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages)
) {
await interaction.reply({
content: "You do not have permission to use this command!",
ephemeral: true,
});
return;
}
const type = interaction.options.getString("type");
let amount = interaction.options.getInteger("amount");
const logChannelId = process.env.LOG_CHANNEL_ID;
const logChannel = interaction.guild.channels.cache.get(logChannelId);
if (type === "specific") {
// Ensure the number of messages to delete is between 1 and 100
if (amount < 1 || amount > 100) {
await interaction.reply({
content: "Please specify a number between 1 and 100.",
ephemeral: true,
});
return;
}
// Delete a specific number of messages
const fetchedMessages = await interaction.channel.messages.fetch({
limit: amount,
});
await interaction.channel.bulkDelete(fetchedMessages);
const purgeEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("Messages Purged")
.setDescription(`Successfully deleted ${amount} messages.`)
.setTimestamp()
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL(),
});
// Send confirmation as ephemeral message
await interaction.reply({
embeds: [purgeEmbed],
ephemeral: true,
});
// Send log to the logs channel
if (logChannel) {
const logEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("Purge Operation")
.setDescription(
`User ${interaction.user.tag} purged ${amount} messages from ${interaction.channel.name}.`
)
.setTimestamp();
await logChannel.send({ embeds: [logEmbed] });
}
} else if (type === "all") {
// Purge all messages (up to 100 messages at a time)
let messages;
let deletedMessagesCount = 0;
do {
messages = await interaction.channel.messages.fetch({ limit: 100 });
if (messages.size === 0) break;
deletedMessagesCount += messages.size;
await interaction.channel.bulkDelete(messages);
} while (messages.size >= 2); // Keep fetching and deleting until no more messages are left
const purgeEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("All Messages Purged")
.setDescription("Successfully deleted all messages in the channel.")
.setTimestamp()
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL(),
});
// Send confirmation as ephemeral message
await interaction.reply({
embeds: [purgeEmbed],
ephemeral: true,
});
// Send log to the logs channel
if (logChannel) {
const logEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("Purge Operation")
.setDescription(
`User ${interaction.user.tag} purged all messages from ${interaction.channel.name}. Total messages deleted: ${deletedMessagesCount}.`
)
.setTimestamp();
await logChannel.send({ embeds: [logEmbed] });
}
}
} catch (error) {
console.error("Error executing purge command:", error);
try {
await interaction.reply({
content: "There was an error while executing this command!",
ephemeral: true,
});
} catch (replyError) {
console.error("Error replying to interaction:", replyError);
}
}
},
};