UNPKG

cordlr-plugin

Version:

Cordlr plugin core to extend new plugins from.

758 lines (693 loc) 16.1 kB
const hexToDec = require('hex-to-dec') module.exports = class CordlrPlugin { /** * Creates an instance of CordlrPlugin. * * @param {object} bot * @param {object} config * * @memberOf CordlrPlugin */ constructor (bot, config) { this.bot = bot this.config = config } /** * Sends a message reply to the retrieved message * * @param {object} message * @param {string} reply * * @memberOf CordlrPlugin */ sendReply (message, reply) { message.reply(reply) } /** * Sends a reply as a PM to the message author * * @param {object} message * @param {string} reply * * @memberOf CordlrPlugin */ sendPrivateReply (message, reply) { const author = message.author author.sendMessage(reply) } /** * Sends a embed message as a reply to the retrieved message * * @param {object} message * @param {object} embed * * @memberOf CordlrPlugin */ sendEmbed (message, embed) { const channel = message.channel channel.sendEmbed(embed) } /** * Sends a embed containing multiple fields as a response to the channel * * @param {object} message * @param {array} fields * @param {string} [title=null] * @param {object} [footer=null] * * @memberOf CordlrPlugin */ sendFields (message, fields, title = null, footer = null) { const channel = message.channel channel.sendEmbed({ title: title, footer: footer, fields: fields }) } /** * Sends a info embed for warnings, errors and success messages * * @param {object} message * @param {string} info * @param {string} [title='Info'] * @param {object} [footer=null] * @param {string} [type='default'] * * @memberOf CordlrPlugin */ sendInfo (message, info, title = 'Info', footer = null, type = 'default') { const channel = message.channel let color = null switch (type) { case 'warning': color = this.colorToDecimal('#fff83d') break case 'error': color = this.colorToDecimal('#fc5246') break case 'success': color = this.colorToDecimal('#36c17e') break default: color = this.colorToDecimal('#7289DA') } channel.sendEmbed({ title: title, footer: footer, color: color, description: info }) } /** * Returns an embedField * * @param {string} name * @param {string} [value=''] * @param {boolean} [inline=false] * @returns {object} * * @memberOf CordlrPlugin */ embedField (name, value = '', inline = false) { return { name: name, value: value, inline: inline } } /** * Returns an embedAuthor * * @param {string} name * @param {string} [url=null] * @param {string} [icon=null] * @param {string} [proxyIcon=null] * @returns {object} * * @memberOf CordlrPlugin */ embedAuthor (name, url = null, icon = null, proxyIcon = null) { return { name: name, url: url, icon_url: icon, proxy_icon_url: proxyIcon } } /** * Returns an embedFooter * * @param {string} text * @param {string} [icon=null] * @param {string} [proxyIcon=null] * @returns {object} * * @memberOf CordlrPlugin */ embedFooter (text, icon = null, proxyIcon = null) { return { text: text, icon_url: icon, proxy_icon_url: proxyIcon } } /** * Returns an embedProvider * * @param {string} name * @param {string} [url=null] * @returns {object} * * @memberOf CordlrPlugin */ embedProvider (name, url = null) { return { name: name, url: url } } /** * Returns an embedImage * * @param {string} url * @param {string} proxyUrl * @param {number} [height=100] * @param {number} [width=100] * @returns {object} * * @memberOf CordlrPlugin */ embedImage (url, proxyUrl, height = 100, width = 100) { return { url: url, proxy_url: proxyUrl, height: height, width: width } } /** * Returns a videoEmbed * * @param {string} url * @param {number} [height=100] * @param {number} [width=100] * @returns {object} * * @memberOf CordlrPlugin */ embedVideo (url, height = 100, width = 100) { return { url: url, height: height, width: width } } /** * Retrieves roles for the message * * @param {object} message * @returns {array} * * @memberOf CordlrPlugin */ getRoles (message) { const guild = message.guild return guild.roles } /** * Retrieves a role by its name * * @param {object} message * @param {string} name * @returns {object} * * @memberOf CordlrPlugin */ getRoleByName (message, name) { const roles = this.getRoles(message) for (const role of roles) { if (role[1].name === name) { return role } } return false } /** * Retrieves a list of members assigned to a role * * @param {object} message * @param {string} roleName * @returns {array} * * @memberOf CordlrPlugin */ getRoleMembers (message, roleName) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].members } return false } /** * Returns boolean for the permissions checked for a role * * @param {object} message * @param {string} roleName * @param {array} permissions * @param {boolean} [explicit=false] * @returns {boolean} * * @memberOf CordlrPlugin */ roleHasPermissions (message, roleName, permissions, explicit = false) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].hasPermissions(permissions, explicit) } return false } /** * Sets a color to this role * * @param {object} message * @param {string} roleName * @param {string} color * @returns {objectPromise} * * @memberOf CordlrPlugin */ setRoleColor (message, roleName, color) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].setColor(color) } return false } /** * Sets a new name for this role * * @param {object} message * @param {string} roleName * @param {string} newName * @returns {objectPromise} * * @memberOf CordlrPlugin */ setRoleName (message, roleName, newName) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].setName(newName) } return false } /** * Sets the visibility for the role in the sidebar * * @param {object} message * @param {string} roleName * @param {boolean} visible * @returns {objectPromise} * * @memberOf CordlrPlugin */ setRoleVisibility (message, roleName, visible) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].setHoist(visible) } return false } /** * Sets role permissions via array of permission strings * * @param {object} message * @param {string} roleName * @param {array} permissions * @returns {objectPromise} * * @memberOf CordlrPlugin */ setRolePermissions (message, roleName, permissions) { const role = this.getRoleByName(message, roleName) if (role) { return role[1].setPermissions(permissions) } return false } /** * Checks if the bot has a role(s) with the permission * Use it with this.bot.on('ready', () => {}) * * @param {string} permission * @returns {boolean} */ checkBotPermission (permission) { // TODO This does not support multiple server // FIXME This does not support multiple servers const guilds = this.bot.guilds.array() return guilds[0].members.get(this.bot.user.id).hasPermission(permission) } /** * Check if the bot has a role(s) with the permissions * Use it with this.bot.on('ready', () => {}) * * @param {array} permissions * @returns {boolean} */ checkBotPermissions (permissions) { // TODO This does not support multiple server // FIXME This does not support multiple servers const guilds = this.bot.guilds.array() return guilds[0].members.get(this.bot.user.id).hasPermissions(permissions) } /** * Will check and return the missing permissions * Use it with this.bot.on('ready', () => {}) * * @param {array} permissions * @returns {array} missingPermissions */ checkBotMissingPermissions (permissions) { // TODO This does not support multiple server // FIXME This does not support multiple servers const guilds = this.bot.guilds.array() return guilds[0].members.get(this.bot.user.id).missingPermissions(permissions) } /** * Changes the bot clients username * * @param {string} username * @returns {objectPromise} * * @memberOf CordlrPlugin */ botChangeUsername (username) { const client = this.bot.user if (client) { return client.setUsername(username) } return false } /** * Changes the bot clients game * * @param {string} gameTitle * @returns {objectPromise} * * @memberOf CordlrPlugin */ botChangeGame (gameTitle) { const client = this.bot.user if (client) { return client.setGame(gameTitle) } return false } /** * Sets the bot client to AFK * * @param {boolean} [isAfk=false] * @returns {objectPromise} * * @memberOf CordlrPlugin */ botSetAfk (isAfk = false) { const client = this.bot.user if (client) { return client.setAFK(isAfk) } return false } /** * Sets the bots Avatar to Base64 image or a BufferResolvable * * @param {any} avatar * @returns * * @memberOf CordlrPlugin */ botSetAvatar (avatar) { const client = this.bot.user if (client) { return client.setAvatar(avatar) } return false } /** * Converts a hexadecimal color to a decimal integer * * @param {string} color * @returns {int} * * @memberOf CordlrPlugin */ colorToDecimal (color) { const hexValue = color.replace('#', '') return hexToDec(hexValue) } // ------------ Hooks ------------ /** * Emitted whenever a user joins a guild. * * @param {function} callback (member) * * @memberOf CordlrPlugin */ onMemberAdd (callback) { this.bot.on('guildMemberAdd', (member) => { return callback(member) }) } /** * guildMemberRemove * * @param {any} callback */ onMemberRemove (callback) { this.bot.on('guildMemberRemove', (member) => { return callback(member) }) } /** * Emitted whenever a guild member changes - i.e. new role, removed role, nickname * * @param {function} callback (oldMember, newMember) * * @memberOf CordlrPlugin */ onMemberUpdate (callback) { this.bot.on('guildMemberUpdate', (oldMember, newMember) => { return callback(oldMember, newMember) }) } /** * Emitted whenever a guild is updated - e.g. name change. * * @param {function} callback (oldGuild, newGuild) * * @memberOf CordlrPlugin */ onGuildUpdate (callback) { this.bot.on('guildUpdate', (oldGuild, newGuild) => { return callback(oldGuild, newGuild) }) } /** * Emitted whenever a new Direct message * * @param {function} callback (message) * * @memberOf CordlrPlugin */ onDirectMessage (callback) { this.bot.on('message', (message) => { if (message.channel.type === 'dm') { return callback(message) } }) } /** * Emitted whenever a message is deleted * * @param {function} callback (message) * * @memberOf CordlrPlugin */ onMessageDelete (callback) { this.bot.on('messageDelete', (message) => { return callback(message) }) } /** * Emitted whenever a message is updated - e.g. embed or content change. * * @param {function} callback (oldMessage, newMessage) * * @memberOf CordlrPlugin */ onMessageUpdate (callback) { this.bot.on('messageUpdate', (oldMessage, newMessage) => { return callback(oldMessage, newMessage) }) } /** * Emitted whenever a reaction is added to a message. * * @param {function} callback (messageReaction, user) * * @memberOf CordlrPlugin */ onReactionAdded (callback) { this.bot.on('messageReactionAdd', (massageReaction, user) => { return callback(massageReaction, user) }) } /** * Emitted whenever a reaction is removed from a message. * * @param {function} callback (messageReaction, user) * * @memberOf CordlrPlugin */ onReactionRemoved (callback) { this.bot.on('messageReactionRemove', (messageReaction, user) => { return callback(messageReaction, user) }) } /** * Emitted whenever a role is created. * * @param {function} callback (role) * * @memberOf CordlrPlugin */ onRoleCreate (callback) { this.bot.on('roleCreate', (role) => { return callback(role) }) } /** * Emitted whenever a guild role is deleted. * * @param {function} callback (role) * * @memberOf CordlrPlugin */ onRoleDelete (callback) { this.bot.on('roleDelete', (role) => { return callback(role) }) } /** * Emitted whenever a guild role is updated. * * @param {function} callback (oldRole, newRole) * * @memberOf CordlrPlugin */ onRoleUpdate (callback) { this.bot.on('roleUpdate', (oldRole, newRole) => { return callback(oldRole, newRole) }) } /** * Emitted whenever a user's details (e.g. username) are changed. * * @param {function} callback (oldUser, newUser) * * @memberOf CordlrPlugin */ onUserUpdate (callback) { this.bot.on('userUpdate', (oldUser, newUser) => { return callback(oldUser, newUser) }) } /** * Emitted whenever a member is banned from a guild. * * @param {function} callback (guild, user) * * @memberOf CordlrPlugin */ onUserBanned (callback) { this.bot.on('guildBanAdd', (guild, user) => { return callback(guild, user) }) } /** * Emitted whenever a member is unbanned from a guild. * * @param {function} callback (guild, user) * * @memberOf CordlrPlugin */ onUserUnbanned (callback) { this.bot.on('guildBanRemove', (guild, user) => { return callback(guild, user) }) } /** * Emitted whenever the Client encounters a serious connection error * * @param {function} callback (error) * * @memberOf CordlrPlugin */ onError (callback) { this.bot.on('error', (error) => { return callback(error) }) } /** * Emitted whenever a channel is updated - e.g. name change, topic change. * * @param {function} callback (oldChannel, newChannel) * * @memberOf CordlrPlugin */ onChannelUpdate (callback) { this.bot.on('channelUpdate', (oldChannel, newChannel) => { return callback(oldChannel, newChannel) }) } /** * Emitted whenever the pins of a channel are updated. * Due to the nature of the WebSocket event, * not much information can be provided easily here - you need to * manually check the pins yourself. * * @param {function} callback (channel, time) * * @memberOf CordlrPlugin */ onChannelPinsUpdate (callback) { this.bot.on('channelPinsUpdate', (channel, time) => { return callback(channel, time) }) } /** * Emitted whenever a channel is deleted. * * @param {function} callback (channel) * * @memberOf CordlrPlugin */ onChannelDelete (callback) { this.bot.on('channelDelete', (channel) => { return callback(channel) }) } /** * Emitted whenever a channel is created. * * @param {function} callback (channel) * * @memberOf CordlrPlugin */ onChannelAdded (callback) { this.bot.on('channelCreate', (channel) => { return callback(channel) }) } }