diff --git a/.vscode/settings.json b/.vscode/settings.json index 7843c0e..be6be31 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -46,5 +46,5 @@ "titleBar.inactiveBackground": "#33669999", "titleBar.inactiveForeground": "#e7e7e799" }, - "cSpell.words": ["discordjs", "pino", "upsert", "uuidv"] + "cSpell.words": ["Controlpanel", "discordjs", "pino", "upsert", "uuidv"] } diff --git a/src/commands/credits/addons/redeem.js b/src/commands/credits/addons/redeem.js index bd2e8a1..dce36fb 100644 --- a/src/commands/credits/addons/redeem.js +++ b/src/commands/credits/addons/redeem.js @@ -1,11 +1,13 @@ const { v4: uuidv4 } = require('uuid'); +const axios = require('axios'); const config = require('../../../../config.json'); const logger = require('../../../handlers/logger'); +const guilds = require('../../../helpers/database/models/guildSchema'); const credits = require('../../../helpers/database/models/creditSchema'); const creditNoun = require('../../../helpers/creditNoun'); -const api = require('../../../handlers/api'); +// const api = require('../../../handlers/api'); module.exports = async (interaction) => { try { @@ -56,6 +58,13 @@ module.exports = async (interaction) => { } const code = uuidv4(); + const guild = await guilds.findOne({ guildId: interaction.member.guild.id }); + + const api = axios.create({ + baseURL: guild.credits.url, + headers: { Authorization: `Bearer ${guild.credits.token}` }, + }); + await api .post('vouchers', { uses: 1, diff --git a/src/commands/credits/addons/settings.js b/src/commands/credits/addons/settings.js new file mode 100644 index 0000000..285246c --- /dev/null +++ b/src/commands/credits/addons/settings.js @@ -0,0 +1,36 @@ +const config = require('../../../../config.json'); +const logger = require('../../../handlers/logger'); + +const guilds = require('../../../helpers/database/models/guildSchema'); + +module.exports = async (interaction) => { + try { + const status = await interaction.options.getBoolean('status'); + const url = await interaction.options.getString('url'); + const token = await interaction.options.getString('token'); + const rate = await interaction.options.getNumber('rate'); + const minimumLength = await interaction.options.getNumber('minimum-length'); + + const guild = await guilds.findOne({ guildId: interaction.member.guild.id }); + + guild.credits.status = status !== null ? status : guild.credits.status; + guild.credits.url = url !== null ? url : guild.credits.url; + guild.credits.token = token !== null ? token : guild.credits.token; + guild.credits.rate = rate !== null ? rate : guild.credits.rate; + // eslint-disable-next-line max-len + guild.credits.minimumLength = minimumLength !== null ? minimumLength : guild.credits.minimumLength; + + await guild.save(); + const embed = { + title: 'Credits', + description: 'Following settings is set', + color: config.colors.success, + fields: [{ name: 'Status', value: `${guild.credits.status}`, inline: true }, { name: 'URL', value: `${guild.credits.url}`, inline: true }, { name: 'Token', value: `${guild.credits.token}` }, { name: 'Rate', value: `${guild.credits.rate}`, inline: true }, { name: 'Minimum Length', value: `${guild.credits.minimumLength}`, inline: true }], + timestamp: new Date(), + footer: { iconURL: config.footer.icon, text: config.footer.text }, + }; + return interaction.editReply({ embeds: [embed], ephemeral: true }); + } catch { + logger.error(); + } +}; diff --git a/src/commands/credits/index.js b/src/commands/credits/index.js index 58a9172..bee2b97 100644 --- a/src/commands/credits/index.js +++ b/src/commands/credits/index.js @@ -1,6 +1,9 @@ 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 give = require('./addons/give'); @@ -9,6 +12,7 @@ const take = require('./addons/take'); const top = require('./addons/top'); const transfer = require('./addons/transfer'); const set = require('./addons/set'); +const settings = require('./addons/settings'); module.exports = { permissions: new Permissions([ @@ -69,8 +73,43 @@ module.exports = { .setName('user') .setDescription('The user you want to set credits on.') .setRequired(true)) - .addIntegerOption((option) => option.setName('amount').setDescription('The amount you will set.').setRequired(true))), + .addIntegerOption((option) => option.setName('amount').setDescription('The amount you will set.').setRequired(true))) + .addSubcommand((subcommand) => subcommand + .setName('settings') + .setDescription('Manage credit settings. (ADMIN)') + .addBooleanOption((option) => option + .setName('status') + .setDescription('Toggle credits.')) + .addStringOption((option) => option + .setName('url') + .setDescription('Controlpanel.gg URL.')) + .addStringOption((option) => option + .setName('token') + .setDescription('Controlpanel.gg token.')) + .addNumberOption((option) => option + .setName('rate') + .setDescription('Credits rate.')) + .addNumberOption((option) => option + .setName('minimum-length') + .setDescription('Minimum length for credits.'))), async execute(interaction) { + const guild = await guilds.findOne({ guildId: interaction.member.guild.id }); + + if (interaction.options.getSubcommand() === 'settings') { + await settings(interaction); + } + + 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 (interaction.options.getSubcommand() === 'balance') { await balance(interaction); } else if (interaction.options.getSubcommand() === 'gift') { @@ -88,5 +127,6 @@ module.exports = { } else if (interaction.options.getSubcommand() === 'set') { await set(interaction); } + return true; }, }; diff --git a/src/events/interactionCreate.js b/src/events/interactionCreate.js index de79000..6066b56 100644 --- a/src/events/interactionCreate.js +++ b/src/events/interactionCreate.js @@ -1,6 +1,8 @@ const config = require('../../config.json'); const logger = require('../handlers/logger'); +const guilds = require('../helpers/database/models/guildSchema'); + module.exports = { name: 'interactionCreate', async execute(interaction) { @@ -10,6 +12,12 @@ module.exports = { if (!command) return; + const guildExist = await guilds.findOne({ guildId: interaction.member.guild.id }); + + if (!guildExist) { await guilds.create({ guildId: interaction.member.guild.id }); } + + console.log(guildExist); + try { await interaction.deferReply({ embeds: [ diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index ccfa01a..59ce0e0 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -1,6 +1,7 @@ const config = require('../../config.json'); const logger = require('../handlers/logger'); +const guilds = require('../helpers/database/models/guildSchema'); const credits = require('../helpers/database/models/creditSchema'); const talkedRecently = new Set(); @@ -8,14 +9,16 @@ const talkedRecently = new Set(); module.exports = { name: 'messageCreate', async execute(message) { + const guild = await guilds.findOne({ guildId: message.guild.id }); + if (message.author.bot) return; - if (message.content.length < config.credits.minimumLength) return; + if (message.content.length < guild.credits.minimumLength) return; if (config.credits.excludedChannels.includes(message.channel.id)) return; if (!talkedRecently.has(message.author.id)) { await credits .findOneAndUpdate( { userId: message.author.id }, - { $inc: { balance: config.credits.rate } }, + { $inc: { balance: guild.credits.rate } }, { new: true, upsert: true }, ) .then(async () => logger.debug(`Credits added to user: ${message.author.id}`)) @@ -26,15 +29,15 @@ module.exports = { setTimeout(() => { logger.debug( `User: ${message.author.id} has not talked within last ${ - config.credits.timeout / 1000 + guild.credits.timeout / 1000 } seconds, credits can be given`, ); talkedRecently.delete(message.author.id); - }, config.credits.timeout); + }, guild.credits.timeout); } else { logger.debug( `User: ${message.author.id} has talked within last ${ - config.credits.timeout / 1000 + guild.credits.timeout / 1000 } seconds, no credits given`, ); } diff --git a/src/helpers/database/models/guildSchema.js b/src/helpers/database/models/guildSchema.js new file mode 100644 index 0000000..e05bcee --- /dev/null +++ b/src/helpers/database/models/guildSchema.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose'); + +const guildSchema = new mongoose.Schema( + { + guildId: { + type: mongoose.SchemaTypes.Decimal128, + required: true, + unique: true, + index: true, + }, + credits: { + status: { + type: mongoose.SchemaTypes.Boolean, + default: false, + }, + url: { + type: mongoose.SchemaTypes.String, + }, + token: { + type: mongoose.SchemaTypes.String, + }, + rate: { + type: mongoose.SchemaTypes.Number, default: 1, + }, + minimumLength: { + type: mongoose.SchemaTypes.Number, default: 5, + }, + }, + }, + { timestamps: true }, +); + +module.exports = mongoose.model('guild', guildSchema);