const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType, PermissionFlagsBits } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"), ms = require("ms"); class Giveaway extends BaseCommand { /** * * @param {import("../../base/JaBa")} client */ constructor(client) { super({ command: new SlashCommandBuilder() .setName("giveaway") .setDescription(client.translate("moderation/giveaway:DESCRIPTION")) .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages) .addStringOption(option => option.setName("giveaway_id") .setDescription(client.translate("moderation/giveaway:GIVEAWAY_ID"))) .addStringOption(option => option.setName("duration") .setDescription(client.translate("common:DURATION"))) .addStringOption(option => option.setName("winners_count") .setDescription(client.translate("moderation/giveaway:WINNERS_COUNT"))) .addStringOption(option => option.setName("prize") .setDescription(client.translate("moderation/giveaway:PRIZE"))) .addBooleanOption(option => option.setName("isdrop") .setDescription(client.translate("moderation/giveaway:ISDROP"))), 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) { const options = ["create", "reroll", "delete", "end"].map(tag => JSON.parse(JSON.stringify({ label: tag, value: tag })) ); const row = new ActionRowBuilder() .addComponents( new SelectMenuBuilder() .setCustomId("giveaway_select") .setPlaceholder(client.translate("common:NOTHING_SELECTED")) .addOptions(options) ); const msg = await interaction.reply({ content: interaction.translate("common:AVAILABLE_OPTIONS"), components: [row], ephemeral: true, fetchReply: true }); const filter = i => i.customId === "giveaway_select" && i.user.id === interaction.user.id; const collector = new InteractionCollector(client, { filter, componentType: ComponentType.SelectMenu, message: msg, idle: 30 * 1000 }); collector.on("collect", async i => { const option = i?.values[0]; if (option === "create") { const currentGiveaways = client.giveawaysManager.giveaways.filter(g => g.guildId === interaction.guild.id && !g.ended).length; if (currentGiveaways > 5) return i.update({ content: interaction.translate("moderation/giveaway:MAX_COUNT") }); const duration = interaction.options.getString("duration"); if (!duration) return i.update({ content: interaction.translate("moderation/giveaway:INVALID_CREATE") }); if (ms(duration) > ms("10d")) return i.update({ content: interaction.translate("moderation/giveaway:MAX_DURATION") }); const winnersCount = interaction.options.getString("winners_count"); if (!winnersCount) return i.update({ content: interaction.translate("moderation/giveaway:INVALID_CREATE") }); if (isNaN(winnersCount) || winnersCount > 10 || winnersCount < 1) return i.update({ content: interaction.translate("misc:INVALID_NUMBER_RANGE", { min: 1, max: 10 }) }); const prize = interaction.options.getString("prize"); if (!prize) return i.update({ content: interaction.translate("moderation/giveaway:INVALID_CREATE") }); const isdrop = interaction.options.getString("isdrop"); client.giveawaysManager.start(interaction.channel, { duration: ms(duration), winnerCount: winnersCount, prize: prize, hostedBy: interaction.user, isDrop: isdrop, messages: { giveaway: interaction.translate("moderation/giveaway:TITLE"), giveawayEnded: interaction.translate("moderation/giveaway:ENDED"), timeRemaining: interaction.translate("moderation/giveaway:TIME_REMAINING"), inviteToParticipate: interaction.translate("moderation/giveaway:INVITE_PARTICIPATE"), winMessage: interaction.translate("moderation/giveaway:WIN_MESSAGE"), drawing: interaction.translate("moderation/giveaway:DRAWING"), dropMessage: interaction.translate("moderation/giveaway:DROP"), embedFooter: interaction.translate("moderation/giveaway:FOOTER"), noWinner: interaction.translate("moderation/giveaway:NO_WINNER"), winners: interaction.translate("moderation/giveaway:WINNERS"), endedAt: interaction.translate("moderation/giveaway:END_AT"), hostedBy: interaction.translate("moderation/giveaway:HOSTEDBY"), // units: { // seconds: interaction.translate("time:SECONDS", { // amount: "" // }).trim(), // minutes: interaction.translate("time:MINUTES", { // amount: "" // }).trim(), // hours: interaction.translate("time:HOURS", { // amount: "" // }).trim(), // days: interaction.translate("time:DAYS", { // amount: "" // }).trim() // } } }).then(() => { return i.update({ content: interaction.translate("moderation/giveaway:GIVEAWAY_CREATED"), components: [] }); }); } else if (option === "reroll") { const giveaway_id = interaction.options.getString("giveaway_id"); if (!giveaway_id) return i.update({ content: interaction.translate("moderation/giveaway:MISSING_ID"), components: [] }); client.giveawaysManager.reroll(giveaway_id, { messages: { congrat: interaction.translate("moderation/giveaway:REROLL_CONGRAT"), error: interaction.translate("moderation/giveaway:REROLL_ERROR") } }).then(() => { return i.update({ content: interaction.translate("moderation/giveaway:GIVEAWAY_REROLLED"), components: [] }); }).catch(() => { return i.update({ content: interaction.translate("moderation/giveaway:NOT_FOUND_ENDED", { messageId: giveaway_id }), components: [] }); }); } else if (option === "delete") { const giveaway_id = interaction.options.getString("giveaway_id"); if (!giveaway_id) return i.update({ content: interaction.translate("moderation/giveaway:MISSING_ID"), components: [] }); client.giveawaysManager.delete(giveaway_id).then(() => { return i.update({ content: interaction.translate("moderation/giveaway:GIVEAWAY_DELETED"), components: [] }); }).catch(() => { return i.update({ content: interaction.translate("moderation/giveaway:NOT_FOUND", { messageId: giveaway_id }), components: [] }); }); } else if (option === "end") { const giveaway_id = interaction.options.getString("giveaway_id"); if (!giveaway_id) return i.update({ content: interaction.translate("moderation/giveaway:MISSING_ID"), components: [] }); try { client.giveawaysManager.end(giveaway_id); return i.update({ content: interaction.translate("moderation/giveaway:GIVEAWAY_ENDED"), components: [] }); } catch (e) { return i.update({ content: interaction.translate("moderation/giveaway:NOT_FOUND", { messageId: giveaway_id }), components: [] }); } } }); } } module.exports = Giveaway;