diff --git a/dist/buttons/primary/index.js b/dist/buttons/primary/index.js new file mode 100644 index 0000000..abbf3e0 --- /dev/null +++ b/dist/buttons/primary/index.js @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.metadata = void 0; +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.metadata = { guildOnly: false, ephemeral: false }; +// Execute the function +const execute = (interaction) => { + logger_1.default.debug(interaction.customId, "primary button clicked!"); +}; +exports.execute = execute; diff --git a/dist/commands/config/index.js b/dist/commands/config/index.js new file mode 100644 index 0000000..0b3490b --- /dev/null +++ b/dist/commands/config/index.js @@ -0,0 +1,65 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const audits_1 = __importDefault(require("./modules/audits")); +const cpgg_1 = __importDefault(require("./modules/cpgg")); +const credits_1 = __importDefault(require("./modules/credits")); +const embeds_1 = __importDefault(require("./modules/embeds")); +const points_1 = __importDefault(require("./modules/points")); +const shop_1 = __importDefault(require("./modules/shop")); +const welcome_1 = __importDefault(require("./modules/welcome")); +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("config") + .setDescription("Manage guild configurations.") + .setDMPermission(false) + // Modules + .addSubcommand(audits_1.default.builder) + .addSubcommand(cpgg_1.default.builder) + .addSubcommand(credits_1.default.builder) + .addSubcommand(embeds_1.default.builder) + .addSubcommand(points_1.default.builder) + .addSubcommand(shop_1.default.builder) + .addSubcommand(welcome_1.default.builder); +// Execute function +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "audits": + yield audits_1.default.execute(interaction); + break; + case "cpgg": + yield cpgg_1.default.execute(interaction); + break; + case "credits": + yield credits_1.default.execute(interaction); + break; + case "embeds": + yield embeds_1.default.execute(interaction); + break; + case "points": + yield points_1.default.execute(interaction); + break; + case "shop": + yield shop_1.default.execute(interaction); + break; + case "welcome": + yield welcome_1.default.execute(interaction); + break; + default: + throw new Error("No module found for that specific command."); + } +}); +exports.execute = execute; diff --git a/dist/commands/config/modules/audits/index.js b/dist/commands/config/modules/audits/index.js new file mode 100644 index 0000000..9d3b0df --- /dev/null +++ b/dist/commands/config/modules/audits/index.js @@ -0,0 +1,89 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("audits") + .setDescription("Audits") + .addBooleanOption((option) => option + .setName("status") + .setDescription("Should audits be enabled?") + .setRequired(true)) + .addChannelOption((option) => option + .setName("channel") + .setDescription("Channel for audit messages.") + .addChannelTypes(discord_js_1.ChannelType.GuildText) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { guild, options } = interaction; + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + const status = options.getBoolean("status"); + const channel = options.getChannel("channel"); + if (!guild) + throw new Error("Guild not found."); + if (!channel) + throw new Error("Channel not found."); + if (status === null) + throw new Error("Status not found."); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + auditsEnabled: status, + auditsChannelId: channel.id, + }, + create: { + id: guild.id, + auditsEnabled: status, + auditsChannelId: channel.id, + }, + }); + logger_1.default.silly(createGuild); + const embedSuccess = new discord_js_1.EmbedBuilder() + .setTitle("[:hammer:] Audits") + .setDescription("Guild configuration updated successfully.") + .setColor(successColor) + .addFields({ + name: "πŸ€– Status", + value: `${createGuild.auditsEnabled + ? ":white_check_mark: Enabled" + : ":x: Disabled"}`, + inline: true, + }, { + name: "🌊 Channel", + value: `<#${createGuild.auditsChannelId}>`, + inline: true, + }) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield interaction.editReply({ + embeds: [embedSuccess], + }); + return; + }), +}; diff --git a/dist/commands/config/modules/cpgg/index.js b/dist/commands/config/modules/cpgg/index.js new file mode 100644 index 0000000..4890c04 --- /dev/null +++ b/dist/commands/config/modules/cpgg/index.js @@ -0,0 +1,95 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const encryption_1 = __importDefault(require("../../../../helpers/encryption")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("cpgg") + .setDescription("Controlpanel.gg") + .addStringOption((option) => option + .setName("scheme") + .setDescription(`Controlpanel.gg Scheme`) + .setRequired(true) + .setChoices({ name: "HTTPS (secure)", value: "https" }, { name: "HTTP (insecure)", value: "http" })) + .addStringOption((option) => option + .setName("domain") + .setDescription(`Controlpanel.gg Domain`) + .setRequired(true)) + .addStringOption((option) => option + .setName("token") + .setDescription(`Controlpanel.gg Application API`) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const tokenData = options.getString("token"); + const scheme = options.getString("scheme"); + const domain = options.getString("domain"); + const token = tokenData && encryption_1.default.encrypt(tokenData); + const url = scheme && domain && encryption_1.default.encrypt(`${scheme}://${domain}`); + if (!guild) + throw new Error("No guild found"); + if (!token) + throw new Error("Token not found"); + if (!url) + throw new Error("URL not found"); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + apiCpggTokenIv: token.iv, + apiCpggTokenContent: token.content, + apiCpggUrlIv: url.iv, + apiCpggUrlContent: url.content, + }, + create: { + id: guild.id, + apiCpggTokenIv: token.iv, + apiCpggTokenContent: token.content, + apiCpggUrlIv: url.iv, + apiCpggUrlContent: url.content, + }, + }); + logger_1.default.silly(createGuild); + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Updated API credentials.`); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] CPGG") + .setDescription(`The following configuration will be used. + +**Scheme**: ${scheme} +**Domain**: ${domain} +**Token**: ends with ${tokenData === null || tokenData === void 0 ? void 0 : tokenData.slice(-4)}`) + .setColor(successColor) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + })); + return; + }), +}; diff --git a/dist/commands/config/modules/credits/index.js b/dist/commands/config/modules/credits/index.js new file mode 100644 index 0000000..bccb914 --- /dev/null +++ b/dist/commands/config/modules/credits/index.js @@ -0,0 +1,140 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("credits") + .setDescription(`Configure this guild's credits module.`) + .addBooleanOption((option) => option + .setName("enabled") + .setDescription("Do you want to activate the credit module?") + .setRequired(true)) + .addNumberOption((option) => option + .setName("rate") + .setDescription("Credit rate per message.") + .setRequired(true) + .setMinValue(1)) + .addNumberOption((option) => option + .setName("minimum-length") + .setDescription("Minimum message length to receive credit.") + .setRequired(true)) + .addNumberOption((option) => option + .setName("work-rate") + .setDescription("The maximum amount of credit that can be obtained within a working day.") + .setRequired(true) + .setMinValue(1)) + .addNumberOption((option) => option + .setName("work-timeout") + .setDescription("How long you need to wait before you can work again provided in seconds.") + .setRequired(true)) + .addNumberOption((option) => option + .setName("timeout") + .setDescription("How long you need to wait before you can earn more credits.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { guild, options } = interaction; + const enabled = options.getBoolean("enabled"); + const rate = options.getNumber("rate"); + const timeout = options.getNumber("timeout"); + const minimumLength = options.getNumber("minimum-length"); + const workRate = options.getNumber("work-rate"); + const workTimeout = options.getNumber("work-timeout"); + if (!guild) + throw new Error("Guild not found."); + if (typeof enabled !== "boolean") + throw new Error("Enabled option is not a boolean."); + if (typeof rate !== "number") + throw new Error("Rate is not a number."); + if (typeof workRate !== "number") + throw new Error("Work rate is not a number."); + if (typeof workTimeout !== "number") + throw new Error("Work timeout is not a number."); + if (typeof timeout !== "number") + throw new Error("Timeout is not a number."); + if (typeof minimumLength !== "number") + throw new Error("Minimum length is not a number."); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + creditsEnabled: enabled, + creditsRate: rate, + creditsTimeout: timeout, + creditsWorkRate: workRate, + creditsWorkTimeout: workTimeout, + creditsMinimumLength: minimumLength, + }, + create: { + id: guild.id, + creditsEnabled: enabled, + creditsRate: rate, + creditsTimeout: timeout, + creditsWorkRate: workRate, + creditsWorkTimeout: workTimeout, + creditsMinimumLength: minimumLength, + }, + }); + logger_1.default.silly(createGuild); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Credits") + .setDescription("Credits settings updated") + .setColor(successColor) + .addFields({ + name: "πŸ€– Enabled?", + value: `${createGuild.creditsEnabled}`, + inline: true, + }, { + name: "πŸ“ˆ Rate", + value: `${createGuild.creditsRate}`, + inline: true, + }, { + name: "πŸ“ˆ Work Rate", + value: `${createGuild.creditsWorkRate}`, + inline: true, + }, { + name: "πŸ”¨ Minimum Length", + value: `${createGuild.creditsMinimumLength}`, + inline: true, + }, { + name: "⏰ Timeout", + value: `${createGuild.creditsTimeout}`, + inline: true, + }, { + name: "⏰ Work Timeout", + value: `${createGuild.creditsWorkTimeout}`, + inline: true, + }) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield interaction.editReply({ + embeds: [interactionEmbed], + }); + return; + }), +}; diff --git a/dist/commands/config/modules/embeds/components/getValues/index.js b/dist/commands/config/modules/embeds/components/getValues/index.js new file mode 100644 index 0000000..192ae0f --- /dev/null +++ b/dist/commands/config/modules/embeds/components/getValues/index.js @@ -0,0 +1,67 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../../../middlewares/logger")); +exports.default = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { options, guild } = interaction; + if (!guild) + throw new Error("Guild not found"); + const embedConfig = yield (0, getEmbedData_1.default)(guild); + if (!embedConfig) + throw new Error("Embed config not found"); + const newSuccessColor = options.getString("success-color"); + const newWaitColor = options.getString("wait-color"); + const newErrorColor = options.getString("error-color"); + const newFooterIcon = options.getString("footer-icon"); + const newFooterText = options.getString("footer-text"); + if (!newSuccessColor) + throw new Error("Success color not found"); + if (!newWaitColor) + throw new Error("Wait color not found"); + if (!newErrorColor) + throw new Error("Error color not found"); + if (!newFooterIcon) + throw new Error("Footer icon not found"); + if (!newFooterText) + throw new Error("Footer text not found"); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + embedColorSuccess: newSuccessColor, + embedColorWait: newWaitColor, + embedColorError: newErrorColor, + embedFooterIcon: newFooterIcon, + embedFooterText: newFooterText, + }, + create: { + id: guild.id, + embedColorSuccess: newSuccessColor, + embedColorWait: newWaitColor, + embedColorError: newErrorColor, + embedFooterIcon: newFooterIcon, + embedFooterText: newFooterText, + }, + }); + logger_1.default.silly(createGuild); + const successColor = createGuild.embedColorSuccess; + const waitColor = createGuild.embedColorWait; + const errorColor = createGuild.embedColorError; + const footerText = createGuild.embedFooterText; + const footerIcon = createGuild.embedFooterIcon; + return { successColor, waitColor, errorColor, footerText, footerIcon }; +}); diff --git a/dist/commands/config/modules/embeds/index.js b/dist/commands/config/modules/embeds/index.js new file mode 100644 index 0000000..cbc7636 --- /dev/null +++ b/dist/commands/config/modules/embeds/index.js @@ -0,0 +1,91 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getValues_1 = __importDefault(require("./components/getValues")); +exports.default = { + builder: (command) => { + return command + .setName("embeds") + .setDescription(`Embeds`) + .addStringOption((option) => option + .setName("success-color") + .setDescription("No provided description") + .setRequired(true)) + .addStringOption((option) => option + .setName("wait-color") + .setDescription("No provided description") + .setRequired(true)) + .addStringOption((option) => option + .setName("error-color") + .setDescription("No provided description") + .setRequired(true)) + .addStringOption((option) => option + .setName("footer-icon") + .setDescription("No provided description") + .setRequired(true)) + .addStringOption((option) => option + .setName("footer-text") + .setDescription("No provided description") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { guild } = interaction; + if (!guild) + throw new Error("Guild not found"); + const { successColor, waitColor, errorColor, footerText, footerIcon } = yield (0, getValues_1.default)(interaction); + const embed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Embeds") + .setFooter({ text: footerText, iconURL: footerIcon }) + .setTimestamp(new Date()); + embed + .setDescription("Following embed configuration will be used.") + .setColor(successColor) + .addFields([ + { + name: "🟒 Success Color", + value: `${successColor}`, + inline: true, + }, + { + name: "🟑 Wait Color", + value: `${waitColor}`, + inline: true, + }, + { + name: "πŸ”΄ Error Color", + value: `${errorColor}`, + inline: true, + }, + { + name: "πŸ–ΌοΈ Footer Icon", + value: `${footerIcon}`, + inline: true, + }, + { + name: "πŸ“„ Footer Text", + value: `${footerText}`, + inline: true, + }, + ]); + yield interaction.editReply({ + embeds: [embed], + }); + return; + }), +}; diff --git a/dist/commands/config/modules/points/index.js b/dist/commands/config/modules/points/index.js new file mode 100644 index 0000000..7f090a2 --- /dev/null +++ b/dist/commands/config/modules/points/index.js @@ -0,0 +1,112 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("points") + .setDescription("Points") + .addBooleanOption((option) => option + .setName("status") + .setDescription("Should credits be enabled?") + .setRequired(true)) + .addNumberOption((option) => option + .setName("rate") + .setDescription("Amount of credits per message.") + .setRequired(true)) + .addNumberOption((option) => option + .setName("minimum-length") + .setDescription("Minimum length of message to earn credits.") + .setRequired(true)) + .addNumberOption((option) => option + .setName("timeout") + .setDescription("Timeout between earning credits (milliseconds).") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const status = options === null || options === void 0 ? void 0 : options.getBoolean("status"); + const rate = options === null || options === void 0 ? void 0 : options.getNumber("rate"); + const timeout = options === null || options === void 0 ? void 0 : options.getNumber("timeout"); + const minimumLength = options === null || options === void 0 ? void 0 : options.getNumber("minimum-length"); + if (!guild) + throw new Error("Guild is required"); + if (status === null) + throw new Error("Status must be specified"); + if (!rate) + throw new Error("Rate must be specified"); + if (!timeout) + throw new Error("Timeout must be specified"); + if (!minimumLength) + throw new Error("Minimum length must be specified"); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + pointsEnabled: status, + pointsRate: rate, + pointsTimeout: timeout, + pointsMinimumLength: minimumLength, + }, + create: { + id: guild.id, + pointsEnabled: status, + pointsRate: rate, + pointsTimeout: timeout, + pointsMinimumLength: minimumLength, + }, + }); + logger_1.default.silly(createGuild); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Points") + .setDescription("Points settings updated") + .setColor(successColor) + .addFields({ + name: "πŸ€– Status", + value: `${createGuild.pointsEnabled}`, + inline: true, + }, { + name: "πŸ“ˆ Rate", + value: `${createGuild.pointsRate}`, + inline: true, + }, { + name: "πŸ”¨ Minimum Length", + value: `${createGuild.pointsMinimumLength}`, + inline: true, + }, { + name: "⏰ Timeout", + value: `${createGuild.pointsTimeout}`, + inline: true, + }) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + })); + return; + }), +}; diff --git a/dist/commands/config/modules/shop/index.js b/dist/commands/config/modules/shop/index.js new file mode 100644 index 0000000..0699bcc --- /dev/null +++ b/dist/commands/config/modules/shop/index.js @@ -0,0 +1,86 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("shop") + .setDescription("Shop") + .addBooleanOption((option) => option + .setName("roles-status") + .setDescription("Should roles be enabled?") + .setRequired(true)) + .addNumberOption((option) => option + .setName("roles-price-per-hour") + .setDescription("Price per hour for roles.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const rolesStatus = options === null || options === void 0 ? void 0 : options.getBoolean("roles-status"); + const rolesPricePerHour = options === null || options === void 0 ? void 0 : options.getNumber("roles-price-per-hour"); + if (!guild) + throw new Error("Guild not found"); + if (rolesStatus === null) + throw new Error("Status must be provided"); + if (!rolesPricePerHour) + throw new Error("Roles price per hour must be provided"); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + shopRolesEnabled: rolesStatus, + shopRolesPricePerHour: rolesPricePerHour, + }, + create: { + id: guild.id, + shopRolesEnabled: rolesStatus, + shopRolesPricePerHour: rolesPricePerHour, + }, + }); + logger_1.default.silly(createGuild); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Shop") + .setDescription("Shop settings updated") + .setColor(successColor) + .addFields({ + name: "πŸ€– Roles Status", + value: `${createGuild.shopRolesEnabled}`, + inline: true, + }, { + name: "🌊 Roles Price Per Hour", + value: `${createGuild.shopRolesPricePerHour}`, + inline: true, + }) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + })); + return; + }), +}; diff --git a/dist/commands/config/modules/welcome/index.js b/dist/commands/config/modules/welcome/index.js new file mode 100644 index 0000000..0ca942b --- /dev/null +++ b/dist/commands/config/modules/welcome/index.js @@ -0,0 +1,130 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("welcome") + .setDescription("Welcome") + .addBooleanOption((option) => option + .setName("status") + .setDescription("Should welcome be enabled?") + .setRequired(true)) + .addChannelOption((option) => option + .setName("join-channel") + .setDescription("Channel for join messages.") + .addChannelTypes(discord_js_1.ChannelType.GuildText) + .setRequired(true)) + .addChannelOption((option) => option + .setName("leave-channel") + .setDescription("Channel for leave messages.") + .addChannelTypes(discord_js_1.ChannelType.GuildText) + .setRequired(true)) + .addStringOption((option) => option + .setName("leave-message") + .setDescription("Message for leave messages.") + .setRequired(true)) + .addStringOption((option) => option + .setName("join-message") + .setDescription("Message for join messages.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const status = options === null || options === void 0 ? void 0 : options.getBoolean("status"); + const joinChannel = options === null || options === void 0 ? void 0 : options.getChannel("join-channel"); + const leaveChannel = options === null || options === void 0 ? void 0 : options.getChannel("leave-channel"); + const joinChannelMessage = options === null || options === void 0 ? void 0 : options.getString("join-message"); + const leaveChannelMessage = options === null || options === void 0 ? void 0 : options.getString("leave-message"); + if (!guild) + throw new Error("Guild not found"); + if (status === null) + throw new Error("Status not specified"); + if (!joinChannel) + throw new Error("Join channel not specified"); + if (!joinChannelMessage) + throw new Error("Join channel message not specified"); + if (!leaveChannel) + throw new Error("Leave channel not specified"); + if (!leaveChannelMessage) + throw new Error("Leave channel message not specified"); + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: { + welcomeEnabled: status, + welcomeJoinChannelId: joinChannel.id, + welcomeJoinChannelMessage: joinChannelMessage, + welcomeLeaveChannelId: leaveChannel.id, + welcomeLeaveChannelMessage: leaveChannelMessage, + }, + create: { + id: guild.id, + welcomeEnabled: status, + welcomeJoinChannelId: joinChannel.id, + welcomeJoinChannelMessage: joinChannelMessage, + welcomeLeaveChannelId: leaveChannel.id, + welcomeLeaveChannelMessage: leaveChannelMessage, + }, + }); + logger_1.default.silly(createGuild); + const interactionEmbedDisabled = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Welcome") + .setDescription("This module is currently disabled, please enable it to continue.") + .setColor(successColor) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + if (!createGuild.welcomeEnabled) { + return interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbedDisabled], + }); + } + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:tools:] Welcome") + .setDescription(`The following configuration will be used. + + [πŸ‘‹] **Welcome** + + γ…€**Channel**: <#${createGuild.welcomeJoinChannelId}> + γ…€**Message**: ${createGuild.welcomeJoinChannelMessage} + + [πŸšͺ] **Leave** + + γ…€**Channel**: <#${createGuild.welcomeLeaveChannelId}> + γ…€**Message**: ${createGuild.welcomeLeaveChannelMessage}`) + .setColor(successColor) + .setTimestamp() + .setFooter({ + iconURL: footerIcon, + text: footerText, + }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + })); + return true; + }), +}; diff --git a/dist/commands/counters/index.js b/dist/commands/counters/index.js new file mode 100644 index 0000000..8d545c9 --- /dev/null +++ b/dist/commands/counters/index.js @@ -0,0 +1,33 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const view_1 = require("./modules/view"); +// +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("counters") + .setDescription("View guild counters") + .setDMPermission(false) + // Modules + .addSubcommand(view_1.builder); +// Execute function +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "view": + yield (0, view_1.execute)(interaction); + break; + default: + throw new Error("No module found for that command."); + } +}); +exports.execute = execute; diff --git a/dist/commands/counters/modules/view/index.js b/dist/commands/counters/modules/view/index.js new file mode 100644 index 0000000..cd5139f --- /dev/null +++ b/dist/commands/counters/modules/view/index.js @@ -0,0 +1,66 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../helpers/baseEmbeds"); +// 1. Create builder function. +const builder = (command) => { + return command + .setName("view") + .setDescription(`View a guild counter`) + .addChannelOption((option) => option + .setName("channel") + .setDescription(`The channel that contains the counter you want to view`) + .setRequired(true) + .addChannelTypes(discord_js_1.ChannelType.GuildText)); +}; +exports.builder = builder; +// 2. Create execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as permanent. + yield (0, deferReply_1.default)(interaction, false); + // 2. Destructure interaction object + const { options, guild } = interaction; + if (!guild) + throw new Error(`Guild not found`); + if (!options) + throw new Error(`Options not found`); + // 3. Get options + const discordChannel = options.getChannel("channel"); + if (!discordChannel) + throw new Error(`Channel not found`); + // 4. Create base embeds. + const EmbedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:1234:] View"); + // 5. Get counter from database. + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: discordChannel.id, + }, + }, + }); + if (!channelCounter) + throw new Error("No counter found for channel"); + // 6. Send embed. + yield interaction.editReply({ + embeds: [ + EmbedSuccess.setDescription(`Viewing counter for channel ${discordChannel}: ${channelCounter.count}!`), + ], + }); +}); +exports.execute = execute; diff --git a/dist/commands/credits/index.js b/dist/commands/credits/index.js new file mode 100644 index 0000000..6316886 --- /dev/null +++ b/dist/commands/credits/index.js @@ -0,0 +1,48 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const balance_1 = require("./modules/balance"); +const gift_1 = require("./modules/gift"); +const top_1 = require("./modules/top"); +const work_1 = require("./modules/work"); +// 1. Export a builder function. +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("credits") + .setDescription("Manage your credits.") + .setDMPermission(false) + // Modules + .addSubcommand(balance_1.builder) + .addSubcommand(gift_1.builder) + .addSubcommand(top_1.builder) + .addSubcommand(work_1.builder); +// 2. Export an execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "balance": + yield (0, balance_1.execute)(interaction); + break; + case "gift": + yield (0, gift_1.execute)(interaction); + break; + case "top": + yield (0, top_1.execute)(interaction); + break; + case "work": + yield (0, work_1.execute)(interaction); + break; + default: + throw new Error("Subcommand not found"); + } +}); +exports.execute = execute; diff --git a/dist/commands/credits/modules/balance/index.js b/dist/commands/credits/modules/balance/index.js new file mode 100644 index 0000000..509caf8 --- /dev/null +++ b/dist/commands/credits/modules/balance/index.js @@ -0,0 +1,90 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../helpers/baseEmbeds"); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +// 1. Export a builder function. +const builder = (command) => { + return command + .setName("balance") + .setDescription(`Check balance`) + .addUserOption((option) => option.setName("target").setDescription(`Account you want to check`)); +}; +exports.builder = builder; +// 2. Export an execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Destructure interaction object. + const { options, user, guild } = interaction; + if (!guild) + throw new Error("Server unavailable"); + if (!user) + throw new Error("User unavailable"); + if (!options) + throw new Error("Options unavailable"); + // 3. Get options from interaction. + const target = options.getUser("target"); + // 4. Create base embeds. + const EmbedSuccess = yield (0, baseEmbeds_1.success)(guild, ":credit_card:οΈ±Balance"); + // 5. Upsert the user in the database. + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: (target || user).id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: (target || user).id, + }, + where: { + id: (target || user).id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + // 6. Send embed. + yield interaction.editReply({ + embeds: [ + EmbedSuccess.setDescription(target + ? `${target} has ${createGuildMember.creditsEarned} coins in his account.` + : `You have ${createGuildMember.creditsEarned} coins in your account.`), + ], + }); +}); +exports.execute = execute; diff --git a/dist/commands/credits/modules/gift/index.js b/dist/commands/credits/modules/gift/index.js new file mode 100644 index 0000000..ddc48a7 --- /dev/null +++ b/dist/commands/credits/modules/gift/index.js @@ -0,0 +1,153 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../helpers/baseEmbeds"); +const transfer_1 = __importDefault(require("../../../../helpers/credits/transfer")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +// 1. Export a builder function. +const builder = (command) => { + return command + .setName("gift") + .setDescription(`Gift credits to an account`) + .addUserOption((option) => option + .setName("account") + .setDescription("The account you gift to") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("credits") + .setDescription("How much you gift") + .setRequired(true) + .setMinValue(1) + .setMaxValue(100000000)) + .addStringOption((option) => option + .setName("message") + .setDescription("Your personalized message to the account")); +}; +exports.builder = builder; +// 2. Export an execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Destructure interaction object. + const { options, user, guild } = interaction; + if (!guild) + throw new Error("Server unavailable"); + if (!user) + throw new Error("User unavailable"); + // 3. Get options from interaction. + const account = options.getUser("account"); + const credits = options.getInteger("credits"); + const message = options.getString("message"); + if (!account) + throw new Error("Account unavailable"); + if (typeof credits !== "number") + throw new Error("You need to enter a valid number of credits to gift"); + // 4. Create base embeds. + const receiverEmbed = yield (0, baseEmbeds_1.success)(guild, `:credit_card:οΈ±You received a gift from ${user.username}`); + // 5. Start an transaction of the credits. + yield (0, transfer_1.default)(guild, user, account, credits); + const receiverGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: account.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: account.id, + }, + where: { + id: account.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(receiverGuildMember); + if (message) + receiverEmbed.setFields({ name: "Message", value: message }); + // 6. Tell the target that they have been gifted credits. + yield account.send({ + embeds: [ + receiverEmbed.setDescription(`You received a gift containing ${credits} coins from ${user}! You now have ${receiverGuildMember.creditsEarned} coins in balance!`), + ], + }); + const senderGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(senderGuildMember); + const senderEmbed = yield (0, baseEmbeds_1.success)(guild, ":credit_card:οΈ±Send a gift"); + if (message) + senderEmbed.setFields({ name: "Message", value: message }); + // 7. Tell the sender that they have gifted the credits. + yield interaction.editReply({ + embeds: [ + senderEmbed.setDescription(`Your gift has been sent to ${account}. You now have ${senderGuildMember.creditsEarned} coins in balance!`), + ], + }); +}); +exports.execute = execute; diff --git a/dist/commands/credits/modules/top/index.js b/dist/commands/credits/modules/top/index.js new file mode 100644 index 0000000..73dc0c7 --- /dev/null +++ b/dist/commands/credits/modules/top/index.js @@ -0,0 +1,60 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../helpers/baseEmbeds"); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +// 1. Export a builder function. +const builder = (command) => { + return command.setName("top").setDescription(`View the top users`); +}; +exports.builder = builder; +// 2. Export an execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as permanent. + yield (0, deferReply_1.default)(interaction, false); + // 2. Destructure interaction object. + const { guild, client } = interaction; + if (!guild) + throw new Error("Guild not found"); + if (!client) + throw new Error("Client not found"); + // 3. Create base embeds. + const EmbedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:dollar:] Top"); + // 4. Get the top 10 users. + const topTen = yield database_1.default.guildMember.findMany({ + where: { + guildId: guild.id, + }, + orderBy: { + creditsEarned: "desc", + }, + take: 10, + }); + logger_1.default.silly(topTen); + // 5. Create the top 10 list. + const entry = (guildMember, index) => `${index + 1}. ${(0, discord_js_1.userMention)(guildMember.userId)} | :coin: ${guildMember.creditsEarned}`; + // 6. Send embed + return interaction.editReply({ + embeds: [ + EmbedSuccess.setDescription(`The top 10 users in this server are:\n\n${topTen + .map(entry) + .join("\n")}`), + ], + }); +}); +exports.execute = execute; diff --git a/dist/commands/credits/modules/work/index.js b/dist/commands/credits/modules/work/index.js new file mode 100644 index 0000000..065fad4 --- /dev/null +++ b/dist/commands/credits/modules/work/index.js @@ -0,0 +1,70 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const chance_1 = __importDefault(require("chance")); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../helpers/baseEmbeds"); +const give_1 = __importDefault(require("../../../../helpers/credits/give")); +const cooldown_1 = __importDefault(require("../../../../middlewares/cooldown")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +// 1. Export a builder function. +const builder = (command) => { + return command.setName("work").setDescription(`Work to earn credits`); +}; +exports.builder = builder; +// 2. Export an execute function. +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Destructure interaction object. + const { guild, user, commandId } = interaction; + if (!guild) + throw new Error("Guild not found"); + if (!user) + throw new Error("User not found"); + // 3. Create base embeds. + const EmbedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:dollar:] Work"); + // 4. Create new Chance instance. + const chance = new chance_1.default(); + // 5. Upsert the guild in the database. + const createGuild = yield database_1.default.guild.upsert({ + where: { + id: guild.id, + }, + update: {}, + create: { + id: guild.id, + }, + }); + logger_1.default.silly(createGuild); + if (!createGuild) + throw new Error("Guild not found"); + // 6. Create a cooldown for the user. + yield (0, cooldown_1.default)(guild, user, commandId, createGuild.creditsWorkTimeout); + // 6. Generate a random number between 0 and creditsWorkRate. + const creditsEarned = chance.integer({ + min: 0, + max: createGuild.creditsWorkRate, + }); + const upsertGuildMember = yield (0, give_1.default)(guild, user, creditsEarned); + // 8. Send embed. + yield interaction.editReply({ + embeds: [ + EmbedSuccess.setDescription(`You worked and earned **${creditsEarned}** credits! You now have **${upsertGuildMember.creditsEarned}** credits. :tada:`), + ], + }); +}); +exports.execute = execute; diff --git a/dist/commands/dns/index.js b/dist/commands/dns/index.js new file mode 100644 index 0000000..cfb2509 --- /dev/null +++ b/dist/commands/dns/index.js @@ -0,0 +1,34 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const lookup_1 = __importDefault(require("./modules/lookup")); +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("dns") + .setDescription("DNS commands.") + // Modules + .addSubcommand(lookup_1.default.builder); +// Execute the command +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "lookup": + yield lookup_1.default.execute(interaction); + break; + default: + throw new Error(`Unknown subcommand: ${interaction.options.getSubcommand()}`); + } +}); +exports.execute = execute; diff --git a/dist/commands/dns/modules/lookup/index.js b/dist/commands/dns/modules/lookup/index.js new file mode 100644 index 0000000..3408939 --- /dev/null +++ b/dist/commands/dns/modules/lookup/index.js @@ -0,0 +1,132 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios_1 = __importDefault(require("axios")); +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +exports.default = { + builder: (command) => { + return command + .setName("lookup") + .setDescription("Lookup a domain or ip. (Request sent over HTTP, proceed with caution!)") + .addStringOption((option) => option + .setName("query") + .setDescription("The query you want to look up.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, false); + const { errorColor, successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const embedTitle = "[:hammer:] Utility (Lookup)"; + const { options } = interaction; + const query = options.getString("query"); + yield axios_1.default + .get(`http://ip-api.com/json/${query}`) + .then((response) => __awaiter(void 0, void 0, void 0, function* () { + var _a, _b; + if (response.data.status !== "success") { + yield interaction.editReply({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setTitle(embedTitle) + .setFooter({ + text: footerText, + iconURL: footerIcon, + }) + .setTimestamp(new Date()) + .setColor(errorColor) + .setFooter({ text: footerText, iconURL: footerIcon }) + .setDescription(`${(_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.message}: ${(_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.query}`), + ], + }); + return; + } + yield interaction.editReply({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setTitle(embedTitle) + .setFooter({ + text: footerText, + iconURL: footerIcon, + }) + .setTimestamp(new Date()) + .setColor(successColor) + .setFields([ + { + name: ":classical_building: AS", + value: `${response.data.as || "Unknown"}`, + inline: true, + }, + { + name: ":classical_building: ISP", + value: `${response.data.isp || "Unknown"}`, + inline: true, + }, + { + name: ":classical_building: Organization", + value: `${response.data.org || "Unknown"}`, + inline: true, + }, + { + name: ":compass: Latitude", + value: `${response.data.lat || "Unknown"}`, + inline: true, + }, + { + name: ":compass: Longitude", + value: `${response.data.lon || "Unknown"}`, + inline: true, + }, + { + name: ":clock4: Timezone", + value: `${response.data.timezone || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: Country", + value: `${response.data.country || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: Region", + value: `${response.data.regionName || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: City", + value: `${response.data.city || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: Country Code", + value: `${response.data.countryCode || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: Region Code", + value: `${response.data.region || "Unknown"}`, + inline: true, + }, + { + name: ":globe_with_meridians: ZIP", + value: `${response.data.zip || "Unknown"}`, + inline: true, + }, + ]), + ], + }); + })); + }), +}; diff --git a/dist/commands/fun/index.js b/dist/commands/fun/index.js new file mode 100644 index 0000000..f68d227 --- /dev/null +++ b/dist/commands/fun/index.js @@ -0,0 +1,34 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Modules +const meme_1 = __importDefault(require("./modules/meme")); +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("fun") + .setDescription("Fun commands.") + .addSubcommand(meme_1.default.builder); +// Execute function +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { options } = interaction; + if (options.getSubcommand() === "meme") { + yield meme_1.default.execute(interaction); + } + else { + logger_1.default.silly(`Unknown subcommand ${options.getSubcommand()}`); + } +}); +exports.execute = execute; diff --git a/dist/commands/fun/modules/meme/index.js b/dist/commands/fun/modules/meme/index.js new file mode 100644 index 0000000..d75c2f5 --- /dev/null +++ b/dist/commands/fun/modules/meme/index.js @@ -0,0 +1,59 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios_1 = __importDefault(require("axios")); +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const cooldown_1 = __importDefault(require("../../../../middlewares/cooldown")); +exports.default = { + builder: (command) => { + return command.setName("meme").setDescription("Random memes from r/memes"); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, false); + const { guild, user, commandId } = interaction; + if (!guild) + throw new Error("Server unavailable"); + if (!user) + throw new Error("User unavailable"); + yield (0, cooldown_1.default)(guild, user, commandId, 15); + const embedConfig = yield (0, getEmbedData_1.default)(guild); + yield axios_1.default + .get("https://www.reddit.com/r/memes/random/.json") + .then((res) => __awaiter(void 0, void 0, void 0, function* () { + const response = res.data[0].data.children; + const content = response[0].data; + const buttons = new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder() + .setLabel("View post") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("πŸ”—") + .setURL(`https://reddit.com${content.permalink}`)); + const embed = new discord_js_1.EmbedBuilder() + .setTitle(`πŸ˜†οΈ±Meme`) + .setDescription(`**${content.title}**`) + .setTimestamp(new Date()) + .setImage(content.url) + .setFooter({ + text: `πŸ‘ ${content.ups}οΈ±πŸ‘Ž ${content.downs}`, + }) + .setColor(embedConfig.successColor); + yield interaction.editReply({ embeds: [embed], components: [buttons] }); + return; + })) + .catch((error) => { + throw new Error(error.message); + }); + }), +}; diff --git a/dist/commands/manage/index.js b/dist/commands/manage/index.js new file mode 100644 index 0000000..69b94d7 --- /dev/null +++ b/dist/commands/manage/index.js @@ -0,0 +1,46 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +//Dependencies +const discord_js_1 = require("discord.js"); +// Modules +const counters_1 = __importDefault(require("./modules/counters")); +const credits_1 = __importDefault(require("./modules/credits")); +// Function +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("manage") + .setDescription("Manage the bot.") + .setDMPermission(false) + // Modules + .addSubcommandGroup(counters_1.default.builder) + .addSubcommandGroup(credits_1.default.builder); +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // Destructure + const { options } = interaction; + switch (options.getSubcommandGroup()) { + case "credits": { + yield credits_1.default.execute(interaction); + break; + } + case "counters": { + yield counters_1.default.execute(interaction); + break; + } + default: { + throw new Error("Could not find an module for the command."); + } + } +}); +exports.execute = execute; diff --git a/dist/commands/manage/modules/counters/index.js b/dist/commands/manage/modules/counters/index.js new file mode 100644 index 0000000..1788509 --- /dev/null +++ b/dist/commands/manage/modules/counters/index.js @@ -0,0 +1,42 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Modules +const add_1 = __importDefault(require("./modules/add")); +const remove_1 = __importDefault(require("./modules/remove")); +exports.default = { + builder: (group) => { + return group + .setName("counters") + .setDescription("Manage guild counters.") + .addSubcommand(add_1.default.builder) + .addSubcommand(remove_1.default.builder); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { options } = interaction; + switch (options.getSubcommand()) { + case "add": { + yield add_1.default.execute(interaction); + break; + } + case "remove": { + yield remove_1.default.execute(interaction); + break; + } + default: { + throw new Error("Could not found a module for that command."); + } + } + }), +}; diff --git a/dist/commands/manage/modules/counters/modules/add/index.js b/dist/commands/manage/modules/counters/modules/add/index.js new file mode 100644 index 0000000..0d8b196 --- /dev/null +++ b/dist/commands/manage/modules/counters/modules/add/index.js @@ -0,0 +1,105 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +// Configurations +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../../../middlewares/logger")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("add") + .setDescription("Add a counter to your guild.") + .addChannelOption((option) => option + .setName("channel") + .setDescription("The channel to send the counter to.") + .setRequired(true) + .addChannelTypes(discord_js_1.ChannelType.GuildText)) + .addStringOption((option) => option + .setName("word") + .setDescription("The word to use for the counter.") + .setRequired(true)) + .addNumberOption((option) => option + .setName("start") + .setDescription("The starting value of the counter.")); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const discordChannel = options === null || options === void 0 ? void 0 : options.getChannel("channel"); + const triggerWord = options === null || options === void 0 ? void 0 : options.getString("word"); + const startValue = options === null || options === void 0 ? void 0 : options.getNumber("start"); + if (!guild) + throw new Error("We could not find a guild"); + if (!discordChannel) + throw new Error("We could not find a channel"); + if (!triggerWord) + throw new Error("We could not find a word"); + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: discordChannel.id, + }, + }, + }); + if (channelCounter) + throw new Error("A counter already exists for this channel."); + const createGuildCounter = yield database_1.default.guildCounter.upsert({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: discordChannel.id, + }, + }, + update: {}, + create: { + channelId: discordChannel.id, + triggerWord, + count: startValue || 0, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + }); + logger_1.default.silly(createGuildCounter); + if (createGuildCounter) { + const embed = new discord_js_1.EmbedBuilder() + .setTitle("[:toolbox:] Counters - Add") + .setTimestamp(new Date()) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [ + embed + .setDescription(":white_check_mark: Counter created successfully.") + .setColor(successColor), + ], + })); + } + }), +}; diff --git a/dist/commands/manage/modules/counters/modules/remove/index.js b/dist/commands/manage/modules/counters/modules/remove/index.js new file mode 100644 index 0000000..312cfa9 --- /dev/null +++ b/dist/commands/manage/modules/counters/modules/remove/index.js @@ -0,0 +1,75 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Models +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +// Configurations +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("remove") + .setDescription(`Delete a counter from your guild.`) + .addChannelOption((option) => option + .setName("channel") + .setDescription("The channel to delete the counter from.") + .setRequired(true) + .addChannelTypes(discord_js_1.ChannelType.GuildText)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild } = interaction; + const discordChannel = options === null || options === void 0 ? void 0 : options.getChannel("channel"); + if (!guild) + throw new Error("We could not find a guild"); + if (!discordChannel) + throw new Error("We could not find a channel"); + const embed = new discord_js_1.EmbedBuilder() + .setTitle("[:toolbox:] Counters - Remove") + .setTimestamp(new Date()) + .setFooter({ text: footerText, iconURL: footerIcon }); + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: discordChannel.id, + }, + }, + }); + if (!channelCounter) + throw new Error("There is no counter sin this channel, please add one first."); + const deleteGuildCounter = yield database_1.default.guildCounter.deleteMany({ + where: { + guildId: guild.id, + channelId: discordChannel.id, + }, + }); + if (!deleteGuildCounter) + throw new Error("We could not find a counter for this guild"); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [ + embed + .setDescription(":white_check_mark: Counter deleted successfully.") + .setColor(successColor), + ], + })); + }), +}; diff --git a/dist/commands/manage/modules/credits/index.js b/dist/commands/manage/modules/credits/index.js new file mode 100644 index 0000000..00cd15b --- /dev/null +++ b/dist/commands/manage/modules/credits/index.js @@ -0,0 +1,53 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Modules +const give_1 = __importDefault(require("./modules/give")); +const giveaway_1 = __importDefault(require("./modules/giveaway")); +const set_1 = __importDefault(require("./modules/set")); +const take_1 = __importDefault(require("./modules/take")); +const transfer_1 = __importDefault(require("./modules/transfer")); +exports.default = { + builder: (group) => { + return group + .setName("credits") + .setDescription("Manage the credits of a user.") + .addSubcommand(give_1.default.builder) + .addSubcommand(set_1.default.builder) + .addSubcommand(take_1.default.builder) + .addSubcommand(transfer_1.default.builder) + .addSubcommand(giveaway_1.default.builder); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "give": + yield give_1.default.execute(interaction); + break; + case "set": + yield set_1.default.execute(interaction); + break; + case "take": + yield take_1.default.execute(interaction); + break; + case "transfer": + yield transfer_1.default.execute(interaction); + break; + case "giveaway": + yield giveaway_1.default.execute(interaction); + break; + default: + throw new Error("No module found for that specific command"); + } + }), +}; diff --git a/dist/commands/manage/modules/credits/modules/give/index.js b/dist/commands/manage/modules/credits/modules/give/index.js new file mode 100644 index 0000000..f114c38 --- /dev/null +++ b/dist/commands/manage/modules/credits/modules/give/index.js @@ -0,0 +1,69 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +const discord_js_1 = require("discord.js"); +// Configurations +// Helpers../../../../../../../helpers/userData +const pluralize_1 = __importDefault(require("../../../../../../helpers/pluralize")); +// Models +// Handlers +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../../../helpers/baseEmbeds"); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +const give_1 = __importDefault(require("../../../../../../helpers/credits/give")); +exports.default = { + builder: (command) => { + return command + .setName("give") + .setDescription("Give credits to a user.") + .addUserOption((option) => option + .setName("user") + .setDescription("The user to give credits to.") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("amount") + .setDescription(`The amount of credits to give.`) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Check if the user has the MANAGE_GUILD permission. + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + // 3. Destructure interaction object. + const { guild, options } = interaction; + if (!guild) + throw new Error("We could not get the current guild from discord."); + if (!options) + throw new Error("We could not get the options from discord."); + // 4. Get the user and amount from the options. + const discordReceiver = options.getUser("user"); + const creditsAmount = options.getInteger("amount"); + if (typeof creditsAmount !== "number") + throw new Error("You need to provide a credit amount."); + if (!discordReceiver) + throw new Error("We could not get the receiving user from Discord"); + // 5. Create base embeds. + const embedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:toolbox:] Give"); + // 6. Give the credits. + yield (0, give_1.default)(guild, discordReceiver, creditsAmount); + // 7. Send embed. + return yield interaction.editReply({ + embeds: [ + embedSuccess.setDescription(`Successfully gave ${(0, pluralize_1.default)(creditsAmount, "credit")}`), + ], + }); + }), +}; diff --git a/dist/commands/manage/modules/credits/modules/giveaway/index.js b/dist/commands/manage/modules/credits/modules/giveaway/index.js new file mode 100644 index 0000000..2b831c6 --- /dev/null +++ b/dist/commands/manage/modules/credits/modules/giveaway/index.js @@ -0,0 +1,166 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +const axios_1 = __importDefault(require("axios")); +const discord_js_1 = require("discord.js"); +const uuid_1 = require("uuid"); +const encryption_1 = __importDefault(require("../../../../../../helpers/encryption")); +// Configurations +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../../../middlewares/logger")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("giveaway") + .setDescription("Giveaway some credits for specified amount of users.") + .addIntegerOption((option) => option + .setName("uses") + .setDescription("How many users should be able to use this.") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("credit") + .setDescription(`How much credits provided per use.`) + .setRequired(true)) + .addChannelOption((option) => option + .setName("channel") + .setDescription("The channel to send the message to.") + .setRequired(true) + .addChannelTypes(discord_js_1.ChannelType.GuildText)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); // Destructure + const { guild, user, options } = interaction; + const uses = options === null || options === void 0 ? void 0 : options.getInteger("uses"); + const creditAmount = options === null || options === void 0 ? void 0 : options.getInteger("credit"); + const channel = options === null || options === void 0 ? void 0 : options.getChannel("channel"); + if (!uses) + throw new Error("Amount of uses is required."); + if (!creditAmount) + throw new Error("Amount of credits is required."); + if (!channel) + throw new Error("Channel is required."); + if (!guild) + throw new Error("Guild is required."); + const embed = new discord_js_1.EmbedBuilder() + .setTitle("[:toolbox:] Giveaway") + .setFooter({ text: footerText, iconURL: footerIcon }); + const code = (0, uuid_1.v4)(); + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + if (!createGuildMember.guild.apiCpggUrlIv || + !createGuildMember.guild.apiCpggUrlContent) + throw new Error("No API url available"); + if (!createGuildMember.guild.apiCpggTokenIv || + !createGuildMember.guild.apiCpggTokenContent) + throw new Error("No API token available"); + const url = encryption_1.default.decrypt({ + iv: createGuildMember.guild.apiCpggUrlIv, + content: createGuildMember.guild.apiCpggUrlContent, + }); + const api = axios_1.default === null || axios_1.default === void 0 ? void 0 : axios_1.default.create({ + baseURL: `${url}/api/`, + headers: { + Authorization: `Bearer ${encryption_1.default.decrypt({ + iv: createGuildMember.guild.apiCpggTokenIv, + content: createGuildMember.guild.apiCpggTokenContent, + })}`, + }, + }); + const shopUrl = `${url}/store`; + yield api + .post("vouchers", { + uses, + code, + credits: creditAmount, + memo: `[GIVEAWAY] ${interaction === null || interaction === void 0 ? void 0 : interaction.createdTimestamp} - ${(_a = interaction === null || interaction === void 0 ? void 0 : interaction.user) === null || _a === void 0 ? void 0 : _a.id}`, + }) + .then(() => __awaiter(void 0, void 0, void 0, function* () { + yield interaction.editReply({ + embeds: [ + embed + .setColor(successColor) + .setDescription(`Successfully created code: ${code}`), + ], + }); + const buttons = new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder() + .setLabel("Redeem it here") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("🏦") + .setURL(`${shopUrl}?voucher=${code}`)); + const discordChannel = guild === null || guild === void 0 ? void 0 : guild.channels.cache.get(channel.id); + if (!discordChannel) + return; + if (discordChannel.type !== discord_js_1.ChannelType.GuildText) + return; + discordChannel.send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setTitle("[:parachute:] Credits!") + .addFields([ + { + name: "πŸ’Ά Credits", + value: `${creditAmount}`, + inline: true, + }, + ]) + .setDescription(`${interaction.user} dropped a voucher for a maximum **${uses}** members!`) + .setColor(successColor), + ], + components: [buttons], + }); + })); + }), +}; diff --git a/dist/commands/manage/modules/credits/modules/set/index.js b/dist/commands/manage/modules/credits/modules/set/index.js new file mode 100644 index 0000000..d07adc2 --- /dev/null +++ b/dist/commands/manage/modules/credits/modules/set/index.js @@ -0,0 +1,66 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Helpers +// Models +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../../../helpers/baseEmbeds"); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +const set_1 = __importDefault(require("../../../../../../helpers/credits/set")); +exports.default = { + builder: (command) => { + return command + .setName("set") + .setDescription("Set the amount of credits a user has.") + .addUserOption((option) => option + .setName("user") + .setDescription("The user to set the amount of credits for.") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("amount") + .setDescription(`The amount of credits to set.`) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Check if the user has the permission to manage the guild. + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + // 3. Destructure interaction object. + const { options, guild } = interaction; + if (!guild) + throw new Error(`We could not find this guild.`); + if (!options) + throw new Error(`We could not find the options.`); + // 4. Get the user and amount from the options. + const discordUser = options.getUser("user"); + const creditAmount = options.getInteger("amount"); + if (typeof creditAmount !== "number") + throw new Error("Amount is not set."); + if (!discordUser) + throw new Error("User is not specified"); + // 5. Set the credits. + yield (0, set_1.default)(guild, discordUser, creditAmount); + // 6. Create base embeds. + const embedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:toolbox:] Set"); + // 7. Send embed. + return yield interaction.editReply({ + embeds: [ + embedSuccess.setDescription(`Set **${discordUser}**'s credits to **${creditAmount}**.`), + ], + }); + }), +}; diff --git a/dist/commands/manage/modules/credits/modules/take/index.js b/dist/commands/manage/modules/credits/modules/take/index.js new file mode 100644 index 0000000..73a6356 --- /dev/null +++ b/dist/commands/manage/modules/credits/modules/take/index.js @@ -0,0 +1,66 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Models +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const baseEmbeds_1 = require("../../../../../../helpers/baseEmbeds"); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +const take_1 = __importDefault(require("../../../../../../helpers/credits/take")); +const pluralize_1 = __importDefault(require("../../../../../../helpers/pluralize")); +exports.default = { + builder: (command) => { + return command + .setName("take") + .setDescription("Take credits from a user.") + .addUserOption((option) => option + .setName("user") + .setDescription("The user to take credits from.") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("amount") + .setDescription(`The amount of credits to take.`) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Defer reply as ephemeral. + yield (0, deferReply_1.default)(interaction, true); + // 2. Check if the user has the MANAGE_GUILD permission. + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + // 3. Destructure interaction object. + const { guild, options } = interaction; + if (!guild) + throw new Error("Invalid guild."); + if (!options) + throw new Error("Invalid options."); + // 4. Get the user and amount from the options. + const discordReceiver = options.getUser("user"); + const optionAmount = options.getInteger("amount"); + if (typeof optionAmount !== "number") + throw new Error("Invalid amount."); + if (!discordReceiver) + throw new Error("Invalid user."); + // 5. Create base embeds. + const embedSuccess = yield (0, baseEmbeds_1.success)(guild, "[:toolbox:] Take"); + // 6. Take the credits. + yield (0, take_1.default)(guild, discordReceiver, optionAmount); + // 7. Send embed. + return yield interaction.editReply({ + embeds: [ + embedSuccess.setDescription(`Took ${(0, pluralize_1.default)(optionAmount, "credit")} from ${discordReceiver}.`), + ], + }); + }), +}; diff --git a/dist/commands/manage/modules/credits/modules/transfer/index.js b/dist/commands/manage/modules/credits/modules/transfer/index.js new file mode 100644 index 0000000..fc27bfb --- /dev/null +++ b/dist/commands/manage/modules/credits/modules/transfer/index.js @@ -0,0 +1,73 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Models +const discord_js_1 = require("discord.js"); +const transfer_1 = __importDefault(require("../../../../../../helpers/credits/transfer")); +// Configurations +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../../../helpers/checkPermission")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("transfer") + .setDescription("Transfer credits from one user to another.") + .addUserOption((option) => option + .setName("from") + .setDescription("The user to transfer credits from.") + .setRequired(true)) + .addUserOption((option) => option + .setName("to") + .setDescription("The user to transfer credits to.") + .setRequired(true)) + .addIntegerOption((option) => option + .setName("amount") + .setDescription(`The amount of credits to transfer.`) + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageGuild); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); // Destructure member + const { guild, options } = interaction; + // Get options + const optionFromUser = options === null || options === void 0 ? void 0 : options.getUser("from"); + const optionToUser = options === null || options === void 0 ? void 0 : options.getUser("to"); + const optionAmount = options === null || options === void 0 ? void 0 : options.getInteger("amount"); + if (optionAmount === null) + throw new Error("Amount is not specified"); + if (optionAmount <= 0) + throw new Error("You need to set amount above zero to transfer."); + if (!guild) + throw new Error(`We could not find this guild.`); + if (!optionFromUser) + throw new Error("You must provide a user to transfer from."); + if (!optionToUser) + throw new Error("You must provide a user to transfer to."); + yield (0, transfer_1.default)(guild, optionFromUser, optionToUser, optionAmount); + return interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setTitle("[:toolbox:] Manage - Credits (Transfer)") + .setDescription(`Transferred ${optionAmount} credits.`) + .setTimestamp(new Date()) + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }), + ], + }); + }), +}; diff --git a/dist/commands/moderation/index.js b/dist/commands/moderation/index.js new file mode 100644 index 0000000..ed29270 --- /dev/null +++ b/dist/commands/moderation/index.js @@ -0,0 +1,36 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const prune_1 = __importDefault(require("./modules/prune")); +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("moderation") + .setDescription("Moderation.") + .setDMPermission(false) + .addSubcommand(prune_1.default.builder); +// Execute the command +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "prune": { + yield prune_1.default.execute(interaction); + break; + } + default: { + throw new Error(`Unknown subcommand: ${interaction.options.getSubcommand()}`); + } + } +}); +exports.execute = execute; diff --git a/dist/commands/moderation/modules/prune/index.js b/dist/commands/moderation/modules/prune/index.js new file mode 100644 index 0000000..bab2b18 --- /dev/null +++ b/dist/commands/moderation/modules/prune/index.js @@ -0,0 +1,78 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const checkPermission_1 = __importDefault(require("../../../../helpers/checkPermission")); +// Configurations +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("prune") + .setDescription("Prune messages!") + .addIntegerOption((option) => option + .setName("count") + .setDescription("How many messages you want to prune.") + .setRequired(true)) + .addBooleanOption((option) => option.setName("bots").setDescription("Include bots.")); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + yield (0, deferReply_1.default)(interaction, false); + (0, checkPermission_1.default)(interaction, discord_js_1.PermissionsBitField.Flags.ManageMessages); + const { errorColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const count = interaction.options.getInteger("count"); + if (count === null) + return; + const bots = interaction.options.getBoolean("bots"); + if (count < 1 || count > 100) { + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:police_car:] Prune") + .setDescription(`You can only prune between 1 and 100 messages.`) + .setTimestamp() + .setColor(errorColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield interaction.editReply({ + embeds: [interactionEmbed], + }); + return; + } + if (((_a = interaction === null || interaction === void 0 ? void 0 : interaction.channel) === null || _a === void 0 ? void 0 : _a.type) !== discord_js_1.ChannelType.GuildText) + return; + yield interaction.channel.messages.fetch().then((messages) => __awaiter(void 0, void 0, void 0, function* () { + var _b; + const messagesToDelete = (bots + ? messages.filter((m) => { var _a; return ((_a = m === null || m === void 0 ? void 0 : m.interaction) === null || _a === void 0 ? void 0 : _a.id) !== interaction.id; }) + : messages.filter((m) => { var _a, _b; return ((_a = m === null || m === void 0 ? void 0 : m.interaction) === null || _a === void 0 ? void 0 : _a.id) !== interaction.id && ((_b = m === null || m === void 0 ? void 0 : m.author) === null || _b === void 0 ? void 0 : _b.bot) !== true; })).first(count); + if (((_b = interaction === null || interaction === void 0 ? void 0 : interaction.channel) === null || _b === void 0 ? void 0 : _b.type) !== discord_js_1.ChannelType.GuildText) + return; + yield interaction.channel + .bulkDelete(messagesToDelete, true) + .then(() => __awaiter(void 0, void 0, void 0, function* () { + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:police_car:] Prune") + .setDescription(`Successfully pruned \`${count}\` messages.`) + .setTimestamp() + .setColor(errorColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield interaction.editReply({ + embeds: [interactionEmbed], + }); + })); + })); + }), +}; diff --git a/dist/commands/reputation/index.js b/dist/commands/reputation/index.js new file mode 100644 index 0000000..25c0feb --- /dev/null +++ b/dist/commands/reputation/index.js @@ -0,0 +1,40 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +// Dependencies +const discord_js_1 = require("discord.js"); +// Modules +const check_1 = __importDefault(require("./modules/check")); +const repute_1 = __importDefault(require("./modules/repute")); +// Function +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("reputation") + .setDescription("See and repute users to show other how trustworthy they are") + .setDMPermission(false) + // Modules + .addSubcommand(repute_1.default.builder) + .addSubcommand(check_1.default.builder); +// Execute function +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + if (interaction.options.getSubcommand() === "repute") { + yield repute_1.default.execute(interaction); + return; + } + if (interaction.options.getSubcommand() === "check") { + yield check_1.default.execute(interaction); + return; + } +}); +exports.execute = execute; diff --git a/dist/commands/reputation/modules/check/index.js b/dist/commands/reputation/modules/check/index.js new file mode 100644 index 0000000..dfcf6db --- /dev/null +++ b/dist/commands/reputation/modules/check/index.js @@ -0,0 +1,96 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("check") + .setDescription("Check reputation") + .addUserOption((option) => option + .setName("account") + .setDescription("The account you checking") + .setRequired(false)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + const { options, guild, user } = interaction; + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + const optionAccount = options === null || options === void 0 ? void 0 : options.getUser("account"); + if (!guild) + throw new Error("Server unavailable"); + if (!user) + throw new Error("User unavailable"); + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: (optionAccount || user).id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: (optionAccount || user).id, + }, + where: { + id: (optionAccount || user).id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + const reputationType = (reputation) => { + if (reputation < 0) + return `negative reputation of ${reputation}`; + if (reputation > 0) + return `positive reputation of ${reputation}`; + return "neutral reputation"; + }; + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle(optionAccount + ? `:loudspeaker:οΈ±Showing ${optionAccount.username}'s reputation` + : ":loudspeaker:οΈ±Showing your reputation") + .setDescription(optionAccount + ? `${optionAccount} have a ${reputationType(createGuildMember.user.reputationsEarned)}` + : `You have a ${reputationType(createGuildMember.user.reputationsEarned)}`) + .setTimestamp() + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield interaction.editReply({ + embeds: [interactionEmbed], + }); + }), +}; diff --git a/dist/commands/reputation/modules/repute/components/noSelfReputation.js b/dist/commands/reputation/modules/repute/components/noSelfReputation.js new file mode 100644 index 0000000..0e6b3ff --- /dev/null +++ b/dist/commands/reputation/modules/repute/components/noSelfReputation.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (to, from) => { + if ((from === null || from === void 0 ? void 0 : from.id) === (to === null || to === void 0 ? void 0 : to.id)) { + throw new Error("You can only repute other users"); + } +}; diff --git a/dist/commands/reputation/modules/repute/index.js b/dist/commands/reputation/modules/repute/index.js new file mode 100644 index 0000000..b6d110b --- /dev/null +++ b/dist/commands/reputation/modules/repute/index.js @@ -0,0 +1,105 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +const noSelfReputation_1 = __importDefault(require("./components/noSelfReputation")); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const cooldown_1 = __importDefault(require("../../../../middlewares/cooldown")); +exports.default = { + builder: (command) => { + return command + .setName("repute") + .setDescription("Repute an account") + .addUserOption((option) => option + .setName("account") + .setDescription("The account you repute") + .setRequired(true)) + .addStringOption((option) => option + .setName("type") + .setDescription("Type of reputation") + .setRequired(true) + .addChoices({ name: "Positive", value: "positive" }, { + name: "Negative", + value: "negative", + })); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + const { options, user, guild, commandId } = interaction; + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + const optionAccount = options === null || options === void 0 ? void 0 : options.getUser("account"); + const optionType = options === null || options === void 0 ? void 0 : options.getString("type"); + if (!guild) + throw new Error("Server unavailable"); + if (!optionAccount) + throw new Error("User unavailable"); + // Pre-checks + (0, noSelfReputation_1.default)(optionAccount, user); + // Check if user is on cooldown otherwise create one + yield (0, cooldown_1.default)(guild, user, commandId, parseInt(process.env.REPUTATION_TIMEOUT)); + switch (optionType) { + case "positive": { + const createUser = yield database_1.default.user.upsert({ + where: { + id: optionAccount.id, + }, + update: { + reputationsEarned: { + increment: 1, + }, + }, + create: { + id: optionAccount.id, + reputationsEarned: 1, + }, + }); + logger_1.default.silly(createUser); + break; + } + case "negative": { + const createUser = yield database_1.default.user.upsert({ + where: { + id: optionAccount.id, + }, + update: { + reputationsEarned: { + decrement: 1, + }, + }, + create: { + id: optionAccount.id, + reputationsEarned: -1, + }, + }); + logger_1.default.silly(createUser); + break; + } + default: { + throw new Error("Invalid reputation type"); + } + } + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle(`:loudspeaker:οΈ±Reputing ${optionAccount.username}`) + .setDescription(`You have given a ${optionType} repute to ${optionAccount}!`) + .setTimestamp() + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield interaction.editReply({ + embeds: [interactionEmbed], + }); + }), +}; diff --git a/dist/commands/shop/index.js b/dist/commands/shop/index.js new file mode 100644 index 0000000..f21687f --- /dev/null +++ b/dist/commands/shop/index.js @@ -0,0 +1,51 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +// Dependencies +const discord_js_1 = require("discord.js"); +// Modules +const cpgg_1 = __importDefault(require("./modules/cpgg")); +const roles_1 = __importDefault(require("./modules/roles")); +// Function +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("shop") + .setDescription("Shop for credits and custom roles.") + .setDMPermission(false) + // Modules + .addSubcommand(cpgg_1.default.builder) + .addSubcommandGroup(roles_1.default.builder); +// Execute the command +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { options } = interaction; + switch (options.getSubcommand()) { + case "cpgg": { + yield cpgg_1.default.execute(interaction); + break; + } + default: { + throw new Error("Could not find module for that command."); + } + } + switch (options.getSubcommandGroup()) { + case "roles": { + yield roles_1.default.execute(interaction); + break; + } + default: { + throw new Error("Could not find module for that command."); + } + } +}); +exports.execute = execute; diff --git a/dist/commands/shop/modules/cpgg/index.js b/dist/commands/shop/modules/cpgg/index.js new file mode 100644 index 0000000..48a4643 --- /dev/null +++ b/dist/commands/shop/modules/cpgg/index.js @@ -0,0 +1,175 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios_1 = __importDefault(require("axios")); +const discord_js_1 = require("discord.js"); +const uuid_1 = require("uuid"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const encryption_1 = __importDefault(require("../../../../helpers/encryption")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + builder: (command) => { + return command + .setName("cpgg") + .setDescription("Buy cpgg power.") + .addIntegerOption((option) => option + .setName("amount") + .setDescription("How much credits you want to withdraw.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + var _a, _b, _c, _d; + yield (0, deferReply_1.default)(interaction, true); + const { errorColor, successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild, user, client } = interaction; + const optionAmount = options === null || options === void 0 ? void 0 : options.getInteger("amount"); + if (optionAmount === null) { + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Amount is null.`); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:dollar:] Gift") + .setDescription("We could not read your requested amount.") + .setTimestamp() + .setColor(errorColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + return interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + }); + } + if (!guild) + throw new Error("Guild not found"); + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + const dmUser = (_b = (_a = client === null || client === void 0 ? void 0 : client.users) === null || _a === void 0 ? void 0 : _a.cache) === null || _b === void 0 ? void 0 : _b.get(user === null || user === void 0 ? void 0 : user.id); + if ((optionAmount || createGuildMember.creditsEarned) < 100) + throw new Error("You can't withdraw to CPGG below 100 credits."); + if ((optionAmount || createGuildMember.creditsEarned) > 1000000) + throw new Error("Amount or user credits is above 1.000.000."); + if (createGuildMember.creditsEarned < optionAmount) + throw new Error("You can't withdraw more than you have on your account."); + if (!createGuildMember.guild.apiCpggUrlIv || + !createGuildMember.guild.apiCpggUrlContent) + throw new Error("No API url available"); + if (!createGuildMember.guild.apiCpggTokenIv || + !createGuildMember.guild.apiCpggTokenContent) + throw new Error("No API token available"); + const code = (0, uuid_1.v4)(); + const url = encryption_1.default.decrypt({ + iv: createGuildMember.guild.apiCpggUrlIv, + content: createGuildMember.guild.apiCpggUrlContent, + }); + const api = axios_1.default === null || axios_1.default === void 0 ? void 0 : axios_1.default.create({ + baseURL: `${url}/api/`, + headers: { + Authorization: `Bearer ${encryption_1.default.decrypt({ + iv: createGuildMember.guild.apiCpggTokenIv, + content: createGuildMember.guild.apiCpggTokenContent, + })}`, + }, + }); + const shopUrl = `${url}/store`; + const buttons = new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder() + .setLabel("Redeem it here") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("🏦") + .setURL(`${shopUrl}?voucher=${code}`)); + yield ((_d = api === null || api === void 0 ? void 0 : api.post("vouchers", { + uses: 1, + code, + credits: optionAmount || createGuildMember.creditsEarned, + memo: `${interaction === null || interaction === void 0 ? void 0 : interaction.createdTimestamp} - ${(_c = interaction === null || interaction === void 0 ? void 0 : interaction.user) === null || _c === void 0 ? void 0 : _c.id}`, + })) === null || _d === void 0 ? void 0 : _d.then(() => __awaiter(void 0, void 0, void 0, function* () { + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Successfully created voucher.`); + createGuildMember.creditsEarned -= + optionAmount || createGuildMember.creditsEarned; + const updateGuildMember = yield database_1.default.guildMember.update({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + data: { + creditsEarned: { + decrement: optionAmount || createGuildMember.creditsEarned, + }, + }, + }); + logger_1.default.silly(updateGuildMember); + if (!interaction.guild) + throw new Error("Guild is undefined"); + const dmEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:shopping_cart:] CPGG") + .setDescription(`This voucher comes from **${interaction.guild.name}**.`) + .setTimestamp() + .addFields({ + name: "πŸ’Ά Credits", + value: `${optionAmount || createGuildMember.creditsEarned}`, + inline: true, + }) + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield (dmUser === null || dmUser === void 0 ? void 0 : dmUser.send({ + embeds: [dmEmbed], + components: [buttons], + }).then((msg) => __awaiter(void 0, void 0, void 0, function* () { + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:shopping_cart:] CPGG") + .setDescription(`I have sent you the code in [DM](${msg.url})!`) + .setTimestamp() + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + yield (interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + })); + }))); + }))); + return true; + }), +}; diff --git a/dist/commands/shop/modules/roles/index.js b/dist/commands/shop/modules/roles/index.js new file mode 100644 index 0000000..542a2f3 --- /dev/null +++ b/dist/commands/shop/modules/roles/index.js @@ -0,0 +1,47 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Handlers +// Modules +const buy_1 = __importDefault(require("./modules/buy")); +const cancel_1 = __importDefault(require("./modules/cancel")); +const database_1 = __importDefault(require("../../../../handlers/database")); +exports.default = { + builder: (group) => { + return (group + .setName("roles") + .setDescription("Shop for custom roles.") + // Modules + .addSubcommand(buy_1.default.builder) + .addSubcommand(cancel_1.default.builder)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + if (!interaction.guild) + return; + const { options, guild } = interaction; + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + if (!getGuild.shopRolesEnabled) + throw new Error("This server has disabled shop roles."); + if ((options === null || options === void 0 ? void 0 : options.getSubcommand()) === "buy") { + yield buy_1.default.execute(interaction); + } + if ((options === null || options === void 0 ? void 0 : options.getSubcommand()) === "cancel") { + yield cancel_1.default.execute(interaction); + } + }), +}; diff --git a/dist/commands/shop/modules/roles/modules/buy/index.js b/dist/commands/shop/modules/roles/modules/buy/index.js new file mode 100644 index 0000000..8897822 --- /dev/null +++ b/dist/commands/shop/modules/roles/modules/buy/index.js @@ -0,0 +1,162 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Helpers +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../../../../../middlewares/logger")); +// Configurations +// import fetchUser from "../../../../../../helpers/userData"; +// Models +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const pluralize_1 = __importDefault(require("../../../../../../helpers/pluralize")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("buy") + .setDescription("Buy a custom role.") + .addStringOption((option) => option + .setName("name") + .setDescription("Name of the role you wish to buy.") + .setRequired(true)) + .addStringOption((option) => option + .setName("color") + .setDescription("Color of the role you wish to buy.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, true); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild, user, member } = interaction; + const optionName = options === null || options === void 0 ? void 0 : options.getString("name"); + const optionColor = options === null || options === void 0 ? void 0 : options.getString("color"); + // If amount is null + if (optionName === null) + throw new Error("We could not read your requested name"); + yield (guild === null || guild === void 0 ? void 0 : guild.roles.create({ + name: optionName, + color: optionColor, + reason: `${user === null || user === void 0 ? void 0 : user.id} bought from shop`, + }).then((role) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + const userId = "SNOWFLKAE"; + const guildId = "SNOWFLAKE"; + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId, + guildId, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: userId, + }, + where: { + id: userId, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guildId, + }, + where: { + id: guildId, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + // Get guild object + const pricePerHour = createGuildMember.guild.shopRolesPricePerHour; + const updateGuildMember = yield database_1.default.guildMember.update({ + where: { + userId_guildId: { + userId, + guildId, + }, + }, + data: { + creditsEarned: { decrement: pricePerHour }, + }, + }); + logger_1.default.silly(updateGuildMember); + const createShopRole = yield database_1.default.guildShopRoles.upsert({ + where: { + guildId_userId_roleId: { + guildId: guild.id, + userId: user.id, + roleId: role.id, + }, + }, + update: {}, + create: { + roleId: role.id, + lastPayed: new Date(), + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createShopRole); + yield ((_a = member === null || member === void 0 ? void 0 : member.roles) === null || _a === void 0 ? void 0 : _a.add(role === null || role === void 0 ? void 0 : role.id)); + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Role ${role === null || role === void 0 ? void 0 : role.name} was bought by ${user === null || user === void 0 ? void 0 : user.tag}`); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:shopping_cart:] Buy") + .setDescription(`You bought **${optionName}** for **${(0, pluralize_1.default)(pricePerHour, "credit")}**.`) + .setTimestamp() + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); + return interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + }); + })).catch(() => { + throw new Error("Failed creating role."); + })); + }), +}; diff --git a/dist/commands/shop/modules/roles/modules/cancel/index.js b/dist/commands/shop/modules/roles/modules/cancel/index.js new file mode 100644 index 0000000..4bfb92f --- /dev/null +++ b/dist/commands/shop/modules/roles/modules/cancel/index.js @@ -0,0 +1,126 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +// Helpers +const discord_js_1 = require("discord.js"); +// Configurations +// Models +const deferReply_1 = __importDefault(require("../../../../../../handlers/deferReply")); +const logger_1 = __importDefault(require("../../../../../../middlewares/logger")); +// Configurations +// Models +const database_1 = __importDefault(require("../../../../../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../../../../../helpers/getEmbedData")); +const pluralize_1 = __importDefault(require("../../../../../../helpers/pluralize")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("cancel") + .setDescription("Cancel a purchase.") + .addRoleOption((option) => option + .setName("role") + .setDescription("Role you wish to cancel.") + .setRequired(true)); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + yield (0, deferReply_1.default)(interaction, true); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const { options, guild, user, member } = interaction; + const optionRole = options.getRole("role"); + if (optionRole === null) + throw new Error("We could not read your requested role."); + if (!guild) + throw new Error("No guild specified"); + if (!user) + throw new Error("No user specified"); + const roleExist = yield database_1.default.guildShopRoles.findUnique({ + where: { + guildId_userId_roleId: { + guildId: guild.id, + userId: user.id, + roleId: optionRole.id, + }, + }, + }); + if (roleExist === null) + return; + yield ((_a = member === null || member === void 0 ? void 0 : member.roles) === null || _a === void 0 ? void 0 : _a.remove(optionRole === null || optionRole === void 0 ? void 0 : optionRole.id)); + yield (guild === null || guild === void 0 ? void 0 : guild.roles.delete(optionRole === null || optionRole === void 0 ? void 0 : optionRole.id, `${user === null || user === void 0 ? void 0 : user.id} canceled from shop`).then(() => __awaiter(void 0, void 0, void 0, function* () { + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + if (!createGuildMember) + throw new Error("Guild member not created"); + const deleteShopRole = yield database_1.default.guildShopRoles.delete({ + where: { + guildId_userId_roleId: { + guildId: guild === null || guild === void 0 ? void 0 : guild.id, + userId: user === null || user === void 0 ? void 0 : user.id, + roleId: optionRole === null || optionRole === void 0 ? void 0 : optionRole.id, + }, + }, + }); + logger_1.default.silly(deleteShopRole); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setTitle("[:shopping_cart:] Cancel") + .setDescription(`You have canceled ${optionRole.name}.`) + .setTimestamp() + .setColor(successColor) + .addFields({ + name: "Your balance", + value: `${(0, pluralize_1.default)(createGuildMember.creditsEarned, "credit")}`, + }) + .setFooter({ text: footerText, iconURL: footerIcon }); + return interaction === null || interaction === void 0 ? void 0 : interaction.editReply({ + embeds: [interactionEmbed], + }); + }))); + }), +}; diff --git a/dist/commands/utils/index.js b/dist/commands/utils/index.js new file mode 100644 index 0000000..aa1bf87 --- /dev/null +++ b/dist/commands/utils/index.js @@ -0,0 +1,39 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.builder = void 0; +const discord_js_1 = require("discord.js"); +// Modules +const about_1 = __importDefault(require("./modules/about")); +const avatar_1 = __importDefault(require("./modules/avatar")); +exports.builder = new discord_js_1.SlashCommandBuilder() + .setName("utils") + .setDescription("Common utility.") + // Modules + .addSubcommand(about_1.default.builder) + .addSubcommand(avatar_1.default.builder); +// Execute the command +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + switch (interaction.options.getSubcommand()) { + case "about": + yield about_1.default.execute(interaction); + break; + case "avatar": + yield avatar_1.default.execute(interaction); + break; + default: + throw new Error(`Unknown subcommand: ${interaction.options.getSubcommand()}`); + } +}); +exports.execute = execute; diff --git a/dist/commands/utils/modules/about/index.js b/dist/commands/utils/modules/about/index.js new file mode 100644 index 0000000..173d179 --- /dev/null +++ b/dist/commands/utils/modules/about/index.js @@ -0,0 +1,101 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +/* eslint-disable no-loops/no-loops */ +// Dependencies +const date_fns_1 = require("date-fns"); +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +// Configurations +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +// Function +exports.default = { + builder: (command) => { + return command + .setName("about") + .setDescription("Check information about this instance"); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, false); + if (!interaction.guild) + throw new Error("You need to be in a guild"); + const { client } = interaction; + // await cooldown( + // interaction.guild, + // interaction.user, + // interaction.commandId, + // 3600 + // ); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + // // Initialize a storage for the user ids + // const userIds = new Set(); + // // Iterate over all guilds (always cached) + // for await (const guild of client.guilds.cache.values()) { + // // Fetch all guild members and iterate over them + // for await (const member of (await guild.members.fetch()).values()) { + // // Fetch the user, if user already cached, returns value from cache + // // Will probably always return from cache + // const user = await client.users.fetch(member.id); + // // Check if user id is not already in set and user is not a bot + // if (!userIds.has(user.id) && !user.bot) { + // // Add unique user id to our set + // userIds.add(user.id); + // } + // } + // } + const buttons = new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder() + .setLabel("Support") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("πŸ’¬") + .setURL("https://discord.zyner.org"), new discord_js_1.ButtonBuilder() + .setLabel("Documentation") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("πŸ“š") + .setURL("https://xyter.zyner.org")); + const interactionEmbed = new discord_js_1.EmbedBuilder() + .setColor(successColor) + .setTitle(":toolbox:οΈ±About this instance") + .setDescription(`This bot instance is hosted by [${process.env.BOT_HOSTER_NAME}](${process.env.BOT_HOSTER_URL}) who might have modified the [source code](https://github.com/ZynerOrg/xyter).`) + .setFields({ + name: "Latency", + value: `${Math.round(client.ws.ping)} ms`, + inline: true, + }, { + name: "Servers (cached)", + value: `${client.guilds.cache.size}`, + inline: true, + }, { + name: "Users (cached)", + value: `${client.guilds.cache.reduce((a, g) => a + g.memberCount, 0)}`, + inline: true, + }, { + name: "Version", + value: `[${process.env.npm_package_version}](https://github.com/ZynerOrg/xyter/releases/tag/${process.env.npm_package_version})`, + inline: true, + }, { + name: "Since last restart", + value: `${(0, date_fns_1.formatDuration)((0, date_fns_1.intervalToDuration)({ + start: (0, date_fns_1.subMilliseconds)(new Date(), client.uptime), + end: new Date(), + }))}`, + inline: true, + }) + .setTimestamp() + .setFooter({ text: footerText, iconURL: footerIcon }); + yield interaction.editReply({ + embeds: [interactionEmbed], + components: [buttons], + }); + }), +}; diff --git a/dist/commands/utils/modules/avatar/index.js b/dist/commands/utils/modules/avatar/index.js new file mode 100644 index 0000000..6e3160e --- /dev/null +++ b/dist/commands/utils/modules/avatar/index.js @@ -0,0 +1,48 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const deferReply_1 = __importDefault(require("../../../../handlers/deferReply")); +const getEmbedData_1 = __importDefault(require("../../../../helpers/getEmbedData")); +exports.default = { + builder: (command) => { + return command + .setName("avatar") + .setDescription("Check someones avatar!)") + .addUserOption((option) => option + .setName("user") + .setDescription("The user whose avatar you want to check")); + }, + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, deferReply_1.default)(interaction, false); + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + const userOption = interaction.options.getUser("user"); + const targetUser = userOption || interaction.user; + const embed = new discord_js_1.EmbedBuilder() + .setTitle(":toolbox:οΈ±Avatar") + .setTimestamp(new Date()) + .setFooter({ text: footerText, iconURL: footerIcon }); + const avatarUrl = targetUser.displayAvatarURL(); + return interaction.editReply({ + embeds: [ + embed + .setDescription(userOption + ? `You can also [download it here](${avatarUrl})!` + : `Your avatar is available to [download here](${avatarUrl}).`) + .setThumbnail(avatarUrl) + .setColor(successColor), + ], + }); + }), +}; diff --git a/dist/events/guildCreate/index.js b/dist/events/guildCreate/index.js new file mode 100644 index 0000000..bcf133a --- /dev/null +++ b/dist/events/guildCreate/index.js @@ -0,0 +1,60 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const database_1 = __importDefault(require("../../handlers/database")); +const updatePresence_1 = __importDefault(require("../../handlers/updatePresence")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (guild) => __awaiter(void 0, void 0, void 0, function* () { + const { client } = guild; + (0, updatePresence_1.default)(client); + // Create guildMember object + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: guild.ownerId, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: guild.ownerId, + }, + where: { + id: guild.ownerId, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + }); + logger_1.default.silly(createGuildMember); +}); +exports.execute = execute; diff --git a/dist/events/guildDelete/index.js b/dist/events/guildDelete/index.js new file mode 100644 index 0000000..7b9b88d --- /dev/null +++ b/dist/events/guildDelete/index.js @@ -0,0 +1,43 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const database_1 = __importDefault(require("../../handlers/database")); +const updatePresence_1 = __importDefault(require("../../handlers/updatePresence")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (guild) => __awaiter(void 0, void 0, void 0, function* () { + const { client } = guild; + (0, updatePresence_1.default)(client); + // Delete guildMember objects + const deleteGuildMembers = database_1.default.guildMember.deleteMany({ + where: { + guildId: guild.id, + }, + }); + // Delete guild object + const deleteGuild = database_1.default.guild.deleteMany({ + where: { + id: guild.id, + }, + }); + // The transaction runs synchronously so deleteUsers must run last. + yield database_1.default.$transaction([deleteGuildMembers, deleteGuild]); + logger_1.default.silly(deleteGuildMembers); + logger_1.default.silly(deleteGuild); +}); +exports.execute = execute; diff --git a/dist/events/guildMemberAdd/audits.js b/dist/events/guildMemberAdd/audits.js new file mode 100644 index 0000000..7595180 --- /dev/null +++ b/dist/events/guildMemberAdd/audits.js @@ -0,0 +1,71 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = { + execute: (member) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + const { client, guild } = member; + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: member.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + if (getGuild.auditsEnabled !== true) + return; + if (!getGuild.auditsChannelId) { + throw new Error("Channel not found"); + } + const embedConfig = yield (0, getEmbedData_1.default)(guild); + const channel = client.channels.cache.get(getGuild.auditsChannelId); + if (!channel) + throw new Error("Channel not found"); + if (channel.type !== discord_js_1.ChannelType.GuildText) { + throw new Error("Channel must be a text channel"); + } + const embed = new discord_js_1.EmbedBuilder() + .setTimestamp(new Date()) + .setAuthor({ + name: "Member Joined", + iconURL: (_a = client.user) === null || _a === void 0 ? void 0 : _a.displayAvatarURL(), + }) + .setFooter({ + text: embedConfig.footerText, + iconURL: embedConfig.footerIcon, + }); + yield channel + .send({ + embeds: [ + embed + .setColor(embedConfig.successColor) + .setDescription(`${member.user} - (${member.user.tag})`) + .addFields([ + { + name: "Account Age", + value: `${member.user.createdAt}`, + }, + ]), + ], + }) + .then(() => { + logger_1.default.debug(`Audit log sent for event guildMemberAdd`); + }) + .catch(() => { + throw new Error("Audit log failed to send"); + }); + }), +}; diff --git a/dist/events/guildMemberAdd/index.js b/dist/events/guildMemberAdd/index.js new file mode 100644 index 0000000..e02a103 --- /dev/null +++ b/dist/events/guildMemberAdd/index.js @@ -0,0 +1,65 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const database_1 = __importDefault(require("../../handlers/database")); +const updatePresence_1 = __importDefault(require("../../handlers/updatePresence")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +const audits_1 = __importDefault(require("./audits")); +const joinMessage_1 = __importDefault(require("./joinMessage")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (member) => __awaiter(void 0, void 0, void 0, function* () { + const { client, user, guild } = member; + logger_1.default.silly(`New member: ${user.tag} (${user.id}) added to guild: ${guild.name} (${guild.id})`); + yield audits_1.default.execute(member); + yield joinMessage_1.default.execute(member); + (0, updatePresence_1.default)(client); + // Create guildMember object + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + }); + logger_1.default.silly(createGuildMember); +}); +exports.execute = execute; diff --git a/dist/events/guildMemberAdd/joinMessage.js b/dist/events/guildMemberAdd/joinMessage.js new file mode 100644 index 0000000..31b0751 --- /dev/null +++ b/dist/events/guildMemberAdd/joinMessage.js @@ -0,0 +1,52 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +exports.default = { + execute: (member) => __awaiter(void 0, void 0, void 0, function* () { + const { footerText, footerIcon, successColor } = yield (0, getEmbedData_1.default)(member.guild); + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: member.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + const { client } = member; + if (getGuild.welcomeEnabled !== true) + return; + if (!getGuild.welcomeJoinChannelId) + return; + const channel = client.channels.cache.get(`${getGuild.welcomeJoinChannelId}`); + if (!channel) + throw new Error("Channel not found"); + if (channel.type !== discord_js_1.ChannelType.GuildText) + throw new Error("Channel is not a text channel"); + channel.send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setColor(successColor) + .setTitle(`${member.user.username} has joined the server!`) + .setThumbnail(member.user.displayAvatarURL()) + .setDescription(getGuild.welcomeJoinChannelMessage || + "Configure a join message in the `/settings guild welcome`.") + .setTimestamp() + .setFooter({ + text: footerText, + iconURL: footerIcon, + }), + ], + }); + }), +}; diff --git a/dist/events/guildMemberRemove/audits.js b/dist/events/guildMemberRemove/audits.js new file mode 100644 index 0000000..23683df --- /dev/null +++ b/dist/events/guildMemberRemove/audits.js @@ -0,0 +1,69 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = { + execute: (member) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + const { client, guild } = member; + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: member.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + if (getGuild.auditsEnabled !== true) + return; + if (!getGuild.auditsChannelId) { + throw new Error("Channel not found"); + } + const embedConfig = yield (0, getEmbedData_1.default)(guild); + const channel = client.channels.cache.get(getGuild.auditsChannelId); + if ((channel === null || channel === void 0 ? void 0 : channel.type) !== discord_js_1.ChannelType.GuildText) { + throw new Error("Channel must be a text channel"); + } + const embed = new discord_js_1.EmbedBuilder() + .setTimestamp(new Date()) + .setAuthor({ + name: "Member Left", + iconURL: (_a = client.user) === null || _a === void 0 ? void 0 : _a.displayAvatarURL(), + }) + .setFooter({ + text: embedConfig.footerText, + iconURL: embedConfig.footerIcon, + }); + channel + .send({ + embeds: [ + embed + .setColor(embedConfig.errorColor) + .setDescription(`${member.user} - (${member.user.tag})`) + .addFields([ + { + name: "Account Age", + value: `${member.user.createdAt}`, + }, + ]), + ], + }) + .then(() => { + logger_1.default.debug(`Audit log sent for event guildMemberRemove.`); + }) + .catch(() => { + throw new Error("Audit log failed to send"); + }); + }), +}; diff --git a/dist/events/guildMemberRemove/index.js b/dist/events/guildMemberRemove/index.js new file mode 100644 index 0000000..a0243d9 --- /dev/null +++ b/dist/events/guildMemberRemove/index.js @@ -0,0 +1,40 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const database_1 = __importDefault(require("../../handlers/database")); +const updatePresence_1 = __importDefault(require("../../handlers/updatePresence")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +const audits_1 = __importDefault(require("./audits")); +const leaveMessage_1 = __importDefault(require("./leaveMessage")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (member) => __awaiter(void 0, void 0, void 0, function* () { + const { client, user, guild } = member; + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Removed member: ${user.tag} (${user.id}) from guild: ${guild.name} (${guild.id})`); + yield audits_1.default.execute(member); + yield leaveMessage_1.default.execute(member); + (0, updatePresence_1.default)(client); + // Delete guildMember object + const deleteGuildMember = yield database_1.default.guildMember.deleteMany({ + where: { + userId: user.id, + guildId: guild.id, + }, + }); + logger_1.default.silly(deleteGuildMember); +}); +exports.execute = execute; diff --git a/dist/events/guildMemberRemove/leaveMessage.js b/dist/events/guildMemberRemove/leaveMessage.js new file mode 100644 index 0000000..3e3f0e8 --- /dev/null +++ b/dist/events/guildMemberRemove/leaveMessage.js @@ -0,0 +1,52 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +exports.default = { + execute: (member) => __awaiter(void 0, void 0, void 0, function* () { + const { footerText, footerIcon, errorColor } = yield (0, getEmbedData_1.default)(member.guild); + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: member.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + const { client } = member; + if (getGuild.welcomeEnabled !== true) + return; + if (!getGuild.welcomeLeaveChannelId) + return; + const channel = client.channels.cache.get(`${getGuild.welcomeLeaveChannelId}`); + if (!channel) + throw new Error("Channel not found"); + if (channel.type !== discord_js_1.ChannelType.GuildText) + throw new Error("Channel is not a text channel"); + channel.send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setColor(errorColor) + .setTitle(`${member.user.username} has left the server!`) + .setThumbnail(member.user.displayAvatarURL()) + .setDescription(getGuild.welcomeLeaveChannelMessage || + "Configure a leave message in the `/settings guild welcome`.") + .setTimestamp() + .setFooter({ + text: footerText, + iconURL: footerIcon, + }), + ], + }); + }), +}; diff --git a/dist/events/interactionCreate/audits.js b/dist/events/interactionCreate/audits.js new file mode 100644 index 0000000..aa660a8 --- /dev/null +++ b/dist/events/interactionCreate/audits.js @@ -0,0 +1,68 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = { + execute: (interaction) => __awaiter(void 0, void 0, void 0, function* () { + if (interaction === null) + return; + if (interaction.guild === null) + return; + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: interaction.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + const { footerText, footerIcon, successColor } = yield (0, getEmbedData_1.default)(interaction.guild); + const { client } = interaction; + if (getGuild.auditsEnabled !== true) + return; + if (!getGuild.auditsChannelId) + return; + const channel = client.channels.cache.get(`${getGuild.auditsChannelId}`); + if (!channel) + return; + if (channel.type !== discord_js_1.ChannelType.GuildText) + return; + channel + .send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setColor(successColor) + .setDescription(` + **Interaction created by** ${interaction.user.username} **in** ${interaction.channel} + γ…€**Interaction ID**: ${interaction.id} + γ…€**Type**: ${interaction.type} + γ…€**User ID**: ${interaction.user.id} + `) + .setThumbnail(interaction.user.displayAvatarURL()) + .setTimestamp() + .setFooter({ + text: footerText, + iconURL: footerIcon, + }), + ], + }) + .then(() => { + var _a, _b; + logger_1.default.debug(`Audit log sent for event interactionCreate in guild ${(_a = interaction === null || interaction === void 0 ? void 0 : interaction.guild) === null || _a === void 0 ? void 0 : _a.name} (${(_b = interaction === null || interaction === void 0 ? void 0 : interaction.guild) === null || _b === void 0 ? void 0 : _b.id})`); + }) + .catch(() => { + logger_1.default.silly("Failed to send audit log for event interactionCreate"); + }); + }), +}; diff --git a/dist/events/interactionCreate/handlers/button/index.js b/dist/events/interactionCreate/handlers/button/index.js new file mode 100644 index 0000000..7b069c5 --- /dev/null +++ b/dist/events/interactionCreate/handlers/button/index.js @@ -0,0 +1,44 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + if (!interaction.isButton()) + return; + const { customId } = interaction; + const currentButton = yield (_a = `../../../buttons/${customId}`, Promise.resolve().then(() => __importStar(require(_a)))); + if (!currentButton) + throw new Error(`Unknown button ${customId}`); + yield currentButton.execute(interaction); +}); diff --git a/dist/events/interactionCreate/handlers/command/index.js b/dist/events/interactionCreate/handlers/command/index.js new file mode 100644 index 0000000..f24dae0 --- /dev/null +++ b/dist/events/interactionCreate/handlers/command/index.js @@ -0,0 +1,20 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + if (!interaction.isCommand()) + return; + const { client, commandName } = interaction; + const currentCommand = client.commands.get(commandName); + if (!currentCommand) + throw new Error(`Unknown command ${commandName}`); + yield currentCommand.execute(interaction); +}); diff --git a/dist/events/interactionCreate/handlers/index.js b/dist/events/interactionCreate/handlers/index.js new file mode 100644 index 0000000..13706f4 --- /dev/null +++ b/dist/events/interactionCreate/handlers/index.js @@ -0,0 +1,48 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handleCommandInteraction = exports.execute = void 0; +const discord_js_1 = require("discord.js"); +const getEmbedData_1 = __importDefault(require("../../../helpers/getEmbedData")); +const button_1 = __importDefault(require("./button")); +const command_1 = __importDefault(require("./command")); +// Send interactions to all available handlers +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, button_1.default)(interaction); + yield (0, command_1.default)(interaction); +}); +exports.execute = execute; +// Handle interactions from commands +const handleCommandInteraction = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { errorColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(interaction.guild); + yield (0, command_1.default)(interaction).catch((err) => { + const buttons = new discord_js_1.ActionRowBuilder().addComponents(new discord_js_1.ButtonBuilder() + .setLabel("Report Problem") + .setStyle(discord_js_1.ButtonStyle.Link) + .setEmoji("πŸ“") + .setURL("https://discord.zyner.org")); + return interaction.editReply({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setTitle(`:no_entry_sign:οΈ±Your request failed`) + .setDescription(`${err.message}`) + .setColor(errorColor) + .setTimestamp(new Date()) + .setFooter({ text: footerText, iconURL: footerIcon }), + ], + components: [buttons], + }); + }); +}); +exports.handleCommandInteraction = handleCommandInteraction; diff --git a/dist/events/interactionCreate/index.js b/dist/events/interactionCreate/index.js new file mode 100644 index 0000000..d7906ee --- /dev/null +++ b/dist/events/interactionCreate/index.js @@ -0,0 +1,38 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +// 3rd party dependencies +const discord_js_1 = require("discord.js"); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Dependencies +const audits_1 = __importDefault(require("./audits")); +const handlers_1 = require("./handlers"); +exports.options = { + type: "on", +}; +// Execute the event +const execute = (interaction) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, id } = interaction; + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`New interaction: ${id} in guild: ${guild === null || guild === void 0 ? void 0 : guild.name} (${guild === null || guild === void 0 ? void 0 : guild.id})`); + switch (interaction.type) { + case discord_js_1.InteractionType.ApplicationCommand: + yield (0, handlers_1.handleCommandInteraction)(interaction); + break; + default: + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.error(`Unknown interaction type: ${interaction.type}`); + } + yield audits_1.default.execute(interaction); +}); +exports.execute = execute; diff --git a/dist/events/messageCreate/index.js b/dist/events/messageCreate/index.js new file mode 100644 index 0000000..97574b3 --- /dev/null +++ b/dist/events/messageCreate/index.js @@ -0,0 +1,26 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const modules_1 = __importDefault(require("./modules")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (message) => __awaiter(void 0, void 0, void 0, function* () { + yield modules_1.default.credits.execute(message); + yield modules_1.default.points.execute(message); + yield modules_1.default.counters.execute(message); +}); +exports.execute = execute; diff --git a/dist/events/messageCreate/modules/counters/index.js b/dist/events/messageCreate/modules/counters/index.js new file mode 100644 index 0000000..a7d11dd --- /dev/null +++ b/dist/events/messageCreate/modules/counters/index.js @@ -0,0 +1,69 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + execute: (message) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, author, content, channel } = message; + if (!guild) + return; + if (author.bot) + return; + if ((channel === null || channel === void 0 ? void 0 : channel.type) !== discord_js_1.ChannelType.GuildText) + return; + const messages = yield message.channel.messages.fetch({ limit: 2 }); + const lastMessage = messages.last(); + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: channel.id, + }, + }, + }); + if (!channelCounter) { + logger_1.default.debug("No counters found in channel."); + return; + } + if ((lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.author.id) === author.id && + channel.id === channelCounter.channelId) { + logger_1.default.silly(`${author.username} sent the last message therefor not allowing again.`); + yield message.delete(); + return false; + } + if (content !== channelCounter.triggerWord) { + logger_1.default.silly(`Counter word ${channelCounter.triggerWord} does not match message ${content}`); + yield message.delete(); + return false; + } + const updateGuildCounter = yield database_1.default.guildCounter.update({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: channel.id, + }, + }, + data: { + count: { + increment: 1, + }, + }, + }); + logger_1.default.silly(updateGuildCounter); + if (!updateGuildCounter) + logger_1.default.error(`Failed to update counter - ${updateGuildCounter}`); + }), +}; diff --git a/dist/events/messageCreate/modules/credits/index.js b/dist/events/messageCreate/modules/credits/index.js new file mode 100644 index 0000000..d99136c --- /dev/null +++ b/dist/events/messageCreate/modules/credits/index.js @@ -0,0 +1,70 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const give_1 = __importDefault(require("../../../../helpers/credits/give")); +const cooldown_1 = __importDefault(require("../../../../middlewares/cooldown")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + execute: (message) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, author, content, channel } = message; + if (!guild) + return; + if (author.bot) + return; + if (channel.type !== discord_js_1.ChannelType.GuildText) + return; + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: author.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: author.id, + }, + where: { + id: author.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + if (content.length < createGuildMember.guild.creditsMinimumLength) + return; + yield (0, cooldown_1.default)(guild, author, "event-messageCreate-credits", createGuildMember.guild.creditsTimeout, true); + yield (0, give_1.default)(guild, author, createGuildMember.guild.creditsRate); + }), +}; diff --git a/dist/events/messageCreate/modules/index.js b/dist/events/messageCreate/modules/index.js new file mode 100644 index 0000000..1ebf005 --- /dev/null +++ b/dist/events/messageCreate/modules/index.js @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const counters_1 = __importDefault(require("./counters")); +const credits_1 = __importDefault(require("./credits")); +const points_1 = __importDefault(require("./points")); +exports.default = { + counters: counters_1.default, + credits: credits_1.default, + points: points_1.default, +}; diff --git a/dist/events/messageCreate/modules/points/index.js b/dist/events/messageCreate/modules/points/index.js new file mode 100644 index 0000000..5604ebf --- /dev/null +++ b/dist/events/messageCreate/modules/points/index.js @@ -0,0 +1,84 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../../../handlers/database")); +const cooldown_1 = __importDefault(require("../../../../middlewares/cooldown")); +const logger_1 = __importDefault(require("../../../../middlewares/logger")); +exports.default = { + execute: (message) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, author, content, channel } = message; + if (!guild) + return; + if (author.bot) + return; + if (channel.type !== discord_js_1.ChannelType.GuildText) + return; + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: author.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: author.id, + }, + where: { + id: author.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + if (content.length < createGuildMember.guild.pointsMinimumLength) + return; + yield (0, cooldown_1.default)(guild, author, "event-messageCreate-points", createGuildMember.guild.pointsTimeout, true); + const updateGuildMember = yield database_1.default.guildMember.update({ + where: { + userId_guildId: { + userId: author.id, + guildId: guild.id, + }, + }, + data: { + pointsEarned: { + increment: createGuildMember.guild.pointsRate, + }, + }, + }); + logger_1.default.silly(updateGuildMember); + if (!updateGuildMember) + throw new Error("Failed to update guildMember object"); + }), +}; diff --git a/dist/events/messageDelete/audits.js b/dist/events/messageDelete/audits.js new file mode 100644 index 0000000..14c1450 --- /dev/null +++ b/dist/events/messageDelete/audits.js @@ -0,0 +1,72 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = { + execute: (message) => __awaiter(void 0, void 0, void 0, function* () { + if (message === null) + return; + if (message.guild === null) + return; + const { footerText, footerIcon, successColor } = yield (0, getEmbedData_1.default)(message.guild); + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: message.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + const { client } = message; + if (!getGuild) + throw new Error("Guild not found"); + if (getGuild.auditsEnabled !== true) + return; + if (!getGuild.auditsChannelId) + return; + const channel = client.channels.cache.get(`${getGuild.auditsChannelId}`); + if (!channel) + return; + if (channel.type !== discord_js_1.ChannelType.GuildText) + return; + channel + .send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setColor(successColor) + .setAuthor({ + name: message.author.username, + iconURL: message.author.displayAvatarURL(), + }) + .setDescription(` + **Message sent by** ${message.author} **deleted in** ${message.channel} + ${message.content} + `) + .setTimestamp() + .setFooter({ + text: footerText, + iconURL: footerIcon, + }), + ], + }) + .then(() => { + var _a, _b; + logger_1.default.info(`Audit log sent for event messageDelete in guild ${(_a = message === null || message === void 0 ? void 0 : message.guild) === null || _a === void 0 ? void 0 : _a.name} (${(_b = message === null || message === void 0 ? void 0 : message.guild) === null || _b === void 0 ? void 0 : _b.id})`); + }) + .catch(() => { + var _a, _b; + throw new Error(`Audit log failed to send for event messageDelete in guild ${(_a = message === null || message === void 0 ? void 0 : message.guild) === null || _a === void 0 ? void 0 : _a.name} (${(_b = message === null || message === void 0 ? void 0 : message.guild) === null || _b === void 0 ? void 0 : _b.id})`); + }); + }), +}; diff --git a/dist/events/messageDelete/index.js b/dist/events/messageDelete/index.js new file mode 100644 index 0000000..e742293 --- /dev/null +++ b/dist/events/messageDelete/index.js @@ -0,0 +1,26 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const audits_1 = __importDefault(require("./audits")); +const counter_1 = __importDefault(require("./modules/counter")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (message) => __awaiter(void 0, void 0, void 0, function* () { + yield audits_1.default.execute(message); + yield (0, counter_1.default)(message); +}); +exports.execute = execute; diff --git a/dist/events/messageDelete/modules/counter.js b/dist/events/messageDelete/modules/counter.js new file mode 100644 index 0000000..dfa138e --- /dev/null +++ b/dist/events/messageDelete/modules/counter.js @@ -0,0 +1,45 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Models +const database_1 = __importDefault(require("../../../handlers/database")); +const logger_1 = __importDefault(require("../../../middlewares/logger")); +exports.default = (message) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, channel, author, content } = message; + if (!guild) + throw new Error("Guild not found"); + if (!channel) + throw new Error("Channel not found"); + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: channel.id, + }, + }, + }); + if (!channelCounter) + throw new Error("No counter found in channel."); + const messages = yield message.channel.messages.fetch({ limit: 1 }); + const lastMessage = messages.last(); + if (!lastMessage) + return; + if (content !== channelCounter.triggerWord) + return; + if (lastMessage.author.id === message.author.id) + return; + channel === null || channel === void 0 ? void 0 : channel.send(`${author} said **${channelCounter.triggerWord}**.`); + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`${author} said ${channelCounter.triggerWord} in ${channel}`); + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`User: ${author === null || author === void 0 ? void 0 : author.tag} (${author === null || author === void 0 ? void 0 : author.id}) in guild: ${guild === null || guild === void 0 ? void 0 : guild.name} (${guild === null || guild === void 0 ? void 0 : guild.id}) said the counter word: ${channelCounter.triggerWord}`); +}); diff --git a/dist/events/messageUpdate/audits.js b/dist/events/messageUpdate/audits.js new file mode 100644 index 0000000..35c350d --- /dev/null +++ b/dist/events/messageUpdate/audits.js @@ -0,0 +1,74 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +/* eslint-disable no-loops/no-loops */ +const discord_js_1 = require("discord.js"); +const database_1 = __importDefault(require("../../handlers/database")); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = { + execute: (oldMessage, newMessage) => __awaiter(void 0, void 0, void 0, function* () { + if (oldMessage === null) + return; + if (newMessage === null) + return; + if (oldMessage.guild === null) + return; + if (newMessage.guild === null) + return; + const { footerText, footerIcon, successColor } = yield (0, getEmbedData_1.default)(newMessage.guild); + const getGuild = yield database_1.default.guild.findUnique({ + where: { id: oldMessage.guild.id }, + }); + if (!getGuild) + throw new Error("Guild not found"); + const { client } = oldMessage; + if (getGuild.auditsEnabled !== true) + return; + if (!getGuild.auditsChannelId) + return; + const channel = client.channels.cache.get(`${getGuild.auditsChannelId}`); + if (!channel) + return; + if (channel.type !== discord_js_1.ChannelType.GuildText) + return; + channel + .send({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setColor(successColor) + .setAuthor({ + name: newMessage.author.username, + iconURL: newMessage.author.displayAvatarURL(), + }) + .setDescription(` + **Message edited in** ${newMessage.channel} [jump to message](https://discord.com/channels/${newMessage.guild.id}/${newMessage.channel.id}/${newMessage.id}) + `) + .setTimestamp() + .setFooter({ + text: footerText, + iconURL: footerIcon, + }), + ], + }) + .then(() => { + var _a, _b; + logger_1.default.info(`Audit log sent for event messageUpdate in guild ${(_a = newMessage === null || newMessage === void 0 ? void 0 : newMessage.guild) === null || _a === void 0 ? void 0 : _a.name} (${(_b = newMessage === null || newMessage === void 0 ? void 0 : newMessage.guild) === null || _b === void 0 ? void 0 : _b.id})`); + }) + .catch(() => { + var _a, _b; + throw new Error(`Audit log failed to send for event messageUpdate in guild ${(_a = newMessage === null || newMessage === void 0 ? void 0 : newMessage.guild) === null || _a === void 0 ? void 0 : _a.name} (${(_b = newMessage === null || newMessage === void 0 ? void 0 : newMessage.guild) === null || _b === void 0 ? void 0 : _b.id})`); + }); + }), +}; diff --git a/dist/events/messageUpdate/index.js b/dist/events/messageUpdate/index.js new file mode 100644 index 0000000..f7079f4 --- /dev/null +++ b/dist/events/messageUpdate/index.js @@ -0,0 +1,33 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Modules +const counter_1 = __importDefault(require("./modules/counter")); +const audits_1 = __importDefault(require("./audits")); +exports.options = { + type: "on", +}; +// Execute the function +const execute = (oldMessage, newMessage) => __awaiter(void 0, void 0, void 0, function* () { + const { author, guild } = newMessage; + yield audits_1.default.execute(oldMessage, newMessage); + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Message update event fired by ${author.tag} (${author.id}) in guild: ${guild === null || guild === void 0 ? void 0 : guild.name} (${guild === null || guild === void 0 ? void 0 : guild.id})`); + if (author === null || author === void 0 ? void 0 : author.bot) + return logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Message update event fired by bot`); + yield (0, counter_1.default)(newMessage); + return true; +}); +exports.execute = execute; diff --git a/dist/events/messageUpdate/modules/counter.js b/dist/events/messageUpdate/modules/counter.js new file mode 100644 index 0000000..bf5c2db --- /dev/null +++ b/dist/events/messageUpdate/modules/counter.js @@ -0,0 +1,46 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Models +const database_1 = __importDefault(require("../../../handlers/database")); +const logger_1 = __importDefault(require("../../../middlewares/logger")); +exports.default = (message) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, channel, author, content } = message; + if (!guild) + throw new Error("Guild not found"); + if (!channel) + throw new Error("Channel not found"); + const channelCounter = yield database_1.default.guildCounter.findUnique({ + where: { + guildId_channelId: { + guildId: guild.id, + channelId: channel.id, + }, + }, + }); + if (!channelCounter) + return logger_1.default.debug("No counters found in channel."); + if (content === channelCounter.triggerWord) + return logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`User: ${author === null || author === void 0 ? void 0 : author.tag} (${author === null || author === void 0 ? void 0 : author.id}) in guild: ${guild === null || guild === void 0 ? void 0 : guild.name} (${guild === null || guild === void 0 ? void 0 : guild.id}) said the counter word: ${channelCounter.triggerWord}`); + yield message + .delete() + .then(() => __awaiter(void 0, void 0, void 0, function* () { + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`${author} said ${channelCounter.triggerWord} in ${channel}`); + yield (channel === null || channel === void 0 ? void 0 : channel.send(`${author} said **${channelCounter.triggerWord}**.`)); + })) + .catch((error) => { + return logger_1.default.error(error); + }); + return true; +}); diff --git a/dist/events/rateLimit/index.js b/dist/events/rateLimit/index.js new file mode 100644 index 0000000..fa59d44 --- /dev/null +++ b/dist/events/rateLimit/index.js @@ -0,0 +1,16 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.options = { + type: "on", +}; +// Function to execute the event +const execute = (client) => { + var _a; + logger_1.default.warn(`Discord's API client (${(_a = client === null || client === void 0 ? void 0 : client.user) === null || _a === void 0 ? void 0 : _a.tag}) is rate-limited!`); +}; +exports.execute = execute; diff --git a/dist/events/ready/index.js b/dist/events/ready/index.js new file mode 100644 index 0000000..41e1a22 --- /dev/null +++ b/dist/events/ready/index.js @@ -0,0 +1,29 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +// Helpers +const deployCommands_1 = __importDefault(require("../../handlers/deployCommands")); +const updatePresence_1 = __importDefault(require("../../handlers/updatePresence")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.options = { + type: "once", +}; +// Execute the event +const execute = (client) => __awaiter(void 0, void 0, void 0, function* () { + logger_1.default.info("Discord's API client is ready!"); + (0, updatePresence_1.default)(client); + yield (0, deployCommands_1.default)(client); +}); +exports.execute = execute; diff --git a/dist/handlers/command/index.js b/dist/handlers/command/index.js new file mode 100644 index 0000000..1d9b5b9 --- /dev/null +++ b/dist/handlers/command/index.js @@ -0,0 +1,92 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __asyncValues = (this && this.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.register = void 0; +const checkDirectory_1 = __importDefault(require("../../helpers/checkDirectory")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Register the commands. +const register = (client) => __awaiter(void 0, void 0, void 0, function* () { + var _a, e_1, _b, _c; + logger_1.default.info("πŸ”§ Started command management"); + const commandNames = yield (0, checkDirectory_1.default)("commands"); + if (!commandNames) + return logger_1.default.warn("No available commands found"); + const totalCommands = commandNames.length; + let loadedCommands = 0; + logger_1.default.info(`πŸ”§ Loading ${totalCommands} commands`); + // Import an command. + const importCommand = (name) => __awaiter(void 0, void 0, void 0, function* () { + var _e; + const command = yield (_e = `../../commands/${name}`, Promise.resolve().then(() => __importStar(require(_e)))); + client.commands.set(command.builder.name, command); + return loadedCommands++; + }); + try { + for (var _d = true, commandNames_1 = __asyncValues(commandNames), commandNames_1_1; commandNames_1_1 = yield commandNames_1.next(), _a = commandNames_1_1.done, !_a;) { + _c = commandNames_1_1.value; + _d = false; + try { + const commandName = _c; + yield importCommand(commandName).then(() => { + return logger_1.default.verbose(`πŸ”§ Loaded command "${commandName}"`); + }); + if (loadedCommands === totalCommands) { + return logger_1.default.info("πŸ”§ All commands loaded"); + } + } + finally { + _d = true; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_d && !_a && (_b = commandNames_1.return)) yield _b.call(commandNames_1); + } + finally { if (e_1) throw e_1.error; } + } + return true; +}); +exports.register = register; diff --git a/dist/handlers/database/index.js b/dist/handlers/database/index.js new file mode 100644 index 0000000..2f6ad5e --- /dev/null +++ b/dist/handlers/database/index.js @@ -0,0 +1,25 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_1 = require("@prisma/client"); +const logger_1 = __importDefault(require("../../middlewares/logger")); +const prisma = new client_1.PrismaClient(); +prisma.$use((params, next) => __awaiter(void 0, void 0, void 0, function* () { + const before = Date.now(); + const result = yield next(params); + const after = Date.now(); + logger_1.default.debug(`Query ${params.model}.${params.action} took ${after - before}ms`); + return result; +})); +exports.default = prisma; diff --git a/dist/handlers/deferReply/index.js b/dist/handlers/deferReply/index.js new file mode 100644 index 0000000..d098ce7 --- /dev/null +++ b/dist/handlers/deferReply/index.js @@ -0,0 +1,37 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); +const getEmbedData_1 = __importDefault(require("../../helpers/getEmbedData")); +exports.default = (interaction, ephemeral) => __awaiter(void 0, void 0, void 0, function* () { + if (!interaction.isRepliable()) + throw new Error(`Cannot reply to an interaction that is not repliable`); + yield interaction.deferReply({ + ephemeral, + }); + const embedConfig = yield (0, getEmbedData_1.default)(interaction.guild); + yield interaction.editReply({ + embeds: [ + new discord_js_1.EmbedBuilder() + .setFooter({ + text: embedConfig.footerText, + iconURL: embedConfig.footerIcon, + }) + .setTimestamp(new Date()) + .setTitle("⏳︱Your request are being processed") + .setColor(embedConfig.waitColor) + .setDescription("This might take a while, please wait..."), + ], + }); +}); diff --git a/dist/handlers/deployCommands/index.js b/dist/handlers/deployCommands/index.js new file mode 100644 index 0000000..bfc7406 --- /dev/null +++ b/dist/handlers/deployCommands/index.js @@ -0,0 +1,44 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = (client) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Destructure the client. + const { application } = client; + if (!application) + throw new Error("No application found"); + // 2. Log that we are starting the command management. + logger_1.default.info("πŸ”§ Started command deployment"); + // 3. Get the commands. + const commands = []; + client.commands.forEach((command) => { + commands.push(command.builder.toJSON()); + logger_1.default.verbose(`πŸ”§ Loaded command "${command.builder.name}"`); + }); + // 4. Set the commands. + yield application.commands.set(commands).then(() => { + logger_1.default.info("πŸ”§ Deployed commands globally"); + }); + // 5. Tell the user that development mode is enabled. + if (process.env.NODE_ENV === "development") { + logger_1.default.info("πŸ”§ Development mode enabled"); + yield application.commands + .set(commands, process.env.DISCORD_GUILD_ID) + .then(() => { + logger_1.default.info(`πŸ”§ Deployed commands to guild`); + }); + } + // 6. Log that we are done with the command management. + logger_1.default.info("πŸ”§ Finished command deployment"); +}); diff --git a/dist/handlers/event/index.js b/dist/handlers/event/index.js new file mode 100644 index 0000000..38cadf3 --- /dev/null +++ b/dist/handlers/event/index.js @@ -0,0 +1,105 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __asyncValues = (this && this.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.register = void 0; +const checkDirectory_1 = __importDefault(require("../../helpers/checkDirectory")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Registers all available events. +const register = (client) => __awaiter(void 0, void 0, void 0, function* () { + var _a, e_1, _b, _c; + logger_1.default.info("πŸ“‘ Started event management"); + const eventNames = yield (0, checkDirectory_1.default)("events"); + if (!eventNames) + return logger_1.default.warn("No available events found"); + const totalEvents = eventNames.length; + let loadedEvents = 0; + logger_1.default.info(`πŸ“‘ Loading ${totalEvents} events`); + // Import an event. + const importEvent = (name) => __awaiter(void 0, void 0, void 0, function* () { + var _e; + const event = yield (_e = `../../events/${name}`, Promise.resolve().then(() => __importStar(require(_e)))); + // Create a new event execute function. + const eventExecutor = (...args) => __awaiter(void 0, void 0, void 0, function* () { + yield event.execute(...args); + }); + switch (event.options.type) { + case "once": + client.once(name, eventExecutor); + break; + case "on": + client.on(name, eventExecutor); + break; + default: + throw new Error(`πŸ“‘ Invalid event type for event: ${name}`); + } + return loadedEvents++; + }); + try { + for (var _d = true, eventNames_1 = __asyncValues(eventNames), eventNames_1_1; eventNames_1_1 = yield eventNames_1.next(), _a = eventNames_1_1.done, !_a;) { + _c = eventNames_1_1.value; + _d = false; + try { + const eventName = _c; + yield importEvent(eventName).then(() => { + return logger_1.default.verbose(`πŸ“‘ Loaded event "${eventName}"`); + }); + if (loadedEvents === totalEvents) { + return logger_1.default.info("πŸ“‘ All events loaded"); + } + } + finally { + _d = true; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_d && !_a && (_b = eventNames_1.return)) yield _b.call(eventNames_1); + } + finally { if (e_1) throw e_1.error; } + } + return true; +}); +exports.register = register; diff --git a/dist/handlers/schedule/index.js b/dist/handlers/schedule/index.js new file mode 100644 index 0000000..d547396 --- /dev/null +++ b/dist/handlers/schedule/index.js @@ -0,0 +1,57 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.start = void 0; +const node_schedule_1 = __importDefault(require("node-schedule")); +const checkDirectory_1 = __importDefault(require("../../helpers/checkDirectory")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Start all jobs that are in the schedules directory +const start = (client) => __awaiter(void 0, void 0, void 0, function* () { + logger_1.default.info("⏰ Started job management"); + const jobNames = yield (0, checkDirectory_1.default)("schedules"); + if (!jobNames) + return logger_1.default.warn("⏰ No available jobs found"); + return yield Promise.all(jobNames.map((jobName) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + const job = yield (_a = `../../schedules/${jobName}`, Promise.resolve().then(() => __importStar(require(_a)))); + return node_schedule_1.default.scheduleJob(job.options.schedule, () => __awaiter(void 0, void 0, void 0, function* () { + logger_1.default.verbose(`⏰ Performed the job "${jobName}"`); + yield job.execute(client); + })); + }))); +}); +exports.start = start; diff --git a/dist/handlers/updatePresence/index.js b/dist/handlers/updatePresence/index.js new file mode 100644 index 0000000..c026be1 --- /dev/null +++ b/dist/handlers/updatePresence/index.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// Dependencies +const discord_js_1 = require("discord.js"); +const logger_1 = __importDefault(require("../../middlewares/logger")); +// Function +exports.default = (client) => { + // 1. Destructure the client. + const { guilds, user } = client; + if (!user) + throw new Error("No user found"); + // 2. Get the total number of guilds and members. + const memberCount = guilds.cache.reduce((a, g) => a + g.memberCount, 0); + const guildCount = guilds.cache.size; + // 3. Set the presence. + user.setPresence({ + activities: [ + { + name: `${guildCount} guilds | ${memberCount} members`, + type: discord_js_1.ActivityType.Watching, + }, + ], + }); + // 4. Log the presence. + return logger_1.default.info(`πŸ‘€ Presence set to "${guildCount} guilds | ${memberCount} members"`); +}; diff --git a/dist/helpers/baseEmbeds/index.js b/dist/helpers/baseEmbeds/index.js new file mode 100644 index 0000000..9c2be31 --- /dev/null +++ b/dist/helpers/baseEmbeds/index.js @@ -0,0 +1,47 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.error = exports.wait = exports.success = void 0; +const discord_js_1 = require("discord.js"); +const getEmbedData_1 = __importDefault(require("../getEmbedData")); +// Construct a base embed for success messages +const success = (guild, title) => __awaiter(void 0, void 0, void 0, function* () { + const { successColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + return new discord_js_1.EmbedBuilder() + .setTimestamp(new Date()) + .setTitle(title) + .setColor(successColor) + .setFooter({ text: footerText, iconURL: footerIcon }); +}); +exports.success = success; +// Construct a base embed for wait messages +const wait = (guild, title) => __awaiter(void 0, void 0, void 0, function* () { + const { waitColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + return new discord_js_1.EmbedBuilder() + .setTimestamp(new Date()) + .setTitle(title) + .setColor(waitColor) + .setFooter({ text: footerText, iconURL: footerIcon }); +}); +exports.wait = wait; +// Construct a base embed for error messages +const error = (guild, title) => __awaiter(void 0, void 0, void 0, function* () { + const { errorColor, footerText, footerIcon } = yield (0, getEmbedData_1.default)(guild); + return new discord_js_1.EmbedBuilder() + .setTimestamp(new Date()) + .setTitle(title) + .setColor(errorColor) + .setFooter({ text: footerText, iconURL: footerIcon }); +}); +exports.error = error; diff --git a/dist/helpers/capitalizeFirstLetter/index.js b/dist/helpers/capitalizeFirstLetter/index.js new file mode 100644 index 0000000..84071db --- /dev/null +++ b/dist/helpers/capitalizeFirstLetter/index.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (text) => { + return text.charAt(0).toUpperCase() + text.slice(1); +}; diff --git a/dist/helpers/checkDirectory/index.js b/dist/helpers/checkDirectory/index.js new file mode 100644 index 0000000..e250f61 --- /dev/null +++ b/dist/helpers/checkDirectory/index.js @@ -0,0 +1,20 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs_1 = __importDefault(require("fs")); +const fsPromises = fs_1.default.promises; +exports.default = (path) => __awaiter(void 0, void 0, void 0, function* () { + const result = yield fsPromises.readdir(`${__dirname}/../../${path}`); + return result; +}); diff --git a/dist/helpers/checkPermission/index.js b/dist/helpers/checkPermission/index.js new file mode 100644 index 0000000..c234e11 --- /dev/null +++ b/dist/helpers/checkPermission/index.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (interaction, permission) => { + if (!interaction.memberPermissions) + throw new Error("Could not check user for permissions"); + if (!interaction.memberPermissions.has(permission)) + throw new Error("Permission denied"); +}; diff --git a/dist/helpers/credits/give.js b/dist/helpers/credits/give.js new file mode 100644 index 0000000..95948ba --- /dev/null +++ b/dist/helpers/credits/give.js @@ -0,0 +1,64 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +const transactionRules_1 = __importDefault(require("./transactionRules")); +exports.default = (guild, user, amount) => __awaiter(void 0, void 0, void 0, function* () { + return yield database_1.default.$transaction((tx) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Check if the transaction is valid. + (0, transactionRules_1.default)(guild, user, amount); + // 2. Make the transaction. + const recipient = yield tx.guildMember.upsert({ + update: { + creditsEarned: { + increment: amount, + }, + }, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + creditsEarned: amount, + }, + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + }); + // 3. Verify that the recipient actually is created. + if (!recipient) + throw new Error("No recipient available"); + // 4. Return the recipient. + return recipient; + })); +}); diff --git a/dist/helpers/credits/set.js b/dist/helpers/credits/set.js new file mode 100644 index 0000000..4ba0e91 --- /dev/null +++ b/dist/helpers/credits/set.js @@ -0,0 +1,62 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +const transactionRules_1 = __importDefault(require("./transactionRules")); +exports.default = (guild, user, amount) => __awaiter(void 0, void 0, void 0, function* () { + return yield database_1.default.$transaction((tx) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Check if the transaction is valid. + (0, transactionRules_1.default)(guild, user, amount); + // 2. Make the transaction. + const recipient = yield tx.guildMember.upsert({ + update: { + creditsEarned: amount, + }, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + creditsEarned: amount, + }, + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + }); + // 3. Verify that the recipient actually is created. + if (!recipient) + throw new Error("No recipient available"); + // 4. Return the recipient. + return recipient; + })); +}); diff --git a/dist/helpers/credits/take.js b/dist/helpers/credits/take.js new file mode 100644 index 0000000..1224c70 --- /dev/null +++ b/dist/helpers/credits/take.js @@ -0,0 +1,64 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +const transactionRules_1 = __importDefault(require("./transactionRules")); +exports.default = (guild, user, amount) => __awaiter(void 0, void 0, void 0, function* () { + return yield database_1.default.$transaction((tx) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Check if the transaction is valid. + (0, transactionRules_1.default)(guild, user, amount); + // 2. Make the transaction. + const recipient = yield tx.guildMember.upsert({ + update: { + creditsEarned: { + decrement: amount, + }, + }, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + creditsEarned: -amount, + }, + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + }); + // 3. Verify that the recipient credits are not below zero. + if (recipient.creditsEarned < -100) + throw new Error("User do not have enough credits"); + // 4. Return the recipient. + return recipient; + })); +}); diff --git a/dist/helpers/credits/transactionRules.js b/dist/helpers/credits/transactionRules.js new file mode 100644 index 0000000..861983f --- /dev/null +++ b/dist/helpers/credits/transactionRules.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (guild, user, amount) => { + // 1. Verify that the amount is not above 100.000.000 credits. + if (amount > 100000000) { + throw new Error("You can't give more than 1.000.000 credits."); + } + // 2. Verify that the amount is not below 1 credits. + if (amount <= 0) { + throw new Error("You can't give below one credit."); + } + // 3. Verify that the user is not an bot. + if (user.bot) { + throw new Error("You can't give to an bot."); + } +}; diff --git a/dist/helpers/credits/transfer.js b/dist/helpers/credits/transfer.js new file mode 100644 index 0000000..f93b869 --- /dev/null +++ b/dist/helpers/credits/transfer.js @@ -0,0 +1,105 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +const transactionRules_1 = __importDefault(require("./transactionRules")); +exports.default = (guild, from, to, amount) => __awaiter(void 0, void 0, void 0, function* () { + return yield database_1.default.$transaction((tx) => __awaiter(void 0, void 0, void 0, function* () { + // 1. Decrement amount from the sender. + const sender = yield tx.guildMember.upsert({ + update: { + creditsEarned: { + decrement: amount, + }, + }, + create: { + user: { + connectOrCreate: { + create: { + id: from.id, + }, + where: { + id: from.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + creditsEarned: -amount, + }, + where: { + userId_guildId: { + userId: from.id, + guildId: guild.id, + }, + }, + }); + // 4. Verify that the sender's balance didn't go below zero. + if (sender.creditsEarned < 0) { + throw new Error(`${from} doesn't have enough to send ${amount}`); + } + // 5. Check if the transactions is valid. + (0, transactionRules_1.default)(guild, from, amount); + (0, transactionRules_1.default)(guild, to, amount); + // 6. Verify that sender and recipient are not the same user. + if (from.id === to.id) + throw new Error("You can't transfer to yourself."); + // 7. Increment the recipient's balance by amount. + const recipient = yield tx.guildMember.upsert({ + update: { + creditsEarned: { + increment: amount, + }, + }, + create: { + user: { + connectOrCreate: { + create: { + id: to.id, + }, + where: { + id: to.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + creditsEarned: amount, + }, + where: { + userId_guildId: { + userId: to.id, + guildId: guild.id, + }, + }, + }); + return recipient; + })); +}); diff --git a/dist/helpers/encryption/index.js b/dist/helpers/encryption/index.js new file mode 100644 index 0000000..986d9c1 --- /dev/null +++ b/dist/helpers/encryption/index.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = __importDefault(require("crypto")); +const iv = crypto_1.default.randomBytes(16); +// Encrypts a string +const encrypt = (text) => { + const cipher = crypto_1.default.createCipheriv(process.env.ENCRYPTION_ALGORITHM, process.env.ENCRYPTION_SECRET, iv); + const encrypted = Buffer.concat([cipher.update(text), cipher.final()]); + return { + iv: iv.toString("hex"), + content: encrypted.toString("hex"), + }; +}; +// Decrypts a string +const decrypt = (hash) => { + const decipher = crypto_1.default.createDecipheriv(process.env.ENCRYPTION_ALGORITHM, process.env.ENCRYPTION_SECRET, Buffer.from(hash.iv, "hex")); + const decrypted = Buffer.concat([ + decipher.update(Buffer.from(hash.content, "hex")), + decipher.final(), + ]); + return decrypted.toString(); +}; +exports.default = { + encrypt, + decrypt, +}; diff --git a/dist/helpers/getEmbedData/index.js b/dist/helpers/getEmbedData/index.js new file mode 100644 index 0000000..1d9cf64 --- /dev/null +++ b/dist/helpers/getEmbedData/index.js @@ -0,0 +1,75 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = (guild) => __awaiter(void 0, void 0, void 0, function* () { + const { EMBED_COLOR_SUCCESS, EMBED_COLOR_WAIT, EMBED_COLOR_ERROR, EMBED_FOOTER_TEXT, EMBED_FOOTER_ICON, } = process.env; + const defaultEmbedConfig = { + successColor: EMBED_COLOR_SUCCESS, + waitColor: EMBED_COLOR_WAIT, + errorColor: EMBED_COLOR_ERROR, + footerText: EMBED_FOOTER_TEXT, + footerIcon: EMBED_FOOTER_ICON, + }; + if (!guild) { + return defaultEmbedConfig; + } + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: guild === null || guild === void 0 ? void 0 : guild.ownerId, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: guild.ownerId, + }, + where: { + id: guild.ownerId, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + if (!createGuildMember) { + return defaultEmbedConfig; + } + return { + successColor: createGuildMember.guild.embedColorSuccess, + waitColor: createGuildMember.guild.embedColorWait, + errorColor: createGuildMember.guild.embedColorError, + footerText: createGuildMember.guild.embedFooterText, + footerIcon: createGuildMember.guild.embedFooterIcon, + }; +}); diff --git a/dist/helpers/pluralize/index.js b/dist/helpers/pluralize/index.js new file mode 100644 index 0000000..edeac7e --- /dev/null +++ b/dist/helpers/pluralize/index.js @@ -0,0 +1,11 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.default = (count, noun, suffix) => { + const result = `${count} ${noun}${count !== 1 ? suffix || "s" : ""}`; + logger_1.default === null || logger_1.default === void 0 ? void 0 : logger_1.default.silly(`Pluralized ${count} to ${result}`); + return result; +}; diff --git a/dist/helpers/upsertGuildMember/index.js b/dist/helpers/upsertGuildMember/index.js new file mode 100644 index 0000000..8be93f0 --- /dev/null +++ b/dist/helpers/upsertGuildMember/index.js @@ -0,0 +1,49 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const database_1 = __importDefault(require("../../handlers/database")); +exports.default = (guildMember) => __awaiter(void 0, void 0, void 0, function* () { + const { guild, user } = guildMember; + return yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId: user.id, + guildId: guild.id, + }, + }, + update: {}, + create: { + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + }, + }); +}); diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..9580842 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,38 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const discord_js_1 = require("discord.js"); // discord.js +require("dotenv/config"); +const command_1 = require("./handlers/command"); +const event_1 = require("./handlers/event"); +const schedule_1 = require("./handlers/schedule"); +// Main process that starts all other sub processes +const main = () => __awaiter(void 0, void 0, void 0, function* () { + // Initiate client object + const client = new discord_js_1.Client({ + intents: [ + discord_js_1.GatewayIntentBits.Guilds, + discord_js_1.GatewayIntentBits.GuildMembers, + discord_js_1.GatewayIntentBits.GuildMessages, + discord_js_1.GatewayIntentBits.MessageContent, + ], + }); + // Create command collection + client.commands = new discord_js_1.Collection(); + // Start critical handlers + yield (0, schedule_1.start)(client); + yield (0, event_1.register)(client); + yield (0, command_1.register)(client); + // Authorize with Discord's API + yield client.login(process.env.DISCORD_TOKEN); +}); +// Start main process +main(); diff --git a/dist/interfaces/Command.js b/dist/interfaces/Command.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/interfaces/Command.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/interfaces/EncryptionData.js b/dist/interfaces/EncryptionData.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/interfaces/EncryptionData.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/interfaces/Event.js b/dist/interfaces/Event.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/interfaces/Event.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/interfaces/EventOptions.js b/dist/interfaces/EventOptions.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/interfaces/EventOptions.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/interfaces/Job.js b/dist/interfaces/Job.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/interfaces/Job.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/middlewares/cooldown/index.js b/dist/middlewares/cooldown/index.js new file mode 100644 index 0000000..ce53556 --- /dev/null +++ b/dist/middlewares/cooldown/index.js @@ -0,0 +1,89 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const date_fns_1 = require("date-fns"); +const database_1 = __importDefault(require("../../handlers/database")); +const logger_1 = __importDefault(require("../logger")); +exports.default = (guild, user, id, cooldown, silent) => __awaiter(void 0, void 0, void 0, function* () { + // Check if user has a timeout + const isOnCooldown = yield database_1.default.cooldown.findUnique({ + where: { + guildId_userId_timeoutId: { + guildId: guild.id, + userId: user.id, + timeoutId: id, + }, + }, + }); + logger_1.default.silly(isOnCooldown); + if (isOnCooldown) { + const { userId, timeoutId, createdAt } = isOnCooldown; + const dueDate = (0, date_fns_1.add)(createdAt, { seconds: cooldown }); + const duration = (0, date_fns_1.formatDuration)((0, date_fns_1.intervalToDuration)({ + start: new Date(), + end: dueDate, + })); + if ((0, date_fns_1.isPast)(dueDate)) { + return yield database_1.default.cooldown.delete({ + where: { + guildId_userId_timeoutId: { + guildId: guild.id, + userId: user.id, + timeoutId: id, + }, + }, + }); + } + if (silent) { + return logger_1.default.verbose(`User ${userId} is on cooldown for ${timeoutId}, it ends in ${duration}.`); + } + throw new Error(`You need to wait for ${duration} before you can do that again`); + } + const createCooldown = yield database_1.default.cooldown.upsert({ + where: { + guildId_userId_timeoutId: { + userId: user.id, + guildId: guild.id, + timeoutId: id, + }, + }, + update: {}, + create: { + guild: { + connectOrCreate: { + create: { + id: guild.id, + }, + where: { + id: guild.id, + }, + }, + }, + user: { + connectOrCreate: { + create: { + id: user.id, + }, + where: { + id: user.id, + }, + }, + }, + timeoutId: id, + cooldown, + }, + }); + logger_1.default.silly(createCooldown); + return createCooldown; +}); diff --git a/dist/middlewares/logger/index.js b/dist/middlewares/logger/index.js new file mode 100644 index 0000000..b7686a9 --- /dev/null +++ b/dist/middlewares/logger/index.js @@ -0,0 +1,25 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const winston_1 = __importDefault(require("winston")); +require("winston-daily-rotate-file"); +const { combine, timestamp, printf, errors, colorize, align, json } = winston_1.default.format; +exports.default = winston_1.default.createLogger({ + level: process.env.LOG_LEVEL || "info", + transports: [ + new winston_1.default.transports.DailyRotateFile({ + filename: "logs/combined-%DATE%.log", + datePattern: "YYYY-MM-DD", + maxFiles: "14d", + format: combine(timestamp(), json()), + }), + new winston_1.default.transports.Console({ + format: combine(errors({ stack: true, trace: true }), // <-- use errors format + colorize({ all: true }), timestamp({ + format: "YYYY-MM-DD HH:MM:ss", + }), align(), printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)), + }), + ], +}); diff --git a/dist/schedules/cooldowns/index.js b/dist/schedules/cooldowns/index.js new file mode 100644 index 0000000..437afbe --- /dev/null +++ b/dist/schedules/cooldowns/index.js @@ -0,0 +1,73 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __asyncValues = (this && this.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +/* eslint-disable no-loops/no-loops */ +const date_fns_1 = require("date-fns"); +const database_1 = __importDefault(require("../../handlers/database")); +const logger_1 = __importDefault(require("../../middlewares/logger")); +exports.options = { + schedule: "*/30 * * * *", // https://crontab.guru/ +}; +// Execute the job +const execute = () => __awaiter(void 0, void 0, void 0, function* () { + var _a, e_1, _b, _c; + const cooldownsObj = yield database_1.default.cooldown.findMany(); + try { + for (var _d = true, cooldownsObj_1 = __asyncValues(cooldownsObj), cooldownsObj_1_1; cooldownsObj_1_1 = yield cooldownsObj_1.next(), _a = cooldownsObj_1_1.done, !_a;) { + _c = cooldownsObj_1_1.value; + _d = false; + try { + const cooldownObj = _c; + const { guildId, userId, timeoutId, cooldown, createdAt } = cooldownObj; + const dueDate = (0, date_fns_1.add)(createdAt, { seconds: cooldown }); + if (!(0, date_fns_1.isPast)(dueDate)) + return; + const duration = (0, date_fns_1.formatDuration)((0, date_fns_1.intervalToDuration)({ + start: new Date(), + end: dueDate, + })); + const deleteCooldown = yield database_1.default.cooldown.delete({ + where: { + guildId_userId_timeoutId: { + guildId, + userId, + timeoutId, + }, + }, + }); + logger_1.default.silly(deleteCooldown); + logger_1.default.verbose(`User ${userId} is on cooldown for ${timeoutId}, it ends in ${duration}.`); + } + finally { + _d = true; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_d && !_a && (_b = cooldownsObj_1.return)) yield _b.call(cooldownsObj_1); + } + finally { if (e_1) throw e_1.error; } + } +}); +exports.execute = execute; diff --git a/dist/schedules/shop/index.js b/dist/schedules/shop/index.js new file mode 100644 index 0000000..fb18058 --- /dev/null +++ b/dist/schedules/shop/index.js @@ -0,0 +1,21 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = exports.options = void 0; +const roles_1 = require("./modules/roles"); +exports.options = { + schedule: "*/5 * * * *", // https://crontab.guru/ +}; +// Execute the function +const execute = (client) => __awaiter(void 0, void 0, void 0, function* () { + yield (0, roles_1.execute)(client); +}); +exports.execute = execute; diff --git a/dist/schedules/shop/modules/roles/components/dueForPayment.js b/dist/schedules/shop/modules/roles/components/dueForPayment.js new file mode 100644 index 0000000..b26f837 --- /dev/null +++ b/dist/schedules/shop/modules/roles/components/dueForPayment.js @@ -0,0 +1,13 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = void 0; +const logger_1 = __importDefault(require("../../../../../middlewares/logger")); +// Execute the dueForPayment function +const execute = (_client, role) => { + const { roleId } = role; + logger_1.default.silly(`Shop role ${roleId} is not due for payment.`); +}; +exports.execute = execute; diff --git a/dist/schedules/shop/modules/roles/components/overDueForPayment.js b/dist/schedules/shop/modules/roles/components/overDueForPayment.js new file mode 100644 index 0000000..a63a29e --- /dev/null +++ b/dist/schedules/shop/modules/roles/components/overDueForPayment.js @@ -0,0 +1,124 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = void 0; +const logger_1 = __importDefault(require("../../../../../middlewares/logger")); +const database_1 = __importDefault(require("../../../../../handlers/database")); +// Execute the component +const execute = (client, role) => __awaiter(void 0, void 0, void 0, function* () { + const { guildId, userId, roleId } = role; + if (!userId) + throw new Error("User ID not found for shop role."); + const rGuild = client.guilds.cache.get(guildId); + if (!rGuild) + throw new Error("Guild not found."); + const rMember = yield rGuild.members.fetch(userId); + if (!rMember) + throw new Error("Member not found."); + const rRole = rMember.roles.cache.get(roleId); + if (!rRole) + throw new Error("Role not found."); + logger_1.default.debug(`Shop role ${roleId} is due for payment.`); + const getGuildMember = yield database_1.default.guildMember.findUnique({ + where: { + userId_guildId: { + userId, + guildId, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(getGuildMember); + if (!getGuildMember) + throw new Error("Could not find guild member."); + const pricePerHour = getGuildMember.guild.shopRolesPricePerHour; + if (getGuildMember.creditsEarned < pricePerHour) { + yield rMember.roles + .remove(roleId) + .then(() => __awaiter(void 0, void 0, void 0, function* () { + const deleteShopRole = yield database_1.default.guildShopRoles.delete({ + where: { + guildId_userId_roleId: { + guildId, + userId, + roleId, + }, + }, + }); + logger_1.default.silly(deleteShopRole); + logger_1.default.silly(`Shop role document ${roleId} has been deleted from user ${userId}.`); + })) + .catch(() => { + throw new Error(`Failed removing role from user.`); + }); + throw new Error("User does not have enough credits."); + } + const createGuildMember = yield database_1.default.guildMember.upsert({ + where: { + userId_guildId: { + userId, + guildId, + }, + }, + update: { creditsEarned: { decrement: pricePerHour } }, + create: { + creditsEarned: -pricePerHour, + user: { + connectOrCreate: { + create: { + id: userId, + }, + where: { + id: userId, + }, + }, + }, + guild: { + connectOrCreate: { + create: { + id: guildId, + }, + where: { + id: guildId, + }, + }, + }, + }, + include: { + user: true, + guild: true, + }, + }); + logger_1.default.silly(createGuildMember); + logger_1.default.silly(`User ${userId} has been updated.`); + const updateGuildShopRole = yield database_1.default.guildShopRoles.update({ + where: { + guildId_userId_roleId: { + guildId, + userId, + roleId, + }, + }, + data: { + lastPayed: new Date(), + }, + }); + logger_1.default.silly(updateGuildShopRole); + logger_1.default.silly(`Shop role ${roleId} has been updated.`); + logger_1.default.debug(`Shop role ${roleId} has been paid.`); +}); +exports.execute = execute; diff --git a/dist/schedules/shop/modules/roles/index.js b/dist/schedules/shop/modules/roles/index.js new file mode 100644 index 0000000..060df75 --- /dev/null +++ b/dist/schedules/shop/modules/roles/index.js @@ -0,0 +1,60 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __asyncValues = (this && this.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execute = void 0; +const database_1 = __importDefault(require("../../../../handlers/database")); +const dueForPayment_1 = require("./components/dueForPayment"); +const overDueForPayment_1 = require("./components/overDueForPayment"); +// Execute the roles function +const execute = (client) => __awaiter(void 0, void 0, void 0, function* () { + var _a, e_1, _b, _c; + const roles = yield database_1.default.guildShopRoles.findMany(); + try { + for (var _d = true, roles_1 = __asyncValues(roles), roles_1_1; roles_1_1 = yield roles_1.next(), _a = roles_1_1.done, !_a;) { + _c = roles_1_1.value; + _d = false; + try { + const role = _c; + const { lastPayed } = role; + const nextPayment = new Date(lastPayed.setHours(lastPayed.getHours() + 1)); + const now = new Date(); + if (nextPayment > now) { + (0, dueForPayment_1.execute)(client, role); + return; + } + if (nextPayment < now) { + yield (0, overDueForPayment_1.execute)(client, role); + } + } + finally { + _d = true; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (!_d && !_a && (_b = roles_1.return)) yield _b.call(roles_1); + } + finally { if (e_1) throw e_1.error; } + } +}); +exports.execute = execute;