UNPKG

discord-reactions-roles

Version:

A simple and powerful module for adding a reaction role system to your discord.js project

217 lines (216 loc) 7.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Utils = void 0; // Import requirements const discord_emojis_parser_1 = __importDefault(require("discord-emojis-parser")); const discord_message_parser_1 = require("discord-message-parser"); const discord_js_1 = require("discord.js"); class Utils { reactionsRoles; /** * @constructor * * @param {ReactionsRoles} reactionsRoles Reaction Roles Class */ constructor(reactionsRoles) { /** * Reactions Roles Class * * @type {ReactionsRoles} * @private */ this.reactionsRoles = reactionsRoles; } /** * Method for checking module configuration * * @param {Options} options Module options * * @returns {Options} Valid module configuration */ fetchOptions(options) { if (!options) { options = { deleteOldMenus: false, deleteOldMenusReactions: true, database: { name: "reactions_roles", path: "./" } }; } else { if (typeof options?.deleteOldMenus != "boolean") options.deleteOldMenus = false; if (typeof options?.deleteOldMenusReactions != "boolean") options.deleteOldMenusReactions = true; if (!options.database || typeof options.database != "object") { options.database = { name: "reactions_roles", path: "./" }; } else { if (!options.database.name || typeof options.database.name != "string") options.database.name = "reactions_roles"; if (!options.database.path || typeof options.database.path != "string") options.database.path = "./"; } } return options; } /** * Method for checking client intents * * @private */ fetchIntents() { const defaultIntents = [ discord_js_1.GatewayIntentBits.Guilds, discord_js_1.GatewayIntentBits.GuildMembers, discord_js_1.GatewayIntentBits.GuildMessages, discord_js_1.GatewayIntentBits.GuildMessageReactions ]; const clientIntents = new discord_js_1.IntentsBitField(this.reactionsRoles.client.options.intents); for (const intent of defaultIntents) { if (!clientIntents.has(intent)) throw new Error(`Missing required client intent: '${discord_js_1.GatewayIntentBits[intent]}'!`); } } /** * Method for checking client partials * * @private */ fetchPartials() { const defaultPartials = [ discord_js_1.Partials.Message, discord_js_1.Partials.Reaction, discord_js_1.Partials.User ]; const clientPartials = this.reactionsRoles.client.options.partials; for (const partial of defaultPartials) { if (!clientPartials.includes(partial)) throw new Error(`Missing required client partial: '${discord_js_1.Partials[partial]}'!`); } } /** * Method for parsing emoji content * * @param {string} guildID Discord Guild ID * @param {string} data Emoji content * * @returns {ParsedEmoji} Content parsing data */ parseEmoji(guildID, data) { const guild = this.reactionsRoles.client.guilds.cache.get(guildID); if (!guild) throw new Error(`Unknown guild with id '${guildID}'!`); let parsed; const guildEmoji = guild.emojis.cache.find(e => `<${e.animated ? "a" : ""}:${e.name}:${e.id}>` === data); if (data.startsWith("<") && data.endsWith(">")) { const parseData = discord_message_parser_1.EmojiParser.parseEmojis(data); parsed = { id: guildEmoji?.id ?? null, name: guildEmoji?.name ?? null, raw: parseData.allEmojis[0]?.raw ?? null, isValid: guildEmoji ? true : parseData.allEmojis[0]?.raw ? parseData.allEmojis[0].raw.includes("<") ? false : true : false, unicode: parseData.allEmojis[0]?.unicode ?? null, animated: parseData.allEmojis[0]?.animated ?? null }; } else { const parseData = discord_emojis_parser_1.default.parse(data); parsed = { id: guildEmoji?.id ?? null, name: guildEmoji?.name ?? null, raw: parseData[0]?.unicode ?? null, isValid: parseData.length ? true : false, unicode: parseData.length ? true : false, animated: false }; } return parsed; } /** * A method for getting a text channel * * @param {string} guildID Discord Guild ID * @param {string} channelID Discord Guild Channel ID * * @returns {Promise<TextChannel>} Guild Text Channel */ getChannel(guildID, channelID) { return new Promise(async (res, rej) => { const guild = this.reactionsRoles.client.guilds.cache.get(guildID); if (!guild) return rej(new Error(`Unknown guild with ID '${guildID}'!`)); let channel; try { channel = guild.channels.cache.get(channelID); if (!channel) channel = (await guild.channels.fetch(channelID)); } catch (error) { return res(null); } return res(channel); }); } /** * Method for receiving a message on a specified channel * * @param {string} guildID Discord Guild ID * @param {string} channelID Discord Guild Channel ID * @param {string} messageID Discord Guild Message ID * * @returns {Promise<Message>} Discord Guild Message */ getMessage(guildID, channelID, messageID) { return new Promise(async (res, rej) => { const guild = this.reactionsRoles.client.guilds.cache.get(guildID); if (!guild) return rej(new Error(`Unknown guild with ID '${guildID}'!`)); let message; try { const channel = await this.getChannel(guildID, channelID); message = channel.messages.cache.get(messageID); if (!message) message = (await channel.messages.fetch(messageID)); } catch (error) { return res(null); } return res(message); }); } /** * A method to get the server member * * @param {string} guildID Discord Guild ID * @param {string} userID Discord User ID * * @returns {Promise<GuildMember>} Guild Member Data */ getMember(guildID, userID) { return new Promise(async (res, rej) => { const guild = this.reactionsRoles.client.guilds.cache.get(guildID); if (!guild) return rej(new Error(`Unknown guild with ID '${guildID}'!`)); let member; try { member = guild.members.cache.get(userID); if (!member) member = (await guild.members.fetch(userID)); } catch (error) { return res(null); } return res(member); }); } } exports.Utils = Utils;