/** * A rich embed to be sent with a message * @param {Object} [data] Data to set in the rich embed */ class RichEmbed { constructor(data = {}) { /** * Title for this Embed * @type {string} */ this.title = data.title; /** * Description for this Embed * @type {string} */ this.description = data.description; /** * URL for this Embed * @type {string} */ this.url = data.url; /** * Color for this Embed * @type {number} */ this.color = data.color; /** * Author for this Embed * @type {Object} */ this.author = data.author; /** * Timestamp for this Embed * @type {Date} */ this.timestamp = data.timestamp; /** * Fields for this Embed * @type {Object[]} */ this.fields = data.fields || []; /** * Thumbnail for this Embed * @type {Object} */ this.thumbnail = data.thumbnail; /** * Image for this Embed * @type {Object} */ this.image = data.image; /** * Footer for this Embed * @type {Object} */ this.footer = data.footer; } /** * Sets the title of this embed * @param {StringResolvable} title The title * @returns {RichEmbed} This embed */ setTitle(title) { title = resolveString(title); if (title.length > 256) throw new RangeError('RichEmbed titles may not exceed 256 characters.'); this.title = title; return this; } /** * Sets the description of this embed * @param {StringResolvable} description The description * @returns {RichEmbed} This embed */ setDescription(description) { description = resolveString(description); if (description.length > 2048) throw new RangeError('RichEmbed descriptions may not exceed 2048 characters.'); this.description = description; return this; } /** * Sets the URL of this embed * @param {string} url The URL * @returns {RichEmbed} This embed */ setURL(url) { this.url = url; return this; } /** * Sets the color of this embed * @param {string|number|number[]} 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; return this; } /** * Sets the author of this embed * @param {StringResolvable} name The name of the author * @param {string} [icon] The icon URL of the author * @param {string} [url] The URL of the author * @returns {RichEmbed} This embed */ setAuthor(name, icon, url) { this.author = { name: resolveString(name), icon_url: icon, url }; return this; } /** * Sets the timestamp of this embed * @param {Date} [timestamp=current date] The timestamp * @returns {RichEmbed} This embed */ setTimestamp(timestamp = new Date()) { this.timestamp = timestamp; return this; } /** * Adds a field to the embed (max 25) * @param {StringResolvable} name The name of the field * @param {StringResolvable} value The value of the field * @param {boolean} [inline=false] Set the field to display inline * @returns {RichEmbed} This embed */ addField(name, value, inline = false) { if (this.fields.length >= 25) throw new RangeError('RichEmbeds may not exceed 25 fields.'); name = resolveString(name); if (name.length > 256) throw new RangeError('RichEmbed field names may not exceed 256 characters.'); value = resolveString(value); if (value.length > 1024) throw new RangeError('RichEmbed field values may not exceed 1024 characters.'); this.fields.push({ name: String(name), value: value, inline }); return this; } /** * Set the thumbnail of this embed * @param {string} url The URL of the thumbnail * @returns {RichEmbed} This embed */ setThumbnail(url) { this.thumbnail = { url }; return this; } /** * Set the image of this embed * @param {string} url The URL of the thumbnail * @returns {RichEmbed} This embed */ setImage(url) { this.image = { url }; return this; } /** * Sets the footer of this embed * @param {StringResolvable} text The text of the footer * @param {string} [icon] The icon URL of the footer * @returns {RichEmbed} This embed */ setFooter(text, icon) { text = resolveString(text); if (text.length > 2048) throw new RangeError('RichEmbed footer text may not exceed 2048 characters.'); this.footer = { text, icon_url: icon }; return this; } } module.exports = RichEmbed; function resolveString(data) { if (typeof data === 'string') return data; if (data instanceof Array) return data.join('\n'); return String(data); }