djs-systems
Version:
The simplest way to build complex Discord bots.
680 lines (679 loc) • 38.9 kB
JavaScript
"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;