UNPKG

djs-systems

Version:

The simplest way to build complex Discord bots.

680 lines (679 loc) 38.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.manageSuggest = void 0; const discord_js_1 = require("discord.js"); const suggest_1 = __importDefault(require("../model/suggest")); const misc_1 = require("../misc"); const error_1 = require("../error"); // ------------------------------ // ------ F U N C T I O N ------- // ------------------------------ /** * A **Suggestion** handler which handles all sugestions from the package * @param button * @param options * @link `Documentation:` https://simplyd.js.org/docs/handler/manageSuggest * @example simplydjs.manageSuggest(interaction) */ async function manageSuggest(button, options = {}) { return new Promise(async () => { if (button.isButton()) { try { options.embed = { deny: { title: options?.embed?.deny?.title || 'Suggestion denied', color: options?.embed?.deny?.color || 'Red' }, accept: { title: options?.embed?.accept?.title || 'Suggestion accepted', color: options?.embed?.accept?.color || 'Green' } }; if (button.customId === 'minus-suggestion') { let data = await suggest_1.default.findOne({ message: button.message.id }); if (!data) { data = new suggest_1.default({ message: button.message.id }); await data.save().catch(() => { }); } const oldemb = button.message.embeds[0]; function getUsers() { const users = data.votes; return users; } function getLikes() { const array = getUsers().filter((val) => val.vote === 'up'); return array; } function getDislikes() { const array = getUsers().filter((val) => val.vote === 'down'); return array; } const likes = getLikes(); const dislikes = getDislikes(); const amtLikes = likes.length; const amtDislikes = dislikes.length; if ((!oldemb.fields[1].value.includes('%') && !isNaN(amtLikes)) || (!oldemb.fields[1].value.includes('%') && !isNaN(amtDislikes))) { data.votes = likes.concat(dislikes); await data.save().catch(() => { }); await calc(oldemb, button.message); } if (button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) { const surebtn = new discord_js_1.ButtonBuilder() .setStyle(discord_js_1.ButtonStyle.Primary) .setLabel('Downvote') .setCustomId('downvote-suggestion'); const nobtn = new discord_js_1.ButtonBuilder() .setStyle(discord_js_1.ButtonStyle.Danger) .setLabel('Deny') .setCustomId('deny-suggestion'); const row = new discord_js_1.ActionRowBuilder().addComponents([ surebtn, nobtn ]); const msg = await button.reply({ content: 'Do you want to Deny the suggestion (or) Vote?', components: [row], ephemeral: true, fetchReply: true }); const filter = (b) => button.user.id === b.user.id; const denyCollector = msg.createMessageComponentCollector({ filter: filter, componentType: discord_js_1.ComponentType.Button, time: (0, misc_1.ms)('30s') }); denyCollector.on('collect', async (btn) => { if (btn.customId === 'downvote-suggestion') { const myVote = data.votes.find((m) => m.userId.toString() === btn.user.id); let total = data.votes.filter((m) => m.userId.toString() !== btn.user.id) || []; if (!Array.isArray(total)) { total = [total]; } if (!myVote || myVote.vote === null) { const vote = { userId: btn.user.id, vote: 'down' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'You **downvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, components: [] }); } else if (myVote) { if (myVote.vote === 'down') { data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'Removing your **downvote**', components: [] }); } else if (myVote.vote === 'up') { const vote = { userId: btn.user.id, vote: 'down' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'You **downvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, components: [] }); } } } else if (btn.customId === 'deny-suggestion') { if (!button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) return; const reasoner = new discord_js_1.TextInputBuilder() .setLabel('Tell a reason | Say "cancel" to cancel.') .setCustomId('deny-reason') .setStyle(discord_js_1.TextInputStyle.Paragraph) .setRequired(false) .setMaxLength(128); const modalRow = new discord_js_1.ActionRowBuilder().setComponents([ reasoner ]); const modal = new discord_js_1.ModalBuilder() .setCustomId('reason-modal') .setTitle('Declining the suggestion') .addComponents(modalRow); await btn.showModal(modal); const submitted = await btn.awaitModalSubmit({ time: (0, misc_1.ms)('2m'), filter: (i) => i.user.id === btn.user.id }); if (submitted) { const m = submitted.fields.getTextInputValue('deny-reason'); if (m.toLowerCase() === 'cancel') { await submitted.reply({ content: `You have cancelled to deny.`, ephemeral: true }); } else if (m == '') { await submitted.reply({ content: `You denied the suggestion for reason: \`No Reason\``, ephemeral: true }); denySuggestion('No Reason', oldemb, button.message, submitted.user); } else { await submitted.reply({ content: `You denied the suggestion for reason: \`${m}\``, ephemeral: true }); denySuggestion(m, oldemb, button.message, submitted.user); } } else { denySuggestion('No Reason', oldemb, button.message, submitted.user); } } }); } else if (!button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) { const myVote = data.votes.find((m) => m.userId.toString() === button.user.id); let total = data.votes.filter((m) => m.userId.toString() !== button.user.id) || []; if (!Array.isArray(total)) { total = [total]; } if (!myVote || myVote.vote === null) { const vote = { userId: button.user.id, vote: 'down' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'You **downvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, ephemeral: true, components: [] }); } else if (myVote) { if (myVote.vote === 'down') { data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'Removing your **downvote**', ephemeral: true, components: [] }); } else if (myVote.vote === 'up') { const vote = { userId: button.user.id, vote: 'down' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'You **downvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, ephemeral: true, components: [] }); } } } } if (button.customId === 'plus-suggestion') { let data = await suggest_1.default.findOne({ message: button.message.id }); if (!data) { data = new suggest_1.default({ message: button.message.id }); await data.save().catch(() => { }); } const oldemb = button.message.embeds[0]; function getUsers() { const users = data.votes; return users; } function getLikes() { const array = getUsers().filter((val) => val.vote === 'up'); return array; } function getDislikes() { const array = getUsers().filter((val) => val.vote === 'down'); return array; } const likes = getLikes(); const dislikes = getDislikes(); const amtLikes = likes.length; const amtDislikes = dislikes.length; if ((!oldemb.fields[1].value.includes('%') && !isNaN(amtLikes)) || (!oldemb.fields[1].value.includes('%') && !isNaN(amtDislikes))) { data.votes = likes.concat(dislikes); await data.save().catch(() => { }); await calc(oldemb, button.message); } if (button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) { const surebtn = new discord_js_1.ButtonBuilder() .setStyle(discord_js_1.ButtonStyle.Primary) .setLabel('Upvote') .setCustomId('upvote-suggestion'); const nobtn = new discord_js_1.ButtonBuilder() .setStyle(discord_js_1.ButtonStyle.Success) .setLabel('Accept') .setCustomId('accept-suggestion'); const acceptRow = new discord_js_1.ActionRowBuilder().addComponents([ surebtn, nobtn ]); const msg = await button.reply({ content: 'Do you want to Accept suggestion (or) Vote?', components: [acceptRow], ephemeral: true, fetchReply: true }); const filter = (b) => button.user.id === b.user.id; const acceptCollector = msg.createMessageComponentCollector({ filter: filter, componentType: discord_js_1.ComponentType.Button, time: (0, misc_1.ms)('30s') }); acceptCollector.on('collect', async (btn) => { if (btn.customId === 'upvote-suggestion') { const myVote = data.votes.find((m) => m.userId.toString() === btn.user.id); let total = data.votes.filter((m) => m.userId.toString() !== btn.user.id) || []; if (!Array.isArray(total)) { total = [total]; } if (!myVote || myVote.vote === null) { const vote = { userId: btn.user.id, vote: 'up' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'You **upvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, components: [] }); } else if (myVote) { if (myVote.vote === 'up') { data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'Removing your **upvote**', components: [] }); } else if (myVote.vote === 'down') { const vote = { userId: btn.user.id, vote: 'up' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.editReply({ content: 'You **upvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, components: [] }); } } } else if (btn.customId === 'accept-suggestion') { if (!button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) return; const reasoner = new discord_js_1.TextInputBuilder() .setLabel('Tell a reason | Say "cancel" to cancel.') .setCustomId('accept-reason') .setStyle(discord_js_1.TextInputStyle.Paragraph) .setRequired(false) .setMaxLength(128); const modalRow = new discord_js_1.ActionRowBuilder().setComponents([ reasoner ]); const modal = new discord_js_1.ModalBuilder() .setCustomId('reason-modal') .setTitle('Accepting the suggestion') .addComponents(modalRow); await btn.showModal(modal); const submitted = await btn.awaitModalSubmit({ time: (0, misc_1.ms)('2m'), filter: (i) => i.user.id === btn.user.id }); if (submitted) { const m = submitted.fields.getTextInputValue('accept-reason'); if (m.toLowerCase() === 'cancel') { await submitted.reply({ content: `You have cancelled to accept.`, ephemeral: true }); } else if (m == '') { await submitted.reply({ content: `You accepted the suggestion for reason: \`No Reason\``, ephemeral: true }); acceptSuggestion('No Reason', oldemb, button.message, submitted.user); } else { await submitted.reply({ content: `You accepted the suggestion for reason: \`${m}\``, ephemeral: true }); acceptSuggestion(m, oldemb, button.message, submitted.user); } } else { acceptSuggestion('No Reason', oldemb, button.message, submitted.user); } } }); } else if (!button.member.permissions.has(discord_js_1.PermissionFlagsBits.Administrator)) { const myVote = data.votes.find((m) => m.userId.toString() === button.user.id); let total = data.votes.filter((m) => m.userId.toString() !== button.user.id) || []; if (!Array.isArray(total)) { total = [total]; } if (!myVote || myVote.vote === null) { const vote = { userId: button.user.id, vote: 'up' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'You **upvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, ephemeral: true, components: [] }); } else if (myVote) { if (myVote.vote === 'up') { data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'Removing your **upvote**', ephemeral: true, components: [] }); } else if (myVote.vote === 'down') { const vote = { userId: button.user.id, vote: 'up' }; total.push(vote); data.votes = total; await data.save().catch(() => { }); await calc(oldemb, button.message); await button.reply({ content: 'You **upvoted** the suggestion. | Suggestion ID: ' + `\`${button.message.id}\``, ephemeral: true, components: [] }); } } } } if (button.customId === 'who-voted-suggestion') { let data = await suggest_1.default.findOne({ message: button.message.id }); if (!data) { data = new suggest_1.default({ message: button.message.id }); await data.save().catch(() => { }); } function getUsers() { const users = data.votes; return users; } function getLikes() { const array = getUsers().filter((val) => val.vote === 'up'); return array; } function getDislikes() { const array = getUsers().filter((val) => val.vote === 'down'); return array; } function mapUsersID(array) { let myString = ''; array.forEach((val) => { myString += `<@${val.userId}>\n`; }); return myString; } function mapUsersTag(array) { let myString = ''; array.forEach((val) => { myString += `${button.client.users.cache.get(val.userId.toString()).username}\n`; }); return myString; } let whoemb = new discord_js_1.EmbedBuilder().setColor((0, misc_1.toRgb)('#406DBC')).addFields({ name: `Upvoters`, value: `${mapUsersID(getLikes()) || 'Nobody Has Upvoted This Suggestion'}` }, { name: `Downvoters`, value: `${mapUsersID(getDislikes()) || 'Nobody Has Downvoted This Suggestion'}` }); const tagbtn = new discord_js_1.ButtonBuilder() .setLabel('Show User Tags') .setEmoji('#️⃣') .setStyle(discord_js_1.ButtonStyle.Secondary) .setCustomId('tag'); const idbtn = new discord_js_1.ButtonBuilder() .setLabel('Show User Mentions') .setEmoji('🔢') .setStyle(discord_js_1.ButtonStyle.Secondary) .setCustomId('id'); const actt = new discord_js_1.ActionRowBuilder().addComponents([ tagbtn ]); const acti = new discord_js_1.ActionRowBuilder().addComponents([ idbtn ]); const msg = await button.reply({ embeds: [whoemb], components: [actt], ephemeral: true, fetchReply: true }); const filter = (b) => button.user.id === b.user.id; const collector = msg.createMessageComponentCollector({ filter: filter, componentType: discord_js_1.ComponentType.Button, idle: (0, misc_1.ms)('30s') }); collector.on('collect', async (i) => { i.deferUpdate(); if (i.customId === 'tag') { whoemb = new discord_js_1.EmbedBuilder().setColor((0, misc_1.toRgb)('#406DBC')).addFields({ name: `Upvoters`, value: `${mapUsersTag(getLikes()) || 'Nobody Has Upvoted This Suggestion'}` }, { name: `Downvoters`, value: `${mapUsersTag(getDislikes()) || 'Nobody Has Downvoted This Suggestion'}` }); button.editReply({ embeds: [whoemb], components: [acti] }); } else if (i.customId === 'id') { whoemb = new discord_js_1.EmbedBuilder().setColor((0, misc_1.toRgb)('#406DBC')).addFields({ name: `Upvoters`, value: `${mapUsersID(getLikes()) || 'Nobody Has Upvoted This Suggestion'}` }, { name: `Downvoters`, value: `${mapUsersID(getDislikes()) || 'Nobody Has Downvoted This Suggestion'}` }); button.editReply({ embeds: [whoemb], components: [actt] }); } }); } async function calc(embed, message) { const data = await suggest_1.default.findOne({ message: button.message.id }); function getUsers() { const users = data.votes; return users; } function getLikes() { const array = getUsers().filter((val) => val.vote === 'up'); return array; } function getDislikes() { const array = getUsers().filter((val) => val.vote === 'down'); return array; } const likes = getLikes(); const dislikes = getDislikes(); let amtLikes = likes.length; let amtDislikes = dislikes.length; if (amtLikes <= 0) { amtLikes = 0; } if (amtDislikes <= 0) { amtDislikes = 0; } const total = data.votes.length; let upPercent = (100 * amtLikes) / total; let downPercent = (amtDislikes * 100) / total; upPercent = parseInt(upPercent.toPrecision(3)) || 0; downPercent = parseInt(downPercent.toPrecision(3)) || 0; let progress = (data?.progress?.blank || '⬛').repeat(10); if (upPercent / 10 + downPercent / 10 != 0 || total != 0) progress = (data?.progress?.up || '🟩').repeat(upPercent / 10) + (data?.progress?.down || '🟥').repeat(downPercent / 10); else if (total == 0 || upPercent.toString() === 'NaN') { progress = (data?.progress?.blank || '⬛').repeat(10); upPercent = 0; downPercent = 0; } const rowComponent = discord_js_1.ActionRowBuilder.from(message.components[0]); const likeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[0]); const dislikeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[1]); const whoVoted = discord_js_1.ButtonBuilder.from(rowComponent.components[2]); likeBtn.setLabel(amtLikes.toString()); dislikeBtn.setLabel(amtDislikes.toString()); embed.fields[1].value = `${progress} [${upPercent || 0}% - ${downPercent || 0}%]`; rowComponent.setComponents([ likeBtn, dislikeBtn, whoVoted ]); button.message.edit({ embeds: [embed], components: [rowComponent] }); } async function denySuggestion(reason, oldemb, msg, user) { oldemb.fields[0].value = `Denied\n\n**Reason:** \`\`\`${reason}\`\`\``; const embed = discord_js_1.EmbedBuilder.from(oldemb) .setColor(options?.embed?.deny?.color || `Red`) .setFooter(options?.embed?.deny?.footer || { text: `Denied by ${user.username}` }) .setTitle(options.embed?.deny?.title || 'Suggestion denied'); if (options?.embed?.deny?.author) embed.setAuthor(options.embed?.deny?.author); if (options?.embed?.deny?.image) embed.setImage(options.embed?.deny?.image); if (options?.embed?.deny?.thumbnail) embed.setThumbnail(options.embed?.deny?.thumbnail); if (options?.embed?.deny?.timestamp) embed.setTimestamp(options.embed?.deny?.timestamp); if (options?.embed?.deny?.title) embed.setTitle(options.embed?.deny?.title); if (options?.embed?.deny?.url) embed.setURL(options.embed?.deny?.url); if (options?.embed?.deny?.description) embed.setDescription(options.embed?.deny?.description); const rowComponent = discord_js_1.ActionRowBuilder.from(msg.components[0]); const likeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[0]); const dislikeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[1]); const whoVoted = discord_js_1.ButtonBuilder.from(rowComponent.components[2]); likeBtn.setDisabled(true); dislikeBtn.setDisabled(true); whoVoted.setDisabled(false); const sendRow = new discord_js_1.ActionRowBuilder().setComponents([ likeBtn, dislikeBtn, whoVoted ]); button.message.edit({ embeds: [embed], components: [sendRow] }); } async function acceptSuggestion(reason, oldemb, msg, user) { oldemb.fields[0].value = `Accepted\n\n**Reason:** \`\`\`${reason}\`\`\``; const embed = discord_js_1.EmbedBuilder.from(oldemb) .setColor(options?.embed?.accept?.color || `Green`) .setFooter(options?.embed?.accept?.footer || { text: `Accepted by ${user.username}` }) .setTitle(options.embed?.accept?.title || 'Suggestion accepted'); if (options?.embed?.accept?.author) embed.setAuthor(options.embed?.accept?.author); if (options?.embed?.accept?.image) embed.setImage(options.embed?.accept?.image); if (options?.embed?.accept?.thumbnail) embed.setThumbnail(options.embed?.accept?.thumbnail); if (options?.embed?.accept?.timestamp) embed.setTimestamp(options.embed?.accept?.timestamp); if (options?.embed?.accept?.title) embed.setTitle(options.embed?.accept?.title); if (options?.embed?.accept?.url) embed.setURL(options.embed?.accept?.url); if (options?.embed?.accept?.description) embed.setDescription(options.embed?.accept?.description); const rowComponent = discord_js_1.ActionRowBuilder.from(msg.components[0]); const likeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[0]); const dislikeBtn = discord_js_1.ButtonBuilder.from(rowComponent.components[1]); const whoVoted = discord_js_1.ButtonBuilder.from(rowComponent.components[2]); likeBtn.setDisabled(true); dislikeBtn.setDisabled(true); whoVoted.setDisabled(false); const sendRow = new discord_js_1.ActionRowBuilder().setComponents([ likeBtn, dislikeBtn, whoVoted ]); button.message.edit({ embeds: [embed], components: [sendRow] }); } } catch (err) { if (options?.strict) throw new error_1.SimplyError({ function: 'manageSuggest', title: 'An Error occured when running the function', tip: err.stack }); else console.log(`SimplyError - manageSuggest | Error: ${err.stack}`); } } }); } exports.manageSuggest = manageSuggest;