const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionFlagsBits } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Clear extends BaseCommand { /** * * @param {import("../../base/JaBa")} client */ constructor(client) { super({ command: new SlashCommandBuilder() .setName("clear") .setDescription(client.translate("moderation/clear:DESCRIPTION")) .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages) .addStringOption(option => option.setName("option") .setDescription(client.translate("moderation/clear:OPTION")) .setRequired(true)) .addUserOption(option => option.setName("user") .setDescription(client.translate("common:USER"))), aliases: [], dirname: __dirname, guildOnly: true }); } /** * * @param {import("../../base/JaBa")} client */ async onLoad() { //... } /** * * @param {import("../../base/JaBa")} client * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Object} data */ async execute(client, interaction) { await interaction.deferReply({ ephemeral: true }); const option = interaction.options.getString("option"); const member = interaction.options.getMember("user"); if (option === "all") { const row = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId("clear_confirm_yes") .setLabel(interaction.translate("common:ACCEPT")) .setStyle(ButtonStyle.Danger), new ButtonBuilder() .setCustomId("clear_confirm_no") .setLabel(interaction.translate("common:CANCEL")) .setStyle(ButtonStyle.Secondary), ); await interaction.editReply({ content: interaction.translate("moderation/clear:ALL_CONFIRM"), components: [row] }); const filter = i => i.user.id === interaction.user.id; const collector = interaction.channel.createMessageComponentCollector({ filter, idle: (15 * 1000) }); collector.on("collect", async i => { if (i.isButton()) { if (i.customId === "clear_confirm_yes") { i.deferUpdate(); const position = interaction.channel.position; const newChannel = await interaction.channel.clone(); await interaction.channel.delete(); newChannel.setPosition(position); return newChannel.send({ content: interaction.translate("moderation/clear:CHANNEL_CLEARED") }); } else if (i.customId === "clear_confirm_no") { i.deferUpdate(); collector.stop("cancel"); } } }); collector.on("end", async (_, reason) => { if (reason === "cancel") { row.components.forEach(component => { component.setDisabled(true); }); interaction.editReply({ content: interaction.translate("misc:SELECT_CANCELED"), components: [row] }); } else if (reason === "idle") { row.components.forEach(component => { component.setDisabled(true); }); interaction.editReply({ components: [row] }); } }); } else { if (isNaN(option) || parseInt(option) < 1) return interaction.error("misc:OPTION_NAN_ALL", null, { ephemeral: true }); let messages = await interaction.channel.messages.fetch({ limit: option }); if (member) messages = messages.filter(m => m.author.id === member.id); if (messages.length > option) messages.length = parseInt(option, 10); interaction.channel.bulkDelete(messages.filter(m => !m.pinned), true); if (member) { interaction.replyT("moderation/clear:CLEARED_MEMBER", { amount: `**${option}** ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}`, username: member.user.tag }, { ephemeral: true, edit: true }); } else { interaction.replyT("moderation/clear:CLEARED", { amount: `**${option}** ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}` }, { ephemeral: true, edit: true }); } } } } module.exports = Clear;