Webhook
unknown
javascript
5 months ago
42 kB
3
Indexable
/** * @typedef {Object} WebhookData * @property {string} url - The URL of the webhook. * @property {number} threadId - The ID of the thread. */ /** * @typedef {Object} WebhookUser * @property {string} username - The username of the user. * @property {string} avatarUrl - The URL of the user's avatar. */ /** * @typedef {Object} EmbedTitle * @property {string} title - The title of the embed. * @property {string} url - The URL of the embed. */ /** * @typedef {Object} EmbedAuthor * @property {string} name - The name of the author. * @property {string} url - The URL of the author. * @property {string} iconUrl - The URL of the author's icon. */ /** * @typedef {Object} EmbedFooter * @property {string} text - The text of the footer. * @property {string} iconUrl - The URL of the footer's icon. */ /** * @typedef {Object} MessageMentions * @property {String[]} parse - The types of mentions to parse. * @property {String[]} roles - The roles mentioned. * @property {String[]} users - The users mentioned. */ /** * @typedef {Object} Callback * @property {Function} edit - Function to edit the callback. * @property {Function} getOriginalMessageJSON - Function to get the original message JSON. * @property {Function} getOriginalMessage - Function to get the original message. */ /** * @property {Message} message - The message to send. * @property {WebhookUser} user - The user of the webhook. * @property {WebhookData} webhookData - The data for the webhook. */ class Webhook { /** * Creates the webhook object * @param {WebhookData} webhookData * @param {WebhookUser} [user=null] * @param {Message} [message=null] */ constructor(webhookData, user = null, message=null) { this.webhookData = webhookData; this.user = user; this.message = message; } /** * Exeute the webhook and send the message. * @param {Callback} callback * @param {Message} [tMessage=null] * @returns {Callback} The callback oject for further chaining. * @throws {TypeError} - If no webhook URL or message is provided. * @throws {RangeError} - If the number of embeds or the total length of the embeds exceeds the limits. * @throws {Error} - If there are permission issues or unknown errors while editing the message. */ execute(callback, tMessage = null) { if (this.webhookData.url == undefined || this.webhookData.url == null) throw new TypeError(`No webhook url was provided.`); let messageToUse = tMessage || this.message; if (!messageToUse) throw new TypeError(`No message for the webhook to send was provided.`); let message = messageToUse; let payload = { username: this.user?.username || null, avatar_url: this.user?.avatarUrl || null, content: message.content || null, tts: message.tts || false, allowed_mentions: message.allowedMentions, embeds: message.embeds ? message.embeds.map(embed => embed.toObject()) : [] }; if (payload.embeds.length > 10) throw new RangeError(`You can only have a maximum of 10 embeds in a message.`); let totalLength = payload.embeds.reduce((acc, embed) => { let embedLength = (embed.title ?.title.length || 0) + (embed.description?.description.length || 0) + (embed.footer ?.footer.text.length || 0) + (embed.author ?.author.name.length || 0); if (embed.fields) { embed.fields.forEach(field => { embedLength += field.name.length + field.value.length; }); } return acc + embedLength; }, 0); if (totalLength > 6000) throw new RangeError(`The total length of the embeds exceeds the maximum of 6000 characters.`); let url = this.webhookData.url + `?wait=true` + (this.webhookData.threadId ? `&thread_id=${this.webhookData.threadId}` : ''); let params = { headers: { "Content-Type": "application/json" }, method: "POST", payload: JSON.stringify(payload), muteHttpExceptions: true }; let firstResp = UrlFetchApp.fetch(url, params); /** * The callback object that is returned to the user and previously executed in the method provided. * @type {Callback} * */ let responseHandler = { /** * Edit the orginal message that was sent by the webhook. * This is a followup, meaning you can only edit the ONE message that was just sent by the webhook. * @param {Message} message2 * @throws {TypeError} If no message is provided. * @throws {RangeError} If the number of embeds or the total length of the embeds exceeds the limits. * @throws {Error} If there are permission issues or unknown errors while editing the message. * @returns {Object} The JSON response from the Discord API. * */ edit: (message2) => { let cont = firstResp.getContentText(); let json = JSON.parse(cont); if (json.code === 50013) throw new Error(`Missing permissions to edit the message.`); if (json.code === 10008) throw new Error(`Unknown message.`); if (json.code === 50006) throw new Error(`Cannot edit a message authored by another user.`); if (json.code === 50007) throw new Error(`Cannot send an empty message.`); let editUrl = this.webhookData.url + `/messages/${json.id}` + (this.webhookData.threadId ? `&thread_id=${this.webhookData.threadId}` : ''); if (message2 === undefined || message2 === null) throw new TypeError(`No message for the webhook to send was provided, when attempting to edit the original webhook message.`); let payload = { username: message2.user ? this.user.username : undefined, avatar_url: this.user ? this.user.avatarUrl : undefined, content: message2.content, tts: message2.tts, allowed_mentions: message2.allowedMentions, embeds: message2.embeds ? message2.embeds.map(embed => embed.toObject()) : [] }; if (payload.embeds.length > 10) throw new RangeError(`You can only have a maximum of 10 embeds in a message.`); let totalLength = payload.embeds.reduce((acc, embed) => { let embedLength = (embed.title ? embed.title.length : 0) + (embed.description ? embed.description.length : 0) + (embed.footer ? embed.footer.text.length : 0) + (embed.author ? embed.author.name.length : 0); if (embed.fields) { embed.fields.forEach(field => { embedLength += field.name.length + field.value.length; }); } return acc + embedLength; }, 0); if (totalLength > 6000) throw new RangeError(`The total length of the embeds exceeds the maximum of 6000 characters.`); let params = { headers: { "Content-Type": "application/json" }, method: "PATCH", payload: JSON.stringify(payload), muteHttpExceptions: true }; let response = UrlFetchApp.fetch(editUrl, params); return JSON.parse(response.getContentText()); }, /** * Get the original message that was sent by the webhook. * @returns {Object} The JSON response from the Discord API. */ getOriginalMessageJSON: () => { return JSON.parse(firstResp.getContentText()); }, /** * Get the original message that was sent by the webhook. * @returns {Message} The original message that was sent by the webhook. */ getOriginalMessage() { return message; }, /** * * @param {Callback} callback * @param {Message} newM * * @returns {Callback} The callback object for further chaining. */ followUp: (callback, newM) => { return this.execute(callback, newM); } } if (callback && typeof callback === 'function') { callback(responseHandler); } return responseHandler; } /** * Set a message that should be sent with the webhook. This will al * @param {Message} message The message to provide to the webhook. * @throws {TypeError} If the message is not an instance of Message. * @returns {Boolean} True if there was no override of the message, false if there was. * @see Webhook#execute in order to send the message and post it to discord. */ setMessage(message) { _WebUtlity.checkInstance(message, 'Message'); if(this.message == undefined || this.message == null) { this.message = message; return true; } else { this.message = message; return false; } } /** * Clears the message of the webhook. */ clearMessage() { delete this.message; this.message = null; } /** * Set the user of the webhook. * @param {WebhookUser} user The user of the webhook. * @throws {TypeError} If the user is not an instance of WebhookUser. */ setUser(user) { _WebUtlity.checkInstance(user, 'WebhookUser'); this.user = user; } /** * Clears the user of the webhook and falls back to the default one configured in the webhook integration setting within discord */ clearUser() { delete this.user; } } /** * Message object that includes important message data such as content and embeds. * @property {String} _content The message text content. Maximum character length is 2000. * @property {Embed[]} embeds The embeds of the message. Maximum of 10 embeds. * @property {Boolean} tts Whether the message should be a TTS message. * @property {MessageMentions} allowedMentions The allowed mentions of the message. */ class Message { /** * @param {String} cont The message text content. Maximum character length is 2000. * @throws {TypeError} If the content length exceeds 2000. */ set content(cont) { if (cont.length > 2000) throw new TypeError(`Message content is limited to a maximum of 2000 characters. ${cont.length} characters is too long.`); this._content = cont; } get content() { return this._content || null; } /** * @param {...Embed} embeds * @throws {TypeError} If the embeds are not valid Eg. wrong class. * @throws {RangeError} If the amounts of embeds are more than 10. */ addEmbeds(...embeds) { embeds.forEach(embed => { if (!_WebUtlity.isValidEmbed(embed)) throw new TypeError(`Invalid Embed instance provided. The object provided is not an instance of the embed class.`) }); if(this.embeds == undefined || this.embeds == null) this.embeds = embeds; else { this.embeds = this.embeds.concat(embeds); } if (this.embeds.length > 10) throw new RangeError(`You can only have a maximum of 10 embeds in a message.`); } /** * Clears the embeds of the message. */ clearEmbeds() { delete this.embeds; } /** * Set the TTS of the message. * @param {Boolean} tts Whether Text to speech should be enabled or not. Default is false (disabled) * @throws {TypeError} If the TTS is not a boolean. */ setTTS(tts = false) { if (typeof tts !== 'boolean') throw new TypeError(`TTS must be a boolean.`); this.tts = tts; } /** * * 0 - Roles * 1 - Users * 2 - Everyone * You may use Mentions.ROLES, Mentions.USERS, Mentions.EVERYONE to specify the mention types. * Note that providing * * @param {...Number} number */ allowMentionTypes(...number) { let allowed = [0, 1, 2]; number.forEach(num => { if (!allowed.includes(num)) throw new TypeError(`Invalid mention type provided. The mention type provided is not valid.`); }); if (this.allowedMentions == undefined) this.allowedMentions = { parse: [], roles: [], users: [] }; if (number.includes(0) && !this.allowedMentions.parse.includes('roles')) this.allowedMentions.parse.push('roles'); if (number.includes(1) && !this.allowedMentions.parse.includes('users')) this.allowedMentions.parse.push('users'); if (number.includes(2) && !this.allowedMentions.parse.includes('everyone')) this.allowedMentions.parse.push('everyone'); } /** * Roles you wish to be allowed to mention in the message. * @param {...Number} roles */ setMentionRoles(...roles) { if (roles) if (this.allowedMentions == undefined) this.allowedMentions = { parse: [], roles: [], users: [] }; if (this.allowedMentions.parse.includes('roles')) { this.allowedMentions.parse = this.allowedMentions.parse.filter(mention => mention !== 'roles'); } this.allowedMentions.roles.concat(roles); } /** * Roles you wish to be allowed to mention in the message. * @param {...Number} users */ setMentionUsers(...users) { if (users) if (this?.allowedMentions) this.allowedMentions = { parse: [], roles: [], users: [] }; if (this.allowedMentions.parse.includes('users')) { this.allowedMentions.parse = this.allowedMentions.parse.filter(mention => mention !== 'users'); } this.allowedMentions.users.concat(users); } /** * Clears the allowed mentions of the message. */ clearMentions() { delete this.allowedMentions; this.allowedMentions = null; } } class Mentions { } Mentions.ROLES = 0; Mentions.USERS = 1; Mentions.EVERYONE = 2; /** * Embed object that can create embeds, when later using the build() function * @typedef {class} Embed * @property {Number} color The color of the embed. * @property {EmbedAuthor} author The author of the embed. * @property {EmbedTitle} title The title of the embed. * @property {String} description * @property {Embed.Field[]} fields The fields of the embed. * @property {String} thumbnail The thumbnail url of the embed. * @property {String} image The image ur of the embed. * @property {EmbedFooter} footer The footer of the embed. * @property {Date} timestamp The date at the bottom of the embed. */ class Embed { /** * @param {Embed} embed Optional embed (NOT THE ONE THAT WAS BUILT) as parameter in case the embed needs to be edited. */ static from(embed) { if (embed == undefined) return new Embed(); else return embed; } /** * Set the color by supplying an instance of new Color() * @param {Number} color instance of Color, will throw an error if its not an instance of Color. * * @return {Embed} This instance for easier chaining. * * @throws {TypeError} If the color is undefined or null. */ setColor(color) { if (color === undefined || color === null) throw new TypeError(`Color cannot be empty.`); this.color = color; return this; } /** * Allows you to set the author of the embed. * @param {EmbedAuthor} author The icon url of placed in the footer. * * @return {Embed} This instance for easier chaining. */ setAuthor(author) { if (author == null || author == undefined) throw TypeError("Author cannot be empty/Null"); if (author.name == null || author.name == undefined) throw Error("Author name cannot be empty/Null"); if (author.name.length > 256) throw RangeError("Author name is limited to a maximum of 256 characters."); this.author = author; return this; } /** * Set the title and the url of the url if needed. * @param {EmbedTitle} embedTitle The title of the embed. * @throws {TypeError} If the title is undefined or null. * @throws {RangeError} If the title exceeds the maximum character length of 256. * @return {Embed} This instance for easier chaining. */ setTitle(embedTitle) { if (embedTitle == undefined || embedTitle == null) throw new TypeError("Title cannot be empty."); if (embedTitle.title.length > 256) throw new RangeError(`Title is limited to a maximum of 256 characters. ${embedTitle.title.length} characters is too long.`); this.title = embedTitle; return this; } /** * Get the title and title url of the embed. * @return {EmbedTitle} The title of the embed. Or null if no title is set. */ getTitle() { return this.title || null; } /** * Set the description of the embed. * @param {String} description The title of the embed. * * @return {Embed} This instance for easier chaining. * * @throws {TypeError} If the description is undefined or null. * @throws {RangeError} If the description exceeds the maximum character length of 4096. */ setDescription(description) { if (description == undefined || description == null || description == "") throw new TypeError("Description cannot be empty."); if (description.length > 4096) throw new RangeError(`Description is limited to a maximum of 4096 characters. ${description.length} characters is too long.`); return this; } /** * Get the description of the embed. * @return {String} The description of the embed. Or null if no description is set. */ getDescription() { return this.description || null; } /** * Adds multiple fields to the embed with the help of Field instances. * @param {...Embed.Field} fields An array of field instances. * * @return {Embed} This instance for easier chaining. * * @throws {TypeError} If the fields are not instances of Field. * @throws {RangeError} If the amount of fields exceeds 25. */ addFields(...fields) { fields.forEach(field => { if (!(field instanceof Embed.Field)) throw TypeError(`Invalid Embed Field instance provided. The object provided is not an instance of the Embed.Field class.`); }); if(this.fields == undefined) this.fields = fields; else { this.fields = this.fields.concat(fields); } if (this.fields.length > 25) throw RangeError(`You can only have a maximum of 25 fields in an embed.`); return this; } /** * Get the fields of the embed. * @return {Embed.Field[]} The fields of the embed. Or null if no fields are set. */ getFields() { return this.fields || null; } /** * Set the timestamp of the embed. * @param {Date} date A date, will then be converted to an ISO string that counts as valid embed timestamp. * * @return {Embed} This instance for easier chaining. */ setTimestamp(date) { if (!(date instanceof Date)) throw Error("Invalid Date instance."); this.timestamp = date; return this; } /** * Get the timestamp of the embed in form of a date. * @returns {Date} The timestamp of the embed. */ getTimestamp() { return this.timestamp || null; } /** * Adds an image to the embed. You can add up to 4 images if you add more embeds with the same title and a different image. * @param {string} url The url of the image. * * @return {Embed} This instance for easier chaining. * * @throws {TypeError} If the url is undefined or null. */ setImage(url) { if (url == null || url == undefined) throw Error("Image url cannot be empty/Null"); this.image = url; return this; } /** * @returns {String} The url of the image. */ getImage() { return this.image || null; } /** * Adds a thumbnail to the embed. * @param {string} url The url of the thumbnail. * * @return {Embed} This instance for easier chaining. */ setThumbnail(url) { if (url == null || url == undefined) throw Error("Thumbnail url cannot be empty/Null"); this.thumbnail = url; return this; } /** * Adds a thumbnail to the embed. * @return {String} The url of the thumbnail. */ getThumbnail() { return this.thumbnail || null; } /** * Allows you to add a blank field. * @param {inline} url The url of the thumbnail. * * @return {Embed} This instance for easier chaining. */ addBlankField(inline) { if (this.hasOwnProperty('fields')) this.fields.push(new Embed.Field('\u200b', '\u200b', inline)); else this.fields = [new Embed.Field(undefined, undefined, inline)]; } /** * Allows you to set the footer of the embed. * @param {EmbedFooter} footer Set the footer of the embed. * * @return {Embed} This instance for easier chaining. * * @throws {TypeError} If the text is empty/null. * @throws {RangeError} If the text exceeds the maximum character length of 2048. */ setFooter(footer) { if (footer == undefined || footer == null) throw Error("Footer cannot be empty/Null"); if (footer.text == undefined || footer.text == null || footer.text == "") throw Error("Footer text cannot be empty/Null"); if (footer.text.length > 2048) throw RangeError("Footer text is limited to a maximum of 2048 characters."); this.footer = footer; return this; } toObject() { let embed = {}; if (this.color != undefined && this.color != null) embed.color = this.color; if (this.title != undefined && this.title != null) embed.title = this.title.title; if (this.author != undefined && this.author != null) { embed.author = {}; if (this.author.name != undefined && this.author.name != null) embed.author.name = this.author.name; if (this.author.url != undefined && this.author.url != null) embed.author.url = this.author.url; if (this.author.iconUrl != undefined && this.author.iconUrl != null) embed.author.icon_url = this.author.iconUrl; } if (this.description != undefined && this.description != null) embed.description = this.description; if (this.title != undefined && this.title != null && this.title.url != undefined && this.title.url != null) embed.url = this.title.url; if (this.fields != undefined && this.fields != null) { if(embed.fields == undefined) embed.fields = []; this.fields.forEach(field => embed.fields.push({name: field.name, value: field.value, inline: field.inline})); } if (this.thumbnail != undefined && this.thumbnail != null) embed.thumbnail = { url: this.thumbnail}; if (this.image != undefined && this.image != null) embed.image = { url: this.image }; if (this.footer != undefined && this.footer != null) { embed.footer = {}; if (this.footer.text != undefined && this.footer.text != null) embed.footer.text = this.footer.text; if (this.footer.iconUrl != undefined && this.footer.iconUrl != null) embed.footer.icon_url = this.footer.iconUrl; } if (this.timestamp != undefined && this.timestamp != null) embed.timestamp = this.timestamp.toISOString(); return embed; } /** * Builds the embed. The object returned is the only valid argument to provide to the webhook. */ toJSON() { let json = JSON.stringify(this.toObject()); //let temp = JSON.parse(json); return json; } } /** * Embed field * @property {String} name The name/title of the field. * @property {String} value The value of the field. * @property {Boolean} inline Whether the field is inline or not. */ Embed.Field = class Field { /** * Providing undefined causes the name or value to be blank using a special Unicode character \u200b * @param {String} name The name/title of the field. Maximum of 256 characters. * @param {String} value The value of the field. Maximum of 1024 characters. * @param {Boolean} inline Whether the field is inline or not. Invalid values such as null cause auto-default to false. * * @throws {RangeError} If name or value exceeds their maximum character length. */ constructor(name, value, inline) { if (name == undefined || name == null) name = '\u200b'; if (value == undefined || value == null) value = '\u200b'; if (name.length > 256) throw new RangeError(`Field names are limited to a maximum of 256 characters. ${name.length} characters is too long.`); if (value.length > 1024) throw new RangeError(`Field values are limited to a maximum of 1024 characters. ${name.length} characters is too long.`); if (inline == null) inline = false; this._name = name; this._value = value; this.inline = Boolean(inline); } /** * Set the field name/title * @param {string} name The name/title of the field. Maximum of 256 characters. * @throws {RangeError} If name or value exceeds their maximum character length. */ set name(name) { if (name.length > 256) throw new RangeError(`Field names are limited to a maximum of 256 characters. ${name.length} characters is too long.`); this._name = name; } /** * Get the field name/title * @returns {string} The name/title of the field. */ get name() { return this._name; } /** * Set the field value * @param {string} value The value of the field. Maximum of 1024 characters. * @throws {TypeError} If name or value exceeds their maximum character length. */ set value(value) { if (value.length > 1024) throw new TypeError(`Field values are limited to a maximum of 1024 characters. ${value.length} characters is too long.`); this._value = value; } /** * Get the field value * @returns {string} The value of the field. */ get value() { return this._value; } } class _WebUtlity { /** * Checks if the object is an instance of Embed and if it is not undefined or null * @param {Embed} object The object to check. */ static isValidEmbed(object) { if (object != null && object != undefined && object instanceof Embed) return true; else return false; } /** * @param {Object} object * @param {String} className * @throws {TypeError} If the object is not an instance of the specified class. */ static checkInstance(object, className) { if (object === null || object === undefined || object.constructor.name !== className) { throw new TypeError(`Expected an instance of ${className}, but got ${typeof object}`); } } } class Color { /** * @param {number} red - The red component (0-255) Default is 0. * @param {number} green - The green component (0-255) Default is 0. * @param {number} blue - The blue component (0-255) Default is 0. * @returns {number} The decimal representation of the color. */ static fromRGB(red = 0, green = 0, blue = 0) { let value = ((red << 16) | (green << 8) | blue); return value; } /** * @param {Number} raw The raw decimal number you want to provide. Hex is also allowed * @throws {TypeError} If no raw decimal number is provided. */ static raw(raw = 0x000000) { if (raw === undefined) return raw; } } /** @type {number} The decimal representation of the color aliceblue. */ Color.ALICEBLUE = 15792383; /** @type {number} The decimal representation of the color antiquewhite. */ Color.ANTIQUEWHITE = 16444375; /** @type {number} The decimal representation of the color aqua. */ Color.AQUA = 65535; /** @type {number} The decimal representation of the color aquamarine. */ Color.AQUAMARINE = 8388564; /** @type {number} The decimal representation of the color azure. */ Color.AZURE = 15794175; /** @type {number} The decimal representation of the color beige. */ Color.BEIGE = 16119260; /** @type {number} The decimal representation of the color bisque. */ Color.BISQUE = 16770244; /** @type {number} The decimal representation of the color black. */ Color.BLACK = 0; /** @type {number} The decimal representation of the color blanchedalmond. */ Color.BLANCHEDALMOND = 16772045; /** @type {number} The decimal representation of the color blue. */ Color.BLUE = 255; /** @type {number} The decimal representation of the color blueviolet. */ Color.BLUEVIOLET = 9055202; /** @type {number} The decimal representation of the color brown. */ Color.BROWN = 10824234; /** @type {number} The decimal representation of the color burlywood. */ Color.BURLYWOOD = 14596231; /** @type {number} The decimal representation of the color cadetblue. */ Color.CADETBLUE = 6266528; /** @type {number} The decimal representation of the color chartreuse. */ Color.CHARTREUSE = 8388352; /** @type {number} The decimal representation of the color chocolate. */ Color.CHOCOLATE = 13789470; /** @type {number} The decimal representation of the color coral. */ Color.CORAL = 16744272; /** @type {number} The decimal representation of the color cornflowerblue. */ Color.CORNFLOWERBLUE = 6591981; /** @type {number} The decimal representation of the color cornsilk. */ Color.CORNSILK = 16775388; /** @type {number} The decimal representation of the color crimson. */ Color.CRIMSON = 14423100; /** @type {number} The decimal representation of the color cyan. */ Color.CYAN = 65535; /** @type {number} The decimal representation of the color darkblue. */ Color.DARKBLUE = 139; /** @type {number} The decimal representation of the color darkcyan. */ Color.DARKCYAN = 35723; /** @type {number} The decimal representation of the color darkgoldenrod. */ Color.DARKGOLDENROD = 12092939; /** @type {number} The decimal representation of the color darkgray. */ Color.DARKGRAY = 11119017; /** @type {number} The decimal representation of the color darkgreen. */ Color.DARKGREEN = 25600; /** @type {number} The decimal representation of the color darkgrey. */ Color.DARKGREY = 11119017; /** @type {number} The decimal representation of the color darkkhaki. */ Color.DARKKHAKI = 12433259; /** @type {number} The decimal representation of the color darkmagenta. */ Color.DARKMAGENTA = 9109643; /** @type {number} The decimal representation of the color darkolivegreen. */ Color.DARKOLIVEGREEN = 5597999; /** @type {number} The decimal representation of the color darkorange. */ Color.DARKORANGE = 16747520; /** @type {number} The decimal representation of the color darkorchid. */ Color.DARKORCHID = 10040012; /** @type {number} The decimal representation of the color darkred. */ Color.DARKRED = 9109504; /** @type {number} The decimal representation of the color darksalmon. */ Color.DARKSALMON = 15308410; /** @type {number} The decimal representation of the color darkseagreen. */ Color.DARKSEAGREEN = 9419919; /** @type {number} The decimal representation of the color darkslateblue. */ Color.DARKSLATEBLUE = 4734347; /** @type {number} The decimal representation of the color darkslategray. */ Color.DARKSLATEGRAY = 3100495; /** @type {number} The decimal representation of the color darkslategrey. */ Color.DARKSLATEGREY = 3100495; /** @type {number} The decimal representation of the color darkturquoise. */ Color.DARKTURQUOISE = 52945; /** @type {number} The decimal representation of the color darkviolet. */ Color.DARKVIOLET = 9699539; /** @type {number} The decimal representation of the color deeppink. */ Color.DEEPPINK = 16716947; /** @type {number} The decimal representation of the color deepskyblue. */ Color.DEEPSKYBLUE = 49151; /** @type {number} The decimal representation of the color dimgray. */ Color.DIMGRAY = 6908265; /** @type {number} The decimal representation of the color dimgrey. */ Color.DIMGREY = 6908265; /** @type {number} The decimal representation of the color dodgerblue. */ Color.DODGERBLUE = 2003199; /** @type {number} The decimal representation of the color firebrick. */ Color.FIREBRICK = 11674146; /** @type {number} The decimal representation of the color floralwhite. */ Color.FLORALWHITE = 16775920; /** @type {number} The decimal representation of the color forestgreen. */ Color.FORESTGREEN = 2263842; /** @type {number} The decimal representation of the color fuchsia. */ Color.FUCHSIA = 16711935; /** @type {number} The decimal representation of the color gainsboro. */ Color.GAINSBORO = 14474460; /** @type {number} The decimal representation of the color ghostwhite. */ Color.GHOSTWHITE = 16316671; /** @type {number} The decimal representation of the color gold. */ Color.GOLD = 16766720; /** @type {number} The decimal representation of the color goldenrod. */ Color.GOLDENROD = 14329120; /** @type {number} The decimal representation of the color gray. */ Color.GRAY = 8421504; /** @type {number} The decimal representation of the color green. */ Color.GREEN = 32768; /** @type {number} The decimal representation of the color greenyellow. */ Color.GREENYELLOW = 11403055; /** @type {number} The decimal representation of the color grey. */ Color.GREY = 8421504; /** @type {number} The decimal representation of the color honeydew. */ Color.HONEYDEW = 15794160; /** @type {number} The decimal representation of the color hotpink. */ Color.HOTPINK = 16738740; /** @type {number} The decimal representation of the color indianred. */ Color.INDIANRED = 13458524; /** @type {number} The decimal representation of the color indigo. */ Color.INDIGO = 4915330; /** @type {number} The decimal representation of the color ivory. */ Color.IVORY = 16777200; /** @type {number} The decimal representation of the color khaki. */ Color.KHAKI = 15787660; /** @type {number} The decimal representation of the color lavender. */ Color.LAVENDER = 15132410; /** @type {number} The decimal representation of the color lavenderblush. */ Color.LAVENDERBLUSH = 16773365; /** @type {number} The decimal representation of the color lawngreen. */ Color.LAWNGREEN = 8190976; /** @type {number} The decimal representation of the color lemonchiffon. */ Color.LEMONCHIFFON = 16775885; /** @type {number} The decimal representation of the color lightblue. */ Color.LIGHTBLUE = 11393254; /** @type {number} The decimal representation of the color lightcoral. */ Color.LIGHTCORAL = 15761536; /** @type {number} The decimal representation of the color lightcyan. */ Color.LIGHTCYAN = 14745599; /** @type {number} The decimal representation of the color lightgoldenrodyellow. */ Color.LIGHTGOLDENRODYELLOW = 16448210; /** @type {number} The decimal representation of the color lightgray. */ Color.LIGHTGRAY = 13882323; /** @type {number} The decimal representation of the color lightgreen. */ Color.LIGHTGREEN = 9498256; /** @type {number} The decimal representation of the color lightgrey. */ Color.LIGHTGREY = 13882323; /** @type {number} The decimal representation of the color lightpink. */ Color.LIGHTPINK = 16758465; /** @type {number} The decimal representation of the color lightsalmon. */ Color.LIGHTSALMON = 16752762; /** @type {number} The decimal representation of the color lightseagreen. */ Color.LIGHTSEAGREEN = 2142890; /** @type {number} The decimal representation of the color lightskyblue. */ Color.LIGHTSKYBLUE = 8900346; /** @type {number} The decimal representation of the color lightslategray. */ Color.LIGHTSLATEGRAY = 7833753; /** @type {number} The decimal representation of the color lightslategrey. */ Color.LIGHTSLATEGREY = 7833753; /** @type {number} The decimal representation of the color lightsteelblue. */ Color.LIGHTSTEELBLUE = 11584734; /** @type {number} The decimal representation of the color lightyellow. */ Color.LIGHTYELLOW = 16777184; /** @type {number} The decimal representation of the color lime. */ Color.LIME = 65280; /** @type {number} The decimal representation of the color limegreen. */ Color.LIMEGREEN = 3329330; /** @type {number} The decimal representation of the color linen. */ Color.LINEN = 16445670; /** @type {number} The decimal representation of the color magenta. */ Color.MAGENTA = 16711935; /** @type {number} The decimal representation of the color maroon. */ Color.MAROON = 8388608; /** @type {number} The decimal representation of the color mediumaquamarine. */ Color.MEDIUMAQUAMARINE = 6737322; /** @type {number} The decimal representation of the color mediumblue. */ Color.MEDIUMBLUE = 205; /** @type {number} The decimal representation of the color mediumorchid. */ Color.MEDIUMORCHID = 12211667; /** @type {number} The decimal representation of the color mediumpurple. */ Color.MEDIUMPURPLE = 9662683; /** @type {number} The decimal representation of the color mediumseagreen. */ Color.MEDIUMSEAGREEN = 3978097; /** @type {number} The decimal representation of the color mediumslateblue. */ Color.MEDIUMSLATEBLUE = 8087790; /** @type {number} The decimal representation of the color mediumspringgreen. */ Color.MEDIUMSPRINGGREEN = 64154; /** @type {number} The decimal representation of the color mediumturquoise. */ Color.MEDIUMTURQUOISE = 4772300; /** @type {number} The decimal representation of the color mediumvioletred. */ Color.MEDIUMVIOLETRED = 13047173; /** @type {number} The decimal representation of the color midnightblue. */ Color.MIDNIGHTBLUE = 1644912; /** @type {number} The decimal representation of the color mintcream. */ Color.MINTCREAM = 16121850; /** @type {number} The decimal representation of the color mistyrose. */ Color.MISTYROSE = 16770273; /** @type {number} The decimal representation of the color moccasin. */ Color.MOCCASIN = 16770229; /** @type {number} The decimal representation of the color navajowhite. */ Color.NAVAJOWHITE = 16768685; /** @type {number} The decimal representation of the color navy. */ Color.NAVY = 128; /** @type {number} The decimal representation of the color oldlace. */ Color.OLDLACE = 16643558; /** @type {number} The decimal representation of the color olive. */ Color.OLIVE = 8421376; /** @type {number} The decimal representation of the color olivedrab. */ Color.OLIVEDRAB = 7048739; /** @type {number} The decimal representation of the color orange. */ Color.ORANGE = 16753920; /** @type {number} The decimal representation of the color orangered. */ Color.ORANGERED = 16729344; /** @type {number} The decimal representation of the color orchid. */ Color.ORCHID = 14315734; /** @type {number} The decimal representation of the color palegoldenrod. */ Color.PALEGOLDENROD = 15657130; /** @type {number} The decimal representation of the color palegreen. */ Color.PALEGREEN = 10025880; /** @type {number} The decimal representation of the color paleturquoise. */ Color.PALETURQUOISE = 11529966; /** @type {number} The decimal representation of the color palevioletred. */ Color.PALEVIOLETRED = 14381203; /** @type {number} The decimal representation of the color papayawhip. */ Color.PAPAYAWHIP = 16773077; /** @type {number} The decimal representation of the color peachpuff. */ Color.PEACHPUFF = 16767673; /** @type {number} The decimal representation of the color peru. */ Color.PERU = 13468991; /** @type {number} The decimal representation of the color pink. */ Color.PINK = 16761035; /** @type {number} The decimal representation of the color plum. */ Color.PLUM = 14524637; /** @type {number} The decimal representation of the color powderblue. */ Color.POWDERBLUE = 11591910; /** @type {number} The decimal representation of the color purple. */ Color.PURPLE = 8388736; /** @type {number} The decimal representation of the color rebeccapurple. */ Color.REBECCAPURPLE = 6697881; /** @type {number} The decimal representation of the color red. */ Color.RED = 16711680; /** @type {number} The decimal representation of the color rosybrown. */ Color.ROSYBROWN = 12357519; /** @type {number} The decimal representation of the color royalblue. */ Color.ROYALBLUE = 4286945; /** @type {number} The decimal representation of the color saddlebrown. */ Color.SADDLEBROWN = 9127187; /** @type {number} The decimal representation of the color salmon. */ Color.SALMON = 16416882; /** @type {number} The decimal representation of the color sandybrown. */ Color.SANDYBROWN = 16032864; /** @type {number} The decimal representation of the color seagreen. */ Color.SEAGREEN = 3050327; /** @type {number} The decimal representation of the color seashell. */ Color.SEASHELL = 16774638; /** @type {number} The decimal representation of the color sienna. */ Color.SIENNA = 10506797; /** @type {number} The decimal representation of the color silver. */ Color.SILVER = 12632256; /** @type {number} The decimal representation of the color skyblue. */ Color.SKYBLUE = 8900331; /** @type {number} The decimal representation of the color slateblue. */ Color.SLATEBLUE = 6970061; /** @type {number} The decimal representation of the color slategray. */ Color.SLATEGRAY = 7372944; /** @type {number} The decimal representation of the color slategrey. */ Color.SLATEGREY = 7372944; /** @type {number} The decimal representation of the color snow. */ Color.SNOW = 16775930; /** @type {number} The decimal representation of the color springgreen. */ Color.SPRINGGREEN = 65407; /** @type {number} The decimal representation of the color steelblue. */ Color.STEELBLUE = 4620980; /** @type {number} The decimal representation of the color tan. */ Color.TAN = 13808780; /** @type {number} The decimal representation of the color teal. */ Color.TEAL = 32896; /** @type {number} The decimal representation of the color thistle. */ Color.THISTLE = 14204888; /** @type {number} The decimal representation of the color tomato. */ Color.TOMATO = 16737095; /** @type {number} The decimal representation of the color turquoise. */ Color.TURQUOISE = 4251856; /** @type {number} The decimal representation of the color violet. */ Color.VIOLET = 15631086; /** @type {number} The decimal representation of the color wheat. */ Color.WHEAT = 16113331; /** @type {number} The decimal representation of the color white. */ Color.WHITE = 16777215; /** @type {number} The decimal representation of the color whitesmoke. */ Color.WHITESMOKE = 16119285; /** @type {number} The decimal representation of the color yellow. */ Color.YELLOW = 16776960; /** @type {number} The decimal representation of the color yellowgreen. */ Color.YELLOWGREEN = 10145074;
Editor is loading...
Leave a Comment