From 0d4eab8d241e770cbea065688ccf85aa93fe07d1 Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Thu, 12 Jan 2017 12:43:22 -0600 Subject: [PATCH] add color resolvable, and color constants from the client (#1080) * add color resolvable, and color constants from the client * fix up docs * Update ClientDataResolver.js * add easter eggs * Update ClientDataResolver.js * Update RESTMethods.js --- src/client/ClientDataResolver.js | 115 +++++++++++++++++++++++-------- src/client/rest/RESTMethods.js | 5 +- src/structures/RichEmbed.js | 19 ++--- src/structures/Role.js | 2 +- src/util/Constants.js | 28 ++++++++ 5 files changed, 122 insertions(+), 47 deletions(-) diff --git a/src/client/ClientDataResolver.js b/src/client/ClientDataResolver.js index c6bf38717..73d4961c2 100644 --- a/src/client/ClientDataResolver.js +++ b/src/client/ClientDataResolver.js @@ -163,33 +163,33 @@ class ClientDataResolver { * Possible strings: * ```js * [ - * "CREATE_INSTANT_INVITE", - * "KICK_MEMBERS", - * "BAN_MEMBERS", - * "ADMINISTRATOR", - * "MANAGE_CHANNELS", - * "MANAGE_GUILD", - * "ADD_REACTIONS", // add reactions to messages - * "READ_MESSAGES", - * "SEND_MESSAGES", - * "SEND_TTS_MESSAGES", - * "MANAGE_MESSAGES", - * "EMBED_LINKS", - * "ATTACH_FILES", - * "READ_MESSAGE_HISTORY", - * "MENTION_EVERYONE", - * "EXTERNAL_EMOJIS", // use external emojis - * "CONNECT", // connect to voice - * "SPEAK", // speak on voice - * "MUTE_MEMBERS", // globally mute members on voice - * "DEAFEN_MEMBERS", // globally deafen members on voice - * "MOVE_MEMBERS", // move member's voice channels - * "USE_VAD", // use voice activity detection - * "CHANGE_NICKNAME", - * "MANAGE_NICKNAMES", // change nicknames of others - * "MANAGE_ROLES_OR_PERMISSIONS", - * "MANAGE_WEBHOOKS", - * "MANAGE_EMOJIS" + * 'CREATE_INSTANT_INVITE', + * 'KICK_MEMBERS', + * 'BAN_MEMBERS', + * 'ADMINISTRATOR', + * 'MANAGE_CHANNELS', + * 'MANAGE_GUILD', + * 'ADD_REACTIONS', // add reactions to messages + * 'READ_MESSAGES', + * 'SEND_MESSAGES', + * 'SEND_TTS_MESSAGES', + * 'MANAGE_MESSAGES', + * 'EMBED_LINKS', + * 'ATTACH_FILES', + * 'READ_MESSAGE_HISTORY', + * 'MENTION_EVERYONE', + * 'EXTERNAL_EMOJIS', // use external emojis + * 'CONNECT', // connect to voice + * 'SPEAK', // speak on voice + * 'MUTE_MEMBERS', // globally mute members on voice + * 'DEAFEN_MEMBERS', // globally deafen members on voice + * 'MOVE_MEMBERS', // move member's voice channels + * 'USE_VAD', // use voice activity detection + * 'CHANGE_NICKNAME', + * 'MANAGE_NICKNAMES', // change nicknames of others + * 'MANAGE_ROLES_OR_PERMISSIONS', + * 'MANAGE_WEBHOOKS', + * 'MANAGE_EMOJIS' * ] * ``` * @typedef {string|number} PermissionResolvable @@ -317,6 +317,67 @@ class ClientDataResolver { } return null; } + + /** + * Can be a Hex Literal, Hex String, Number, RGB Array, or one of the following + * ``` + * [ + * 'DEFAULT', + * 'AQUA', + * 'GREEN', + * 'BLUE', + * 'PURPLE', + * 'GOLD', + * 'ORANGE', + * 'RED', + * 'GREY', + * 'DARKER_GREY', + * 'NAVY', + * 'DARK_AQUA', + * 'DARK_GREEN', + * 'DARK_BLUE', + * 'DARK_PURPLE', + * 'DARK_GOLD', + * 'DARK_ORANGE', + * 'DARK_RED', + * 'DARK_GREY', + * 'LIGHT_GREY', + * 'DARK_NAVY', + * ] + * ``` + * or something like + * ``` + * [255, 0, 255] + * ``` + * for purple + * @typedef {String|number|Array} ColorResolvable + */ + + /** + * @param {ColorResolvable} color Color to resolve + * @returns {number} A color + */ + static resolveColor(color) { + if (typeof color === 'string') { + color = Constants.Colors[color] || parseInt(color.replace('#', ''), 16); + } else if (color instanceof Array) { + color = (color[0] << 16) + (color[1] << 8) + color[2]; + } + if (color < 0 || color > 0xFFFFFF) { + throw new RangeError('Color must be within the range 0 - 16777215 (0xFFFFFF).'); + } else if (color && isNaN(color)) { + throw new TypeError('Unable to convert color to a number.'); + } + return color; + } + + /** + * @param {ColorResolvable} color Color to resolve + * @returns {number} A color + */ + resolveColor(color) { + return ClientDataResolver.resolveColor(color); + } } module.exports = ClientDataResolver; diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index e0e91366c..414959582 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -459,10 +459,7 @@ class RESTMethods { const data = {}; data.name = _data.name || role.name; data.position = typeof _data.position !== 'undefined' ? _data.position : role.position; - data.color = _data.color || role.color; - if (typeof data.color === 'string' && data.color.startsWith('#')) { - data.color = parseInt(data.color.replace('#', ''), 16); - } + data.color = this.client.resolver.resolveColor(_data.color || role.color); data.hoist = typeof _data.hoist !== 'undefined' ? _data.hoist : role.hoist; data.mentionable = typeof _data.mentionable !== 'undefined' ? _data.mentionable : role.mentionable; diff --git a/src/structures/RichEmbed.js b/src/structures/RichEmbed.js index 268fa31d8..c8c504fb1 100644 --- a/src/structures/RichEmbed.js +++ b/src/structures/RichEmbed.js @@ -1,3 +1,5 @@ +const ClientDataResolver = require('../client/ClientDataResolver'); + /** * A rich embed to be sent with a message with a fluent interface for creation * @param {Object} [data] Data to set in the rich embed @@ -101,24 +103,11 @@ class RichEmbed { /** * Sets the color of this embed - * @param {string|number|number[]} color The color to set + * @param {ColorResolvable} color The color to set * @returns {RichEmbed} This embed */ setColor(color) { - let radix = 10; - if (color instanceof Array) { - color = (color[0] << 16) + (color[1] << 8) + color[2]; - } else if (typeof color === 'string' && color.startsWith('#')) { - radix = 16; - color = color.replace('#', ''); - } - color = parseInt(color, radix); - if (color < 0 || color > 0xFFFFFF) { - throw new RangeError('RichEmbed color must be within the range 0 - 16777215 (0xFFFFFF).'); - } else if (color && isNaN(color)) { - throw new TypeError('Unable to convert RichEmbed color to a number.'); - } - this.color = color; + this.color = ClientDataResolver.resolveColor(color); return this; } diff --git a/src/structures/Role.js b/src/structures/Role.js index 329a2264c..92759b552 100644 --- a/src/structures/Role.js +++ b/src/structures/Role.js @@ -180,7 +180,7 @@ class Role { * The data for a role * @typedef {Object} RoleData * @property {string} [name] The name of the role - * @property {number|string} [color] The color of the role, either a hex string or a base 10 number + * @property {ColorResolvable} [color] The color of the role, either a hex string or a base 10 number * @property {boolean} [hoist] Whether or not the role should be hoisted * @property {number} [position] The position of the role * @property {string[]} [permissions] The permissions of the role diff --git a/src/util/Constants.js b/src/util/Constants.js index bb02b3705..5d9d7fecc 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -368,6 +368,34 @@ const PermissionFlags = exports.PermissionFlags = { MANAGE_EMOJIS: 1 << 30, }; +exports.Colors = { + DEFAULT: 0x000000, + AQUA: 0x1ABC9C, + GREEN: 0x2ECC71, + BLUE: 0x3498DB, + PURPLE: 0x9B59B6, + GOLD: 0xF1C40F, + ORANGE: 0xE67E22, + RED: 0xE74C3C, + GREY: 0x95A5A6, + NAVY: 0x34495E, + DARK_AQUA: 0x11806A, + DARK_GREEN: 0x1F8B4C, + DARK_BLUE: 0x206694, + DARK_PURPLE: 0x71368A, + DARK_GOLD: 0xC27C0E, + DARK_ORANGE: 0xA84300, + DARK_RED: 0x992D22, + DARK_GREY: 0x979C9F, + DARKER_GREY: 0x7F8C8D, + LIGHT_GREY: 0xBCC0C0, + DARK_NAVY: 0x2C3E50, + BLURPLE: 0x7289DA, + GREYPLE: 0x99AAB5, + DARK_BUT_NOT_BLACK: 0x2C2F33, + NOT_QUITE_BLACK: 0x23272A, +}; + let _ALL_PERMISSIONS = 0; for (const key in PermissionFlags) _ALL_PERMISSIONS |= PermissionFlags[key]; exports.ALL_PERMISSIONS = _ALL_PERMISSIONS;