From 531e127b2e13a42013915611d8da87e1e23b5648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20Olausson=20Holten=C3=A4s?= Date: Sun, 13 Mar 2022 01:43:14 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A1=20Added=20comments=20to=20all=20co?= =?UTF-8?q?mmands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/admin/credits/addons/give.js | 73 +++---- src/commands/admin/credits/addons/set.js | 69 ++++--- src/commands/admin/credits/addons/take.js | 71 +++---- src/commands/admin/credits/addons/transfer.js | 96 +++++----- src/commands/admin/credits/index.js | 28 +-- src/commands/admin/index.js | 4 +- src/commands/credits/addons/balance.js | 23 ++- src/commands/credits/addons/gift.js | 102 ++++++---- src/commands/credits/addons/index.js | 6 + src/commands/credits/addons/redeem.js | 135 ------------- src/commands/credits/addons/top.js | 16 +- src/commands/credits/addons/work.js | 21 +- src/commands/credits/index.js | 61 ++---- src/commands/profile/addons/view.js | 20 +- src/commands/profile/index.js | 3 +- src/commands/reputation/addons/give.js | 93 ++++----- src/commands/reputation/index.js | 7 +- src/commands/settings/guild/addons/credits.js | 19 +- .../settings/guild/addons/pterodactyl.js | 5 +- src/commands/settings/guild/index.js | 16 +- src/commands/settings/index.js | 8 +- .../settings/user/addons/appearance.js | 14 +- src/commands/settings/user/index.js | 12 +- src/commands/shop/addons/pterodactyl.js | 181 ++++++++++++++++++ src/commands/shop/index.js | 29 +++ src/commands/utilities/addons/lookup.js | 29 ++- src/commands/utilities/addons/users.js | 35 ---- src/commands/utilities/index.js | 10 +- src/events/guildCreate.js | 5 + src/events/interactionCreate.js | 43 ++--- src/events/memberCreate.js | 19 -- src/events/messageCreate.js | 40 ++-- src/events/ready.js | 3 + src/handlers/api.js | 8 - 34 files changed, 693 insertions(+), 611 deletions(-) create mode 100644 src/commands/credits/addons/index.js delete mode 100644 src/commands/credits/addons/redeem.js create mode 100644 src/commands/shop/addons/pterodactyl.js create mode 100644 src/commands/shop/index.js delete mode 100644 src/commands/utilities/addons/users.js delete mode 100644 src/events/memberCreate.js delete mode 100644 src/handlers/api.js diff --git a/src/commands/admin/credits/addons/give.js b/src/commands/admin/credits/addons/give.js index 8563db5..3f13929 100644 --- a/src/commands/admin/credits/addons/give.js +++ b/src/commands/admin/credits/addons/give.js @@ -3,18 +3,17 @@ const config = require('../../../../../config.json'); const logger = require('../../../../handlers/logger'); // Database models - const { credits } = require('../../../../helpers/database/models'); + const creditNoun = require('../../../../helpers/creditNoun'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Admin', color: config.colors.error, @@ -22,17 +21,18 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get options - const user = await interaction.options.getUser('user'); const amount = await interaction.options.getInteger('amount'); - // Stop if given amount is zero or below - + // If amount is zero or below if (amount <= 0) { + // Create embed object const embed = { title: 'Give', description: "You can't give zero or below.", @@ -40,19 +40,20 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get toUser object - const toUser = await credits.findOne({ userId: user.id, guildId: interaction.member.guild.id, }); - // Stop if user has zero or below credits - + // If toUser has no credits if (!toUser) { + // Create embed object const embed = { title: 'Give', description: @@ -61,38 +62,44 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Increase toUser with amount - + // Deposit amount to toUser toUser.balance += amount; // Save toUser + await toUser + .save() - await toUser.save().then(async () => { - const embed = { - title: 'Give', - description: `Gave ${creditNoun(amount)} to ${user}.`, - color: 0x22bb33, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - await logger.debug( - `Administrator: ${interaction.user.username} gave ${ - amount <= 1 ? `${amount} credit` : `${amount} credits` - } to ${user.username}` - ); - // Send reply + // If successful + .then(async () => { + // Create embed object + const embed = { + title: 'Give', + description: `Gave ${creditNoun(amount)} to ${user}.`, + color: 0x22bb33, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - await interaction.editReply({ embeds: [embed], ephemeral: true }); + // Send debug message + await logger.debug( + `Administrator: ${interaction.user.username} gave ${ + amount <= 1 ? `${amount} credit` : `${amount} credits` + } to ${user.username}` + ); - // Send debug message + // Send interaction reply + await interaction.editReply({ embeds: [embed], ephemeral: true }); - await logger.debug( - `Guild: ${member.guild.id} User: ${member.id} gave ${ - user.id - } ${creditNoun(amount)}.` - ); - }); + // Send debug message + await logger.debug( + `Guild: ${member.guild.id} User: ${member.id} gave ${ + user.id + } ${creditNoun(amount)}.` + ); + }); }; diff --git a/src/commands/admin/credits/addons/set.js b/src/commands/admin/credits/addons/set.js index 6bd9874..be4023c 100644 --- a/src/commands/admin/credits/addons/set.js +++ b/src/commands/admin/credits/addons/set.js @@ -9,12 +9,11 @@ const creditNoun = require('../../../../helpers/creditNoun'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Admin', color: config.colors.error, @@ -22,17 +21,18 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get options - const user = await interaction.options.getUser('user'); const amount = await interaction.options.getInteger('amount'); - // Stop if given amount is zero or below - + // If amount is zero or below if (amount <= 0) { + // Create embed object const embed = { title: 'Give', description: "You can't give zero or below.", @@ -40,19 +40,20 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get toUser object - const toUser = await credits.findOne({ userId: user.id, guildId: interaction.member.guild.id, }); - // Stop if user has zero or below credits - + // If toUser has no credits if (!toUser) { + // Create embed object const embed = { title: 'Set', description: @@ -61,38 +62,44 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Set toUser with amount - toUser.balance = amount; // Save toUser + await toUser + .save() - await toUser.save().then(async () => { - const embed = { - title: 'Set', - description: `You set ${creditNoun(amount)} on ${user}.`, - color: 0x22bb33, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - await logger.debug( - `Administrator: ${interaction.user.username} set ${ - amount <= 1 ? `${amount} credit` : `${amount} credits` - } on ${user.username}` - ); - // Send reply + // If successful + .then(async () => { + // Create embed object + const embed = { + title: 'Set', + description: `You set ${creditNoun(amount)} on ${user}.`, + color: 0x22bb33, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - await interaction.editReply({ embeds: [embed], ephemeral: true }); + // Send debug message + await logger.debug( + `Administrator: ${interaction.user.username} set ${ + amount <= 1 ? `${amount} credit` : `${amount} credits` + } on ${user.username}` + ); - // Send debug message + // Send interaction reply + await interaction.editReply({ embeds: [embed], ephemeral: true }); - await logger.debug( - `Guild: ${member.guild.id} User: ${member.id} set ${ - user.id - } to ${creditNoun(amount)}.` - ); - }); + // Send debug message + await logger.debug( + `Guild: ${member.guild.id} User: ${member.id} set ${ + user.id + } to ${creditNoun(amount)}.` + ); + }); }; diff --git a/src/commands/admin/credits/addons/take.js b/src/commands/admin/credits/addons/take.js index 8243bb5..2af7bf3 100644 --- a/src/commands/admin/credits/addons/take.js +++ b/src/commands/admin/credits/addons/take.js @@ -9,12 +9,11 @@ const creditNoun = require('../../../../helpers/creditNoun'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Admin', color: config.colors.error, @@ -22,17 +21,18 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get options - const user = await interaction.options.getUser('user'); const amount = await interaction.options.getInteger('amount'); - // Stop if given amount is zero or below - + // If amount is zero or below if (amount <= 0) { + // Give embed object const embed = { title: 'Take', description: "You can't take zero or below.", @@ -40,19 +40,20 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get toUser object - const toUser = await credits.findOne({ userId: user.id, guildId: interaction.member.guild.id, }); - // Stop if user has zero or below credits - + // If toUser has no credits if (!toUser) { + // Create embed object const embed = { title: 'Take', description: @@ -61,38 +62,44 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Decrease toUser with amount - + // Withdraw amount from toUser toUser.balance -= amount; // Save toUser + await toUser + .save() - await toUser.save().then(async () => { - const embed = { - title: 'Take', - description: `You took ${creditNoun(amount)} to ${user}.`, - color: 0x22bb33, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - await logger.debug( - `Administrator: ${interaction.user.username} took ${ - amount <= 1 ? `${amount} credit` : `${amount} credits` - } from ${user.username}` - ); - // Send reply + // If successful + .then(async () => { + // Create embed object + const embed = { + title: 'Take', + description: `You took ${creditNoun(amount)} to ${user}.`, + color: 0x22bb33, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - await interaction.editReply({ embeds: [embed], ephemeral: true }); + // Send debug message + await logger.debug( + `Administrator: ${interaction.user.username} took ${ + amount <= 1 ? `${amount} credit` : `${amount} credits` + } from ${user.username}` + ); - // Send debug message + // Send interaction reply + await interaction.editReply({ embeds: [embed], ephemeral: true }); - await logger.debug( - `Guild: ${member.guild.id} User: ${member.id} took ${creditNoun( - amount - )} from ${user.id}.` - ); - }); + // Send debug message + await logger.debug( + `Guild: ${member.guild.id} User: ${member.id} took ${creditNoun( + amount + )} from ${user.id}.` + ); + }); }; diff --git a/src/commands/admin/credits/addons/transfer.js b/src/commands/admin/credits/addons/transfer.js index fd86132..6d6c0dc 100644 --- a/src/commands/admin/credits/addons/transfer.js +++ b/src/commands/admin/credits/addons/transfer.js @@ -10,12 +10,11 @@ const saveUser = require('../../../../helpers/saveUser'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Admin', color: config.colors.error, @@ -23,32 +22,31 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get options - const from = await interaction.options.getUser('from'); const to = await interaction.options.getUser('to'); const amount = await interaction.options.getInteger('amount'); // Get fromUser object - const fromUser = await credits.findOne({ userId: from.id, guildId: interaction.member.guild.id, }); // Get toUser object - const toUser = await credits.findOne({ userId: to.id, guildId: interaction.member.guild.id, }); - // Stop if fromUser has zero credits or below - + // If fromUser has no credits if (!fromUser) { + // Create embed object const embed = { title: 'Transfer', description: @@ -57,12 +55,14 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Stop if toUser has zero credits or below - + // If toUser has no credits if (!toUser) { + // Create embed object const embed = { title: 'Transfer', description: @@ -71,12 +71,14 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Stop if amount is zero or below - + // If amount is zero or below if (amount <= 0) { + // Create embed object const embed = { title: 'Transfer failed', description: "You can't transfer zero or below.", @@ -84,48 +86,50 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Decrease fromUser with amount - + // Withdraw amount from fromUser fromUser.balance -= amount; - // Increase toUser with amount - + // Deposit amount to toUser toUser.balance += amount; - await saveUser(fromUser, toUser).then(async () => { - const embed = { - title: 'Transfer', - description: `You sent ${creditNoun(amount)} from ${from} to ${to}.`, - color: 0x22bb33, - fields: [ - { - name: `${from.username} Balance`, - value: `${fromUser.balance}`, - inline: true, - }, - { - name: `${to.username} Balance`, - value: `${toUser.balance}`, - inline: true, - }, - ], - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; + // Save users + await saveUser(fromUser, toUser) + // If successful + .then(async () => { + // Create embed object + const embed = { + title: 'Transfer', + description: `You sent ${creditNoun(amount)} from ${from} to ${to}.`, + color: 0x22bb33, + fields: [ + { + name: `${from.username} Balance`, + value: `${fromUser.balance}`, + inline: true, + }, + { + name: `${to.username} Balance`, + value: `${toUser.balance}`, + inline: true, + }, + ], + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - // Send reply + // Send interaction reply + await interaction.editReply({ embeds: [embed], ephemeral: true }); - await interaction.editReply({ embeds: [embed], ephemeral: true }); - - // Send debug message - - await logger.debug( - `Guild: ${member.guild.id} User: ${member.id} transferred ${creditNoun( - amount - )} from ${from.id} to ${to.id}.` - ); - }); + // Send debug message + await logger.debug( + `Guild: ${member.guild.id} User: ${member.id} transferred ${creditNoun( + amount + )} from ${from.id} to ${to.id}.` + ); + }); }; diff --git a/src/commands/admin/credits/index.js b/src/commands/admin/credits/index.js index d8dc5d6..f3851c6 100644 --- a/src/commands/admin/credits/index.js +++ b/src/commands/admin/credits/index.js @@ -6,12 +6,11 @@ const { give, take, set, transfer } = require('./addons'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Admin', color: config.colors.error, @@ -19,31 +18,36 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply await interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Command handler - + // If subcommand is give if (interaction.options.getSubcommand() === 'give') { // Execute give addon - await give(interaction); - } else if (interaction.options.getSubcommand() === 'take') { + } + + // If subcommand is take + else if (interaction.options.getSubcommand() === 'take') { // Execute take addon - await take(interaction); - } else if (interaction.options.getSubcommand() === 'set') { + } + + // If subcommand is set + else if (interaction.options.getSubcommand() === 'set') { // Execute set addon - await set(interaction); - } else if (interaction.options.getSubcommand() === 'transfer') { - // Execute transfer addon + } + // If subcommand is transfer + else if (interaction.options.getSubcommand() === 'transfer') { + // Execute transfer addon await transfer(interaction); } // Send debug message - await logger.debug( `Guild: ${member.guild.id} User: ${member.id} executed /${ interaction.commandName diff --git a/src/commands/admin/index.js b/src/commands/admin/index.js index 8fe845f..ed098cf 100644 --- a/src/commands/admin/index.js +++ b/src/commands/admin/index.js @@ -1,5 +1,4 @@ const { SlashCommandBuilder } = require('@discordjs/builders'); -const { Permissions } = require('discord.js'); const credits = require('./credits'); @@ -87,9 +86,10 @@ module.exports = { ) ), async execute(interaction) { + // If subcommand group is credits if (interaction.options.getSubcommandGroup() === 'credits') { + // Execute credits group await credits(interaction); } - return true; }, }; diff --git a/src/commands/credits/addons/balance.js b/src/commands/credits/addons/balance.js index a5e7813..663268e 100644 --- a/src/commands/credits/addons/balance.js +++ b/src/commands/credits/addons/balance.js @@ -1,4 +1,3 @@ -const i18next = require('i18next'); const config = require('../../../../config.json'); const logger = require('../../../handlers/logger'); @@ -7,15 +6,21 @@ const creditNoun = require('../../../helpers/creditNoun'); module.exports = async (interaction) => { try { + // Get options const user = await interaction.options.getUser('user'); + // Get credit object await credits .findOne({ userId: user ? user.id : interaction.user.id, guildId: interaction.member.guild.id, }) + + // If successful .then(async (data) => { + // If user has no credits if (!data) { + // Create embed object const embed = { title: 'Balance', description: `${user} has no credits.`, @@ -24,10 +29,14 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } + + // Destructure balance const { balance } = data; + // Create embed object const embed = { title: 'Balance', description: `${user ? `${user} has` : 'You have'} ${creditNoun( @@ -37,10 +46,16 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); }) - .catch(async (err) => logger.error(err)); - } catch { - await logger.error(); + .catch(async (e) => { + // Send debug message + await logger.error(e); + }); + } catch (e) { + // Send debug message + await logger.error(e); } }; diff --git a/src/commands/credits/addons/gift.js b/src/commands/credits/addons/gift.js index bebbaa6..1962ab6 100644 --- a/src/commands/credits/addons/gift.js +++ b/src/commands/credits/addons/gift.js @@ -1,4 +1,3 @@ -const i18next = require('i18next'); const config = require('../../../../config.json'); const logger = require('../../../handlers/logger'); @@ -8,16 +7,20 @@ const creditNoun = require('../../../helpers/creditNoun'); module.exports = async (interaction) => { try { + // Get options const user = await interaction.options.getUser('user'); const amount = await interaction.options.getInteger('amount'); const reason = await interaction.options.getString('reason'); + // Get data object const data = await credits.findOne({ userId: interaction.user.id, guildId: interaction.member.guild.id, }); + // If receiver is same as sender if (user.id === interaction.user.id) { + // Create embed object const embed = { title: 'Gift', description: "You can't pay yourself.", @@ -25,9 +28,14 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return await interaction.editReply({ embeds: [embed], ephemeral: true }); } + + // If amount is zero or below if (amount <= 0) { + // Create embed object const embed = { title: 'Gift', description: "You can't pay zero or below.", @@ -35,9 +43,14 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return await interaction.editReply({ embeds: [embed], ephemeral: true }); } + + // If user has below gifting amount if (data.balance < amount) { + // Create embed const embed = { title: 'Gift', description: `You have insufficient credits. Your balance is ${data.balance}`, @@ -45,19 +58,26 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return await interaction.editReply({ embeds: [embed], ephemeral: true }); } - // eslint-disable-next-line max-len + + // Get fromUser object const fromUser = await credits.findOne({ userId: interaction.user.id, guildId: interaction.member.guild.id, }); + + // Get toUser object const toUser = await credits.findOne({ userId: user.id, guildId: interaction.member.guild.id, }); + // If toUser has no credits if (!toUser) { + // Create embed object const embed = { title: 'Gift', description: @@ -66,44 +86,62 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } + + // Withdraw amount from fromUser fromUser.balance -= amount; + + // Deposit amount to toUser toUser.balance += amount; - await saveUser(fromUser, toUser); + // Save users + await saveUser(fromUser, toUser).then(async () => { + // Create interaction embed object + const interactionEmbed = { + title: 'Gift', + description: `You sent ${creditNoun(amount)} to ${user}${ + reason ? ` with reason: ${reason}` : '' + }. Your new balance is ${creditNoun(fromUser.balance)}.`, + color: 0x22bb33, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - const interactionEmbed = { - title: 'Gift', - description: `You sent ${creditNoun(amount)} to ${user}${ - reason ? ` with reason: ${reason}` : '' - }. Your new balance is ${creditNoun(fromUser.balance)}.`, - color: 0x22bb33, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - const dmEmbed = { - title: 'Gift', - description: `You received ${creditNoun(amount)} from ${ - interaction.user - }${ - reason ? ` with reason: ${reason}` : '' - }. Your new balance is ${creditNoun(toUser.balance)}.`, - color: 0x22bb33, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - const dmUser = await interaction.client.users.cache.get(user.id); - await dmUser.send({ embeds: [dmEmbed] }); - await logger.debug( - `Gift sent from: ${interaction.user.username} to: ${user.username}` - ); - return await interaction.editReply({ - embeds: [interactionEmbed], - ephemeral: true, + // Create DM embed object + const dmEmbed = { + title: 'Gift', + description: `You received ${creditNoun(amount)} from ${ + interaction.user + }${ + reason ? ` with reason: ${reason}` : '' + }. Your new balance is ${creditNoun(toUser.balance)}.`, + color: 0x22bb33, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + + // Get DM user object + const dmUser = await interaction.client.users.cache.get(user.id); + + // Send DM to user + await dmUser.send({ embeds: [dmEmbed] }); + + // Send debug message + await logger.debug( + `Gift sent from: ${interaction.user.username} to: ${user.username}` + ); + + // Send interaction reply + return await interaction.editReply({ + embeds: [interactionEmbed], + ephemeral: true, + }); }); } catch (e) { + // Send debug message await logger.error(e); } - return true; }; diff --git a/src/commands/credits/addons/index.js b/src/commands/credits/addons/index.js new file mode 100644 index 0000000..69163ba --- /dev/null +++ b/src/commands/credits/addons/index.js @@ -0,0 +1,6 @@ +const balance = require('./balance'); +const gift = require('./gift'); +const top = require('./top'); +const work = require('./work'); + +module.exports = { balance, gift, top, work }; diff --git a/src/commands/credits/addons/redeem.js b/src/commands/credits/addons/redeem.js deleted file mode 100644 index 8f68ef8..0000000 --- a/src/commands/credits/addons/redeem.js +++ /dev/null @@ -1,135 +0,0 @@ -const { v4: uuidv4 } = require('uuid'); -const axios = require('axios'); -const config = require('../../../../config.json'); -const logger = require('../../../handlers/logger'); - -const { guilds, credits, apis } = require('../../../helpers/database/models'); -const creditNoun = require('../../../helpers/creditNoun'); - -// const api = require('../../../handlers/api'); - -module.exports = async (interaction) => { - try { - if (config.disable.redeem) { - const embed = { - title: 'Redeem failed', - description: 'Redeem is disabled until further.', - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - const amount = await interaction.options.getInteger('amount'); - - // eslint-disable-next-line max-len - const user = await credits.findOne({ - userId: interaction.user.id, - guildId: interaction.member.guild.id, - }); - const dmUser = interaction.client.users.cache.get( - interaction.member.user.id - ); - - if ((amount || user.balance) < 100) { - const embed = { - title: 'Redeem', - description: `You can't redeem below 100. Your balance is ${user.balance}.`, - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - if ((amount || user.balance) > 1000000) { - const embed = { - title: 'Redeem', - description: `You can't redeem over 1,000,000. Your balance is ${user.balance}.`, - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - if (user.balance < amount) { - const embed = { - title: 'Redeem', - description: `You have insufficient credits. Your balance is ${user.balance}.`, - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - const code = uuidv4(); - - const apiCredentials = await apis.findOne({ - guildId: interaction.member.guild.id, - }); - - const api = axios.create({ - baseURL: apiCredentials.url, - headers: { Authorization: `Bearer ${apiCredentials.token}` }, - }); - - await api - .post('vouchers', { - uses: 1, - code, - credits: amount || user.balance, - memo: `${interaction.createdTimestamp} - ${interaction.user.id}`, - }) - .then(async () => { - const dmEmbed = { - title: 'Redeem', - description: `Your new balance is ${ - user.balance - (amount || user.balance) - }.`, - fields: [ - { name: 'Code', value: `${code}`, inline: true }, - { - name: 'Credits', - value: `${amount || user.balance}`, - inline: true, - }, - ], - color: config.colors.success, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - const interactionEmbed = { - title: 'Redeem', - description: 'Code is sent in DM!', - color: config.colors.success, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - user.balance -= amount || user.balance; - - await user.save(); - - await logger.debug( - `User: ${user.username} redeemed: ${creditNoun(amount)}` - ); - await dmUser.send({ embeds: [dmEmbed] }); - await interaction.editReply({ - embeds: [interactionEmbed], - ephemeral: true, - }); - }) - .catch(async (e) => { - await logger.error(e); - const embed = { - title: 'Redeem', - description: 'Something went wrong.', - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return interaction.editReply({ embeds: [embed], ephemeral: true }); - }); - } catch (e) { - await logger.error(e); - } - return true; -}; diff --git a/src/commands/credits/addons/top.js b/src/commands/credits/addons/top.js index c413701..2dd9abd 100644 --- a/src/commands/credits/addons/top.js +++ b/src/commands/credits/addons/top.js @@ -3,25 +3,37 @@ const credits = require('../../../helpers/database/models/creditSchema'); const creditNoun = require('../../../helpers/creditNoun'); module.exports = async (interaction) => { + // Get all users in the guild await credits .find({ guildId: interaction.member.guild.id }) + + // If successful .then(async (data) => { + // Get top ten const topTen = data + + // Sort them after balance amount (ascending) .sort((a, b) => (a.balance > b.balance ? -1 : 1)) + + // Return the top 10 .slice(0, 10); - const item = (x, index) => + // Create entry object + const entry = (x, index) => `**Top ${index + 1}** - <@${x.userId}> ${creditNoun(x.balance)}`; + // Create embed object const embed = { title: 'Balance Top', description: `Below are the top ten.\n${topTen - .map((x, index) => item(x, index)) + .map((x, index) => entry(x, index)) .join('\n')}`, color: 0x22bb33, timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); }); }; diff --git a/src/commands/credits/addons/work.js b/src/commands/credits/addons/work.js index ac17efe..fd7de3d 100644 --- a/src/commands/credits/addons/work.js +++ b/src/commands/credits/addons/work.js @@ -7,14 +7,11 @@ const { } = require('../../../helpers/database/models'); const creditNoun = require('../../../helpers/creditNoun'); -const workedRecently = new Set(); - -// eslint-disable-next-line consistent-return module.exports = async (interaction) => { + // Destructure member const { member } = interaction; // Check if user has a timeout - const isTimeout = await timeouts.findOne({ guildId: member.guild.id, userId: member.id, @@ -22,13 +19,15 @@ module.exports = async (interaction) => { }); // If user is not on timeout - if (!isTimeout) { const guild = await guilds.findOne({ guildId: interaction.member.guild.id, }); + // Make a variable of how much credits user will earn based on random multiplied with work rate const creditsEarned = Math.floor(Math.random() * guild.credits.workRate); + + // Add credits to user await credits .findOneAndUpdate( { @@ -38,8 +37,13 @@ module.exports = async (interaction) => { { $inc: { balance: creditsEarned } }, { new: true, upsert: true } ) + + // If successful .then(async () => { + // Send debug message logger.debug(`Credits added to user: ${interaction.member.id}`); + + // Create embed object const embed = { title: 'Work', description: `You earned ${creditNoun(creditsEarned)}`, @@ -48,11 +52,11 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); }); // Create a timeout for the user - await timeouts.create({ guildId: member.guild.id, userId: member.id, @@ -60,6 +64,7 @@ module.exports = async (interaction) => { }); setTimeout(async () => { + // Send debug message await logger.debug( `Guild: ${member.guild.id} User: ${ member.id @@ -69,7 +74,6 @@ module.exports = async (interaction) => { ); // When timeout is out, remove it from the database - await timeouts.deleteOne({ guildId: member.guild.id, userId: member.id, @@ -77,6 +81,7 @@ module.exports = async (interaction) => { }); }, 86400000); } else { + // Create embed object const embed = { title: 'Work', description: `You have worked within the last ${ @@ -87,8 +92,10 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + // Send interaction reply await interaction.editReply({ embeds: [embed] }); + // Send debug message await logger.debug( `Guild: ${member.guild.id} User: ${member.id} has worked within last day, no work can be done` ); diff --git a/src/commands/credits/index.js b/src/commands/credits/index.js index 0669796..b106d18 100644 --- a/src/commands/credits/index.js +++ b/src/commands/credits/index.js @@ -1,14 +1,6 @@ const { SlashCommandBuilder } = require('@discordjs/builders'); -const { Permissions } = require('discord.js'); -const config = require('../../../config.json'); -const guilds = require('../../helpers/database/models/guildSchema'); - -const balance = require('./addons/balance'); -const gift = require('./addons/gift'); -const redeem = require('./addons/redeem'); -const top = require('./addons/top'); -const work = require('./addons/work'); +const { balance, gift, top, work } = require('./addons'); module.exports = { data: new SlashCommandBuilder() @@ -25,16 +17,6 @@ module.exports = { .setRequired(false) ) ) - .addSubcommand((subcommand) => - subcommand - .setName('redeem') - .setDescription('Redeem your credits.') - .addIntegerOption((option) => - option - .setName('amount') - .setDescription('How much credit you want to withdraw.') - ) - ) .addSubcommand((subcommand) => subcommand .setName('gift') @@ -62,35 +44,28 @@ module.exports = { subcommand.setName('work').setDescription('Work for credits.') ), async execute(interaction) { - const guild = await guilds.findOne({ - guildId: interaction.member.guild.id, - }); - - if ( - guild.credits.status === false && - interaction.options.getSubcommand() !== 'settings' - ) { - const embed = { - title: 'Credits', - description: 'Please enable credits by ``/credits settings``', - color: config.colors.error, - timestamp: new Date(), - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - return interaction.editReply({ embeds: [embed], ephemeral: true }); + // If subcommand is balance + if (interaction.options.getSubcommand() === 'balance') { + // Execute balance addon + await balance(interaction); } - if (interaction.options.getSubcommand() === 'balance') { - await balance(interaction); - } else if (interaction.options.getSubcommand() === 'gift') { + // If subcommand is gift + else if (interaction.options.getSubcommand() === 'gift') { + // Execute gift addon await gift(interaction); - } else if (interaction.options.getSubcommand() === 'redeem') { - await redeem(interaction); - } else if (interaction.options.getSubcommand() === 'top') { + } + + // If subcommand is top + else if (interaction.options.getSubcommand() === 'top') { + // Execute top addon await top(interaction); - } else if (interaction.options.getSubcommand() === 'work') { + } + + // If subcommand is work + else if (interaction.options.getSubcommand() === 'work') { + // Execute work addon await work(interaction); } - return true; }, }; diff --git a/src/commands/profile/addons/view.js b/src/commands/profile/addons/view.js index 581bcb1..8506fca 100644 --- a/src/commands/profile/addons/view.js +++ b/src/commands/profile/addons/view.js @@ -10,32 +10,35 @@ const { module.exports = async (interaction) => { try { + // Destructure member const { member } = await interaction; - // Options + // Get options const target = await interaction.options.getUser('target'); + // Get discord user object const discordUser = await interaction.client.users.fetch( `${target ? target.id : member.id}` ); - // Databases - // Fetch user from user + // Get user object const user = await users.findOne({ userId: await discordUser.id }); - // Fetch credit from user and guild + // Get experience object const experience = await experiences.findOne({ userId: await discordUser.id, guildId: await member.guild.id, }); - // Fetch credit from user and guild + // Get credit object const credit = await credits.findOne({ userId: await discordUser.id, guildId: await member.guild.id, }); + // If any of the objects return is null if (user === null || experience === null || credit === null) { + // Create embed object const embed = { title: 'Profile', description: `${ @@ -48,6 +51,7 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + // Send interaction reply return await interaction.editReply({ embeds: [embed] }); } @@ -80,7 +84,7 @@ module.exports = async (interaction) => { } ); - // Create embed + // Create embed object const embed = { author: { name: `${await discordUser.username}#${await discordUser.discriminator}`, @@ -118,10 +122,10 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; - // Send reply + // Send interaction reply return await interaction.editReply({ embeds: [embed], ephemeral: true }); } catch (e) { + // Send debug message await logger.error(e); } - return true; }; diff --git a/src/commands/profile/index.js b/src/commands/profile/index.js index d62947d..360cf67 100644 --- a/src/commands/profile/index.js +++ b/src/commands/profile/index.js @@ -17,9 +17,10 @@ module.exports = { ) ), async execute(interaction) { + // If subcommand is view if (interaction.options.getSubcommand() === 'view') { + // Execute view addon await view(interaction); } - return true; }, }; diff --git a/src/commands/reputation/addons/give.js b/src/commands/reputation/addons/give.js index 3702888..3fa2d52 100644 --- a/src/commands/reputation/addons/give.js +++ b/src/commands/reputation/addons/give.js @@ -6,20 +6,16 @@ const { users, timeouts } = require('../../../helpers/database/models'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Get options - const target = await interaction.options.getUser('target'); const type = await interaction.options.getString('type'); // Get user object - const user = await users.findOne({ userId: interaction.member.id }); // Check if user has a timeout - const isTimeout = await timeouts.findOne({ guildId: member.guild.id, userId: member.id, @@ -27,13 +23,10 @@ module.exports = async (interaction) => { }); // If user is not on timeout - if (!isTimeout) { // Do not allow self reputation - if (target.id === interaction.member.id) { - // Build embed - + // Create embed object const embed = { title: i18next.t( 'commands:reputation:addons:give:version03:embed:title', @@ -49,71 +42,66 @@ module.exports = async (interaction) => { ), }; - // Send reply - + // Send interaction reply return interaction.editReply({ embeds: [embed] }); } - // Math operators depending on type of reputation - + // If type is positive if (type === 'positive') { user.reputation += 1; } + + // If type is negative if (type === 'negative') { user.reputation -= 1; } // Save user + await user.save().then(async () => { + // Create embed object + const embed = { + title: i18next.t( + 'commands:reputation:addons:give:version02:embed:title', + { + lng: await user.language, + } + ), + description: i18next.t( + 'commands:reputation:addons:give:version02:embed:description', + { + lng: await user.language, + user: target, + type, + } + ), + timestamp: new Date(), + color: config.colors.success, + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; - await user.save(); + // Send interaction reply + await interaction.editReply({ embeds: [embed] }); - // Build embed + // Send debug message + await logger.debug( + `Guild: ${member.guild.id} User: ${member.id} has given ${target.id} a ${type} reputation.` + ); - const embed = { - title: i18next.t( - 'commands:reputation:addons:give:version02:embed:title', - { - lng: await user.language, - } - ), - description: i18next.t( - 'commands:reputation:addons:give:version02:embed:description', - { - lng: await user.language, - user: target, - type, - } - ), - timestamp: new Date(), - color: config.colors.success, - footer: { iconURL: config.footer.icon, text: config.footer.text }, - }; - - // Send reply - - await interaction.editReply({ embeds: [embed] }); - - // Send debug message - - await logger.debug( - `Guild: ${member.guild.id} User: ${member.id} has given ${target.id} a ${type} reputation.` - ); - - // Create a timeout for the user - - await timeouts.create({ - guildId: member.guild.id, - userId: member.id, - timeoutId: 2, + // Create a timeout for the user + await timeouts.create({ + guildId: member.guild.id, + userId: member.id, + timeoutId: 2, + }); }); setTimeout(async () => { + // send debug message await logger.debug( `Guild: ${member.guild.id} User: ${member.id} has not repute within last day, reputation can be given` ); // When timeout is out, remove it from the database - await timeouts.deleteOne({ guildId: member.guild.id, userId: member.id, @@ -121,6 +109,7 @@ module.exports = async (interaction) => { }); }, 86400000); } else { + // Create embed object const embed = { title: i18next.t( 'commands:reputation:addons:give:version01:embed:title', @@ -139,8 +128,10 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + // Send interaction reply await interaction.editReply({ embeds: [embed] }); + // Send debug message await logger.debug( `Guild: ${member.guild.id} User: ${member.id} has repute within last day, no reputation can be given` ); diff --git a/src/commands/reputation/index.js b/src/commands/reputation/index.js index 737a95d..878988e 100644 --- a/src/commands/reputation/index.js +++ b/src/commands/reputation/index.js @@ -29,18 +29,15 @@ module.exports = { ), async execute(interaction) { // Destructure member - const { member } = interaction; - // Command handler - + // If subcommand is give if (interaction.options.getSubcommand() === 'give') { // Execute give addon - await give(interaction); } - // Send debug message + // Send debug message await logger.debug( `Guild: ${member.guild.id} User: ${member.id} executed /${ interaction.commandName diff --git a/src/commands/settings/guild/addons/credits.js b/src/commands/settings/guild/addons/credits.js index 694fbb8..dfb54b3 100644 --- a/src/commands/settings/guild/addons/credits.js +++ b/src/commands/settings/guild/addons/credits.js @@ -3,29 +3,28 @@ const config = require('../../../../../config.json'); const logger = require('../../../../handlers/logger'); // Database models - const { guilds } = require('../../../../helpers/database/models'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Settings', color: config.colors.error, - description: 'You do not have permission to manage this!', + description: `You don't have permission to manage this!`, timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } // Get options - const status = await interaction.options.getBoolean('status'); const rate = await interaction.options.getNumber('rate'); const timeout = await interaction.options.getNumber('timeout'); @@ -34,11 +33,9 @@ module.exports = async (interaction) => { const workTimeout = await interaction.options.getNumber('work-timeout'); // Get guild object - const guild = await guilds.findOne({ guildId: interaction.member.guild.id }); // Modify values - guild.credits.status = status !== null ? status : guild.credits.status; guild.credits.rate = rate !== null ? rate : guild.credits.rate; guild.credits.timeout = timeout !== null ? timeout : guild.credits.timeout; @@ -50,10 +47,8 @@ module.exports = async (interaction) => { minimumLength !== null ? minimumLength : guild.credits.minimumLength; // Save guild - await guild.save().then(async () => { - // Build embed - + // Create embed object const embed = { title: 'Credits', description: 'Following settings is set!', @@ -82,12 +77,10 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; - // Send reply - + // Send interaction reply await interaction.editReply({ embeds: [embed], ephemeral: true }); // Send debug message - await logger.debug( `Guild: ${member.guild.id} User: ${member.id} has changed credit details.` ); diff --git a/src/commands/settings/guild/addons/pterodactyl.js b/src/commands/settings/guild/addons/pterodactyl.js index fcc5d8c..afc4d4b 100644 --- a/src/commands/settings/guild/addons/pterodactyl.js +++ b/src/commands/settings/guild/addons/pterodactyl.js @@ -8,12 +8,11 @@ const { apis } = require('../../../../helpers/database/models'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Settings', color: config.colors.error, @@ -21,6 +20,8 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply return interaction.editReply({ embeds: [embed], ephemeral: true }); } diff --git a/src/commands/settings/guild/index.js b/src/commands/settings/guild/index.js index 3a498c6..a86d219 100644 --- a/src/commands/settings/guild/index.js +++ b/src/commands/settings/guild/index.js @@ -6,12 +6,11 @@ const { pterodactyl, credits } = require('./addons'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Settings', color: config.colors.error, @@ -19,23 +18,24 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply await interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Command handler - + // If subcommand is pterodactyl if (interaction.options.getSubcommand() === 'pterodactyl') { // Execute pterodactyl addon - await pterodactyl(interaction); - } else if (interaction.options.getSubcommand() === 'credits') { - // Execute credits addon + } + // If subcommand is credits + else if (interaction.options.getSubcommand() === 'credits') { + // Execute credits addon await credits(interaction); } // Send debug message - await logger.debug( `Guild: ${member.guild.id} User: ${member.id} executed /${ interaction.commandName diff --git a/src/commands/settings/index.js b/src/commands/settings/index.js index 2335982..0aca9be 100644 --- a/src/commands/settings/index.js +++ b/src/commands/settings/index.js @@ -87,11 +87,15 @@ module.exports = { ) ), async execute(interaction) { + // If subcommand group is guild if (interaction.options.getSubcommandGroup() === 'guild') { + // Execute guild group await guild(interaction); - } else if (interaction.options.getSubcommandGroup() === 'user') { + } + // If subcommand group is user + else if (interaction.options.getSubcommandGroup() === 'user') { + // Execute user group await user(interaction); } - return true; }, }; diff --git a/src/commands/settings/user/addons/appearance.js b/src/commands/settings/user/addons/appearance.js index 3ebaf82..db7e230 100644 --- a/src/commands/settings/user/addons/appearance.js +++ b/src/commands/settings/user/addons/appearance.js @@ -1,33 +1,25 @@ -const { Permissions } = require('discord.js'); const config = require('../../../../../config.json'); const logger = require('../../../../handlers/logger'); // Database models - const { users } = require('../../../../helpers/database/models'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Get options - const language = await interaction.options.getString('language'); // Get user object - const user = await users.findOne({ userId: interaction.member.id }); // Modify values - user.language = language !== null ? language : user.language; // Save guild - await user.save().then(async () => { - // Build embed - + // Create embed object const embed = { title: 'Appearance', description: 'Following settings is set!', @@ -43,12 +35,10 @@ module.exports = async (interaction) => { footer: { iconURL: config.footer.icon, text: config.footer.text }, }; - // Send reply - + // Send interaction reply await interaction.editReply({ embeds: [embed], ephemeral: true }); // Send debug message - await logger.debug( `Guild: ${member.guild.id} User: ${member.id} has changed appearance settings.` ); diff --git a/src/commands/settings/user/index.js b/src/commands/settings/user/index.js index b72237f..e4d5eec 100644 --- a/src/commands/settings/user/index.js +++ b/src/commands/settings/user/index.js @@ -6,32 +6,30 @@ const { appearance } = require('./addons'); module.exports = async (interaction) => { // Destructure member - const { member } = interaction; // Check permission - if (!member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { + // Create embed object const embed = { title: 'Settings', color: config.colors.error, - description: 'You do not have permission to manage this!', + description: `You don't have permission to manage this!`, timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply await interaction.editReply({ embeds: [embed], ephemeral: true }); } - // Command handler - + // If subcommand is appearance if (interaction.options.getSubcommand() === 'appearance') { // Execute appearance addon - await appearance(interaction); } // Send debug message - await logger.debug( `Guild: ${member.guild.id} User: ${member.id} executed /${ interaction.commandName diff --git a/src/commands/shop/addons/pterodactyl.js b/src/commands/shop/addons/pterodactyl.js new file mode 100644 index 0000000..99e73f1 --- /dev/null +++ b/src/commands/shop/addons/pterodactyl.js @@ -0,0 +1,181 @@ +const { v4: uuidv4 } = require('uuid'); +const axios = require('axios'); +const config = require('../../../../config.json'); +const logger = require('../../../handlers/logger'); + +const { credits, apis } = require('../../../helpers/database/models'); +const creditNoun = require('../../../helpers/creditNoun'); + +module.exports = async (interaction) => { + // Needs to be made multi-guild + if (config.disable.redeem) { + // Create embed object + const embed = { + title: ':shopping_cart: Shop - Pterodactyl failed', + description: 'This item in the shop is currently disabled.', + color: config.colors.error, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + + // Send interaction reply + return await interaction.editReply({ embeds: [embed], ephemeral: true }); + } + + // Get options + const amount = await interaction.options.getInteger('amount'); + + // Get user object + const user = await credits.findOne({ + userId: interaction.user.id, + guildId: interaction.member.guild.id, + }); + + // Get DM user object + const dmUser = interaction.client.users.cache.get(interaction.member.user.id); + + // Stop if amount or user balance is below 100 + if ((amount || user.balance) < 100) { + const embed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: `You **can't** withdraw for __Pterodactyl__ below **100**.`, + color: config.colors.error, + fields: [{ name: 'Your balance', value: `${creditNoun(user.balance)}` }], + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return await interaction.editReply({ embeds: [embed], ephemeral: true }); + } + + // Stop if amount or user balance is above 1.000.000 + if ((amount || user.balance) > 1000000) { + const embed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: `You **can't** withdraw for __Pterodactyl__ above **1.000.000**.`, + color: config.colors.error, + fields: [{ name: 'Your balance', value: `${creditNoun(user.balance)}` }], + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return await interaction.editReply({ embeds: [embed], ephemeral: true }); + } + + // Stop if user balance is below amount + if (user.balance < amount) { + const embed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: `You have **insufficient** credits.`, + color: config.colors.error, + fields: [{ name: 'Your balance', value: `${creditNoun(user.balance)}` }], + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return await interaction.editReply({ embeds: [embed], ephemeral: true }); + } + + // Generate a unique voucher for the user + const code = uuidv4(); + + // Get api object + const apiCredentials = await apis.findOne({ + guildId: interaction.member.guild.id, + }); + + // Create a api instance + const api = axios.create({ + baseURL: apiCredentials.url, + headers: { Authorization: `Bearer ${apiCredentials.token}` }, + }); + + // Get shop URL + const shopUrl = apiCredentials.url.replace('/api', '/store'); + + // Make API request + await api + + // Make a post request to the API + .post('vouchers', { + uses: 1, + code, + credits: amount || user.balance, + memo: `${interaction.createdTimestamp} - ${interaction.user.id}`, + }) + + // If successful + .then(async () => { + // Create DM embed object + const dmEmbed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: `Redeem this voucher [here](${shopUrl})!`, + fields: [ + { name: 'Code', value: `${code}`, inline: true }, + { + name: 'Credits', + value: `${amount || user.balance}`, + inline: true, + }, + ], + color: config.colors.success, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + + // Create interaction embed object + const interactionEmbed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: 'I have sent you the code in DM!', + color: config.colors.success, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + + // Withdraw amount from user balance + user.balance -= amount || user.balance; + + // Save new balance + await user + .save() + // If successful + .then(async () => { + // Send debug message + await logger.debug( + `User: ${user.username} redeemed: ${creditNoun(amount)}` + ); + + // Send DM message + await dmUser.send({ embeds: [dmEmbed] }); + + // Send interaction reply + await interaction.editReply({ + embeds: [interactionEmbed], + ephemeral: true, + }); + }) + + // If error occurs + .catch(async (e) => { + await logger.error(e); + const embed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: 'Something went wrong, please try again later.', + color: config.colors.error, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return interaction.editReply({ embeds: [embed], ephemeral: true }); + }); + }) + + // If error occurs + .catch(async (e) => { + await logger.error(e); + const embed = { + title: ':shopping_cart: Shop - Pterodactyl', + description: 'Something went wrong, please try again later.', + color: config.colors.error, + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return interaction.editReply({ embeds: [embed], ephemeral: true }); + }); +}; diff --git a/src/commands/shop/index.js b/src/commands/shop/index.js new file mode 100644 index 0000000..9fe4319 --- /dev/null +++ b/src/commands/shop/index.js @@ -0,0 +1,29 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); +const { Permissions } = require('discord.js'); + +const guilds = require('../../helpers/database/models/guildSchema'); + +const pterodactyl = require('./addons/pterodactyl'); + +module.exports = { + data: new SlashCommandBuilder() + .setName('shop') + .setDescription('Open our shop.') + .addSubcommand((subcommand) => + subcommand + .setName('pterodactyl') + .setDescription('Buy pterodactyl power.') + .addIntegerOption((option) => + option + .setName('amount') + .setDescription('How much credits you want to withdraw.') + ) + ), + async execute(interaction) { + // If subcommand is pterodactyl + if (interaction.options.getSubcommand() === 'pterodactyl') { + // Execute pterodactyl addon + await pterodactyl(interaction); + } + }, +}; diff --git a/src/commands/utilities/addons/lookup.js b/src/commands/utilities/addons/lookup.js index da84e45..efcb0b0 100644 --- a/src/commands/utilities/addons/lookup.js +++ b/src/commands/utilities/addons/lookup.js @@ -5,12 +5,19 @@ const logger = require('../../../handlers/logger'); module.exports = async (interaction) => { try { - const target = await interaction.options.getString('target'); + // Get lookup query + const query = await interaction.options.getString('query'); + // Make API request await axios - .get(`http://ip-api.com/json/${target}`) + // Make a get request + .get(`http://ip-api.com/json/${query}`) + + // If successful .then(async (res) => { + // If query failed if (res.data.status === 'fail') { + // Create embed object const embed = { title: 'Lookup', description: `${res.data.message}: ${res.data.query}`, @@ -18,8 +25,14 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply await interaction.editReply({ embeds: [embed] }); - } else if (res.data.status === 'success') { + } + + // If query is successful + else if (res.data.status === 'success') { + // Create embed object const embed = { title: 'Lookup', fields: [ @@ -61,13 +74,15 @@ module.exports = async (interaction) => { timestamp: new Date(), footer: { iconURL: config.footer.icon, text: config.footer.text }, }; + + // Send interaction reply await interaction.editReply({ embeds: [embed] }); } }) - .catch(async (err) => { - await logger.error(err); + .catch(async (e) => { + await logger.error(e); }); - } catch { - await logger.error(); + } catch (e) { + await logger.error(e); } }; diff --git a/src/commands/utilities/addons/users.js b/src/commands/utilities/addons/users.js deleted file mode 100644 index 2431f8c..0000000 --- a/src/commands/utilities/addons/users.js +++ /dev/null @@ -1,35 +0,0 @@ -const { Permissions } = require('discord.js'); - -const config = require('../../../../config.json'); -const logger = require('../../../handlers/logger'); - -module.exports = async (interaction) => { - try { - if (!interaction.member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) { - const embed = { - title: 'Users failed', - description: - 'You need to have permission to manage this guild (MANAGE_GUILD)', - }; - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - - // eslint-disable-next-line max-len - const userList = await interaction.client.users.cache.filter( - (user) => !user.bot - ); - - userList.map((user) => { - logger.info(user); - }); - - // await interaction.client.guilds.cache.get(interaction.member.guild.id).then((user) => logger.info(user)); - - // await interaction.client.users.fetch().then(async (user) => await logger.info(`${user}`)); - // // interaction.client.users.fetch().then((user) => { - // // console.log(user); - // // }).catch(console.error); - } catch { - await logger.error(); - } -}; diff --git a/src/commands/utilities/index.js b/src/commands/utilities/index.js index 7cdfedc..042a814 100644 --- a/src/commands/utilities/index.js +++ b/src/commands/utilities/index.js @@ -1,8 +1,6 @@ const { SlashCommandBuilder } = require('@discordjs/builders'); -const { Permissions } = require('discord.js'); const lookup = require('./addons/lookup'); -const users = require('./addons/users'); module.exports = { data: new SlashCommandBuilder() @@ -16,8 +14,8 @@ module.exports = { ) .addStringOption((option) => option - .setName('target') - .setDescription('The target you want to look up.') + .setName('query') + .setDescription('The query you want to look up.') .setRequired(true) ) ) @@ -25,10 +23,10 @@ module.exports = { subcommand.setName('users').setDescription('Iterate all users (ADMIN)') ), async execute(interaction) { + // If subcommand is lookup if (interaction.options.getSubcommand() === 'lookup') { + // Execute lookup addon await lookup(interaction); - } else if (interaction.options.getSubcommand() === 'users') { - await users(interaction); } }, }; diff --git a/src/events/guildCreate.js b/src/events/guildCreate.js index ea9133e..1aa28f3 100644 --- a/src/events/guildCreate.js +++ b/src/events/guildCreate.js @@ -3,8 +3,13 @@ const guilds = require('../helpers/database/models/guildSchema'); module.exports = { name: 'guildCreate', async execute(guild) { + // Destructure client const { client } = guild; + + // Create guild object if not already created await guilds.findOne({ guildId: guild.id }, { new: true, upsert: true }); + + // Set client status await client.user.setPresence({ activities: [ { type: 'WATCHING', name: `${client.guilds.cache.size} guilds` }, diff --git a/src/events/interactionCreate.js b/src/events/interactionCreate.js index e9d55d3..d26be70 100644 --- a/src/events/interactionCreate.js +++ b/src/events/interactionCreate.js @@ -6,19 +6,25 @@ const { guilds } = require('../helpers/database/models'); module.exports = { name: 'interactionCreate', async execute(interaction) { + // Destructure member, client const { member, client } = interaction; + // If interaction is command if (interaction.isCommand()) { + // Get command from collection const command = client.commands.get(interaction.commandName); + // If command do not exist if (!command) return; + // Create guild if it does not exist already await guilds.findOne( { guildId: member.guild.id }, { new: true, upsert: true } ); try { + // Defer reply await interaction.deferReply({ embeds: [ { @@ -35,10 +41,17 @@ module.exports = { ], ephemeral: true, }); + + // Execute command await command.execute(interaction); + + // Send debug message await logger.debug(`Executing command: ${interaction.commandName}`); } catch (err) { + // Send debug message await logger.error(err); + + // Send interaction reply await interaction.reply({ embeds: [ { @@ -57,35 +70,5 @@ module.exports = { }); } } - - // else if (interaction.isButton()) { - // const button = client.buttons.get(interaction.customId); - - // try { - // if (!button) { - // await interaction.deferReply(); - // await interaction.editReply({ content: `Button not exist: ${interaction.customId}` }); - // } - - // await button.execute(interaction); - // await logger.debug(`Button pressed: ${interaction.customId}`); - // } catch (err) { - // await logger.error(err); - // } - // } else if (interaction.isSelectMenu()) { - // const menu = client.menus.get(interaction.customId); - - // try { - // if (!menu) { - // await interaction.deferReply(); - // await interaction.editReply({ content: `Menu not exist: ${interaction.customId}` }); - // } - - // await menu.execute(interaction); - // await logger.debug(`Menu pressed: ${interaction.customId}`); - // } catch (err) { - // await logger.error(err); - // } - // } }, }; diff --git a/src/events/memberCreate.js b/src/events/memberCreate.js deleted file mode 100644 index 7ff7ae2..0000000 --- a/src/events/memberCreate.js +++ /dev/null @@ -1,19 +0,0 @@ -const logger = require('../handlers/logger'); - -const users = require('../helpers/database/models/userSchema'); - -module.exports = { - name: 'interactionCreate', - async execute(user) { - // const guildExist = await guilds - // .findOne({ guildId: guild.id }) - // .then(logger.debug(`Found guild: ${guild.id}`)) - // .catch(logger.error); - // if (!guildExist) { - // await guilds - // .create({ guildId: guild.id }) - // .then(() => logger.debug(`Create guild: ${guild.id} was success`)) - // .catch((e) => logger.error(e)); - // } - }, -}; diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index 7ac0415..1df6235 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -12,29 +12,24 @@ module.exports = { name: 'messageCreate', async execute(message) { // Get guild object - const guild = await guilds.findOne({ guildId: message.guild.id }); - // Stop if message author is bot - + // If message author is bot if (message.author.bot) return; // Create user if not already created - await users.findOne( { userId: message.author.id }, { new: true, upsert: true } ); - // Stop if message content is shorter than guild configured minimum length - + // If message length is below guild minimum length if (message.content.length < guild.credits.minimumLength) return; // Needs to be updated for multi-guild to function properly // if (config.credits.excludedChannels.includes(message.channel.id)) return; // Check if user has a timeout - const isTimeout = await timeouts.findOne({ guildId: message.guild.id, userId: message.author.id, @@ -42,44 +37,52 @@ module.exports = { }); // If user is not on timeout - if (!isTimeout) { // Add credits to user - await credits .findOneAndUpdate( { userId: message.author.id, guildId: message.guild.id }, { $inc: { balance: guild.credits.rate } }, { new: true, upsert: true } ) - .then(async () => + + // If successful + .then(async () => { + // Send debug message logger.debug( `Guild: ${message.guild.id} Credits added to user: ${message.author.id}` - ) - ) + ); + }) + + // If error .catch(async (err) => { + // Send error message await logger.error(err); }); // Add points to user - await experiences .findOneAndUpdate( { userId: message.author.id, guildId: message.guild.id }, { $inc: { points: guild.points.rate } }, { new: true, upsert: true } ) - .then(async () => + + // If successful + .then(async () => { + // Send debug message logger.debug( `Guild: ${message.guild.id} Points added to user: ${message.author.id}` - ) - ) + ); + }) + + // If error .catch(async (err) => { + // Send error message await logger.error(err); }); // Create a timeout for the user - await timeouts.create({ guildId: message.guild.id, userId: message.author.id, @@ -87,6 +90,7 @@ module.exports = { }); setTimeout(async () => { + // Send debug message await logger.debug( `Guild: ${message.guild.id} User: ${ message.author.id @@ -96,7 +100,6 @@ module.exports = { ); // When timeout is out, remove it from the database - await timeouts.deleteOne({ guildId: message.guild.id, userId: message.author.id, @@ -104,6 +107,7 @@ module.exports = { }); }, guild.credits.timeout); } else { + // Sned debug message await logger.debug( `Guild: ${message.guild.id} User: ${ message.author.id diff --git a/src/events/ready.js b/src/events/ready.js index 79eac57..0a32014 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -4,7 +4,10 @@ module.exports = { name: 'ready', once: true, async execute(client) { + // Send info message await logger.info(`Ready! Logged in as ${client.user.tag}`); + + // Set client status await client.user.setPresence({ activities: [ { type: 'WATCHING', name: `${client.guilds.cache.size} guilds` }, diff --git a/src/handlers/api.js b/src/handlers/api.js deleted file mode 100644 index 69ad5b1..0000000 --- a/src/handlers/api.js +++ /dev/null @@ -1,8 +0,0 @@ -const axios = require('axios'); - -const config = require('../../config.json'); - -module.exports = axios.create({ - baseURL: config.credits.url, - headers: { Authorization: `Bearer ${config.credits.token}` }, -});