UNPKG

djs-systems

Version:

The simplest way to build complex Discord bots.

274 lines (273 loc) 15.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.manageGiveaway = void 0; const discord_js_1 = require("discord.js"); const giveaway_1 = __importDefault(require("../model/giveaway")); const error_1 = require("../error"); const misc_1 = require("../misc"); // ------------------------------ // ------ F U N C T I O N ------- // ------------------------------ /** * A Giveaway Handler for **simplydjs giveaway system.** * @param button * @param options * @link `Documentation:` https://simplyd.js.org/docs/handler/manageGiveaway * @example simplydjs.manageGiveaway(interaction) */ async function manageGiveaway(button, options = {}) { return new Promise(async (resolve) => { if (button.isButton()) { try { const member = button.member; // ------------------------------ // ------ G I V E A W A Y ------- // ------------------------------ if (button.customId === 'enter_giveaway') { await button.deferUpdate(); const data = await giveaway_1.default.findOne({ message: button.message.id }); if (Number(data.endTime) < Date.now()) return await button.followUp({ content: 'Wait a second, This event has already ended', ephemeral: true }); else { const entries = data.entry.find((id) => id?.userId === member.user.id); if (entries) { await giveaway_1.default.findOneAndUpdate({ message: button.message.id }, { $pull: { entry: { userId: member.user.id } } }); data.entered = data.entered - 1; await data.save().then(async () => { return await button.followUp({ content: "You've left the giveaway.", ephemeral: true }); }); } else if (!entries) { if (data?.requirements?.type === 'role') { if (!button.member.roles.cache.find((r) => r.id === data?.requirements?.id)) return await button.followUp({ content: "You do not fall under the requirements. (You don't have the required role)", ephemeral: true }); } if (data?.requirements?.type === 'guild') { const guild = button.client.guilds.cache.get(data?.requirements?.id); const isMember = await guild.members.fetch(button.member.user.id); if (!isMember) return await button.followUp({ content: 'You do not fall under the requirements. (You are not in the required guild)', ephemeral: true }); } data.entry.push({ userId: member.user.id, guildId: button.guild.id, messageId: button.message.id }); data.entered = data.entered + 1; await data.save().then(async () => { await button.followUp({ content: "You've entered the giveaway.", ephemeral: true }); }); } const embeds = button.message.embeds[0]; const row = discord_js_1.ActionRowBuilder.from(button.message.components[0]); row.components[0].setLabel(data.entered.toString()); const message = button.message; message.edit({ embeds: [embeds], components: [row] }); } } if (button.customId === 'end_giveaway' || button.customId === 'reroll_giveaway') { if (!button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator) || !button.member.permissions.has(discord_js_1.PermissionFlagsBits.ManageEvents)) return await button.reply({ content: 'You cannot end/reroll the giveaway. You do not have the required permissions. `Administrator` (or) `Manage Events`', ephemeral: true }); await button.deferUpdate(); const msg = button.message; const components = discord_js_1.ActionRowBuilder.from(msg.components[0]); const data = await giveaway_1.default.findOne({ message: msg.id }); const oldFields = msg.embeds[0].fields; const loadEmbed = new discord_js_1.EmbedBuilder() .setTitle(data?.embeds?.load?.title || (button.customId === 'reroll_giveaway' ? 'Rerolling the giveaway' : 'Processing Giveaway...')) .setColor(data?.embeds?.load?.color || (0, misc_1.toRgb)('#cc0000')) .setDescription(data?.embeds?.load?.description || `Please wait.. We are shuffling the tickets to pick a winner.`) .setFooter(data?.embeds?.load?.footer || { text: 'Ending the Giveaway, Choosing a winner...' }); if (data?.embeds?.load?.fields) loadEmbed.setFields(data?.embeds?.load?.fields); if (data?.embeds?.load?.author) loadEmbed.setAuthor(data?.embeds?.load?.author); if (data?.embeds?.load?.image) loadEmbed.setImage(data?.embeds?.load?.image); if (data?.embeds?.load?.thumbnail) loadEmbed.setThumbnail(data?.embeds?.load?.thumbnail); if (data?.embeds?.load?.timestamp) loadEmbed.setTimestamp(data?.embeds?.load?.timestamp); if (data?.embeds?.load?.title) loadEmbed.setTitle(data?.embeds?.load?.title); if (data?.embeds?.load?.url) loadEmbed.setURL(data?.embeds?.load?.url); await msg .edit({ embeds: [loadEmbed], components: [] }) .catch(() => { }); const displayWinner = []; data.endTime = undefined; await data.save().catch(() => { }); const winnerArray = []; const winnerCount = data.winCount; const entries = data.entry; if (data.entered > 0) { for (let i = 0; i < winnerCount; i++) { const winno = Math.floor(Math.random() * data.entered); winnerArray.push(entries[winno]); } } const resultWinner = []; setTimeout(() => { winnerArray.forEach(async (name) => { await button.guild.members .fetch(name.userId) .then((member) => { resultWinner.push(member); displayWinner.push(`<@${member.user.id}>`); const dmEmbed = new discord_js_1.EmbedBuilder() .setTitle('You, Won the Giveaway!') .setDescription(`You just won \`${data.prize}\` in the Giveaway at \`${member.guild.name}\` Go claim it fast !`) .setColor('DarkGreen') .setFooter({ text: 'GG winner.' }); const linkButton = new discord_js_1.ButtonBuilder() .setLabel('View Giveaway') .setStyle(discord_js_1.ButtonStyle.Link) .setURL(msg.url); const linkRow = new discord_js_1.ActionRowBuilder().addComponents([ linkButton ]); return member .send({ embeds: [dmEmbed], components: [linkRow] }) .catch(() => { }); }) .catch(() => { }); }); }, (0, misc_1.ms)('2s')); setTimeout(async () => { if (!data) return await msg.delete(); if (data) { const embed = discord_js_1.EmbedBuilder.from(button.message.embeds[0]); const time = Number(data.endTime); const fields = []; if (data?.embeds?.result?.fields) { data?.embeds?.result?.fields.forEach((a) => { if (a.name === 'Requirements') return; a.value = a.value .replaceAll('{hosted}', `<@${data.host}>`) .replaceAll('{endsAt}', `<t:${time}:f>`) .replaceAll('{prize}', data.prize.toString()) .replaceAll('{winCount}', data.winCount.toString()) .replaceAll('{entered}', data.entered.toString()); fields.push(a); }); } if (data.entered <= 0 || !winnerArray[0]) { embed .setTitle('No one entered') .setFields(fields || oldFields) .setColor((0, misc_1.toRgb)('#cc0000')) .setFooter({ text: 'Ohh man, Its ok lets get another giveaway goin.' }); return await msg.edit({ embeds: [embed], components: (0, misc_1.disableButtons)([ components ]) }); } const b1 = discord_js_1.ButtonBuilder.from(components.components[0]).setDisabled(true); const b2 = discord_js_1.ButtonBuilder.from(components.components[1]).setDisabled(false); const b3 = discord_js_1.ButtonBuilder.from(components.components[2]).setDisabled(true); const buttonRow = new discord_js_1.ActionRowBuilder().setComponents([ b1, b2, b3 ]); const resultEmbed = new discord_js_1.EmbedBuilder() .setTitle(data?.embeds?.result?.title || 'And the winner is,') .setColor(data?.embeds?.result?.color || 'DarkGreen') .setDescription(data?.embeds?.result?.description.replaceAll('{winners}', displayWinner.join(', ')) || `${displayWinner.join(', ')} won the prize!\nGet in touch with the staff members to collect your prize.`) .setFooter(data?.embeds?.result?.footer || { text: 'GG winner.' }) .setFields(fields || oldFields); if (data?.embeds?.result?.author) resultEmbed.setAuthor(data?.embeds?.result?.author); if (data?.embeds?.result?.image) resultEmbed.setImage(data?.embeds?.result?.image); if (data?.embeds?.result?.thumbnail) resultEmbed.setThumbnail(data?.embeds?.result?.thumbnail); if (data?.embeds?.result?.timestamp) resultEmbed.setTimestamp(data?.embeds?.result?.timestamp); if (data?.embeds?.result?.title) resultEmbed.setTitle(data?.embeds?.result?.title); if (data?.embeds?.result?.url) resultEmbed.setURL(data?.embeds?.result?.url); await msg.edit({ embeds: [resultEmbed], components: [buttonRow] }); if (button.customId === 'reroll_giveaway') { resolve({ type: 'Reroll', url: msg.url, user: resultWinner }); } else resolve({ type: 'End', url: msg.url, user: resultWinner }); } }, (0, misc_1.ms)('6s')); } } catch (err) { if (options?.strict) throw new error_1.SimplyError({ function: 'manageGiveaway', title: 'An Error occured when running the function ', tip: err.stack }); else console.log(`SimplyError - manageGiveaway | Error: ${err.stack}`); } } else return; }); } exports.manageGiveaway = manageGiveaway;