From 8688dbac8ccc44e73ce42f6d18ae845d5d4af159 Mon Sep 17 00:00:00 2001 From: March 7th <71698422+aiko-chan-ai@users.noreply.github.com> Date: Mon, 11 Apr 2022 12:53:02 +0700 Subject: [PATCH] 1.3.1 - Update Document - Fix WebEmbed - Fix MessagePayload - Clear warn "Accessing non-existent property inside a circular dependency" (Pull #26) --- DOCUMENT.md | 5 + Document/ClientOption.md | 14 + Document/Guild.md | 19 + Document/HTTPOption.md | 7 +- Document/Message.md | 7 +- Document/User.md | 19 +- package.json | 2 +- src/structures/MessagePayload.js | 1 + src/structures/WebEmbed.js | 579 +++++++++++++++++-------------- typings/index.d.ts | 3 + 10 files changed, 369 insertions(+), 287 deletions(-) diff --git a/DOCUMENT.md b/DOCUMENT.md index 2d09529..55465bf 100644 --- a/DOCUMENT.md +++ b/DOCUMENT.md @@ -4,6 +4,11 @@ # [Risky actions](https://github.com/Merubokkusu/Discord-S.C.U.M/issues/66) # Quick links +- [ClientOption](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/ClientOption.md) +- [HTTPOption](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/HTTPOption.md) +- [Guild](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Guild.md) +- [Message](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Message.md) +- [User](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md) ## More features diff --git a/Document/ClientOption.md b/Document/ClientOption.md index fa073d6..f495065 100644 --- a/Document/ClientOption.md +++ b/Document/ClientOption.md @@ -1,3 +1,7 @@ +# Quick Links +- [Client Option](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/ClientOption.md#client-settings) +- [Client Functions](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/ClientOption.md#client-functions) + ## Client Settings ```js new Client({ @@ -5,4 +9,14 @@ new Client({ readyStatus: false, // Set Custom Status sync from Account (Bot Ready) [Disable Default] autoCookie: true, // Auto added Cookie and Fingerprint [Enable Default](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/DOCUMENT.md#http-options) }) +``` + +## Client Functions +- Update Cookie and Fingerprint +```js +client.updateCookie(): Promise +``` +- Reddem Nitro +```js +client.reddemNitro('code'): Promise ``` \ No newline at end of file diff --git a/Document/Guild.md b/Document/Guild.md index f540875..baa60c9 100644 --- a/Document/Guild.md +++ b/Document/Guild.md @@ -1,3 +1,9 @@ +# Quick Links: +- [Set Guild Folder and Position](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Guild.md#discord-guild-set-position) +- [DM group](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Guild.md#group-dm) +- [Join Guild](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Guild.md#join-guild-using-invite) +- [Community](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Guild.md#set-community)) + ## Discord Guild set position
Click to show @@ -64,3 +70,16 @@ await client.fetchInvite('code').then(async invite => { But if you are blocked by HCaptcha, this will not work
+ +## Set Community +
+Click to show + +```js +await guild.setCommunity(stats: boolean, publicUpdatesChannel: TextChannelResolvable, rulesChannel: TextChannelResolvable, reason?: string): Promise; +// Enable with default +await guild.setCommunity(true); +// Disable +await guild.setCommunity(false); +``` +
\ No newline at end of file diff --git a/Document/HTTPOption.md b/Document/HTTPOption.md index 1d7f6c1..80fd13f 100644 --- a/Document/HTTPOption.md +++ b/Document/HTTPOption.md @@ -1,5 +1,5 @@ ## HTTP options: - +- Change API v9 to v10 ```js /* If you want to change the API version from v9 to v10, here are the instructions */ const { Client } = require('discord.js-selfbot-v13'); @@ -14,9 +14,4 @@ const client = new Client({ } } }); -/* Discord fingerprint ??? idk ... */ -/** - * const { data } = await axios.get('https://discord.com/api/v9/experiments'); - * client.options.http.header['x-fingerprint'] = data.fingerprint - */ ``` \ No newline at end of file diff --git a/Document/Message.md b/Document/Message.md index 0324561..6d16081 100644 --- a/Document/Message.md +++ b/Document/Message.md @@ -1,3 +1,7 @@ +# Quick Links: +- [Interaction](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Message.md#interaction) +- [Embed](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/Message.md#messageembed-) + ## Interaction
Button Click @@ -86,8 +90,9 @@ message.channel.send({ content: `Hello world`, embeds: [w] }) // Patched :) ``` ### Features & Issues -- No Timestamp, Footer, Thumbnail (but embed video, thumbnail working), Fields, Author iconURL +- No Timestamp, Footer, Fields, Author iconURL - Video with Embed working +- Can only choose between image and thumbnail - Description limit 350 characters - If you use hidden mode you must make sure your custom content is less than 1000 characters without nitro (because hidden mode uses 1000 characters + URL) diff --git a/Document/User.md b/Document/User.md index 85d0129..c7f67b6 100644 --- a/Document/User.md +++ b/Document/User.md @@ -1,3 +1,10 @@ +# Quick Links: +- [Setting](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md#user-settings) +- [User Info](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md#discord-user-info) +- [Relationship](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md#discord-user-friend--blocked) +- [Rich Presence](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md#custom-status-and-rpc) +- [Other](https://github.com/aiko-chan-ai/discord.js-selfbot-v13/blob/main/Document/User.md#user--clientuser-method) + ## User Settings
Click to show @@ -221,15 +228,7 @@ await client.user.setPassword('old password', 'new password'); await client.user.disableAccount('password'); // Delete Account [WARNING] Cannot be changed once used! await client.user.deleteAccount('password'); -``` -
- - -## Reddem Nitro ? -
-Click to show - -```js +// Reddem Nitro await client.reddemNitro('code') ``` -
+
\ No newline at end of file diff --git a/package.json b/package.json index d209468..c52de34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord.js-selfbot-v13", - "version": "1.3.0", + "version": "1.3.1", "description": "A unofficial discord.js fork for creating selfbots [Based on discord.js v13]", "main": "./src/index.js", "types": "./typings/index.d.ts", diff --git a/src/structures/MessagePayload.js b/src/structures/MessagePayload.js index 2a0596a..1521d30 100644 --- a/src/structures/MessagePayload.js +++ b/src/structures/MessagePayload.js @@ -200,6 +200,7 @@ class MessagePayload { this.options.embeds = this.options.embeds.filter(e => e instanceof MessageEmbed); if (webembeds.length > 0) { + if (!content) content = ''; // add hidden embed link content += `\n${WebEmbed.hiddenEmbed} \n`; if (webembeds.length > 1) { diff --git a/src/structures/WebEmbed.js b/src/structures/WebEmbed.js index ec9a9c6..d76d91b 100644 --- a/src/structures/WebEmbed.js +++ b/src/structures/WebEmbed.js @@ -1,301 +1,342 @@ 'use strict'; const axios = require('axios'); -const baseURL = 'https://embed.benny.fun/?'; +const baseURL = 'https://sagiri-fansub.tk/embed?'; const hiddenCharter = '||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||||​||'; const { RangeError } = require('../errors'); const Util = require('../util/Util'); class WebEmbed { - constructor(data = {}) { - this._setup(data); - /** - * Shorten the link - * @type {?boolean} - */ - this.shorten = data.shorten ?? true; + constructor(data = {}) { + this._setup(data); + /** + * Shorten the link + * @type {?boolean} + */ + this.shorten = data.shorten ?? true; + /** + * Hidden Embed link + * @type {?boolean} + */ + this.hidden = data.hidden ?? false; + } + _setup(data) { /** - * Hidden Embed link - * @type {?boolean} + * Type image of this embed + * @type {?thumbnail | image} */ - this.hidden = data.hidden ?? false; - } - _setup(data) { - /** - * The title of this embed - * @type {?string} - */ - this.title = data.title ?? null; + this.imageType = 'thumbnail'; + /** + * The title of this embed + * @type {?string} + */ + this.title = data.title ?? null; - /** - * The description of this embed - * @type {?string} - */ - this.description = data.description ?? null; + /** + * The description of this embed + * @type {?string} + */ + this.description = data.description ?? null; - /** - * The URL of this embed - * @type {?string} - */ - this.url = data.url ?? null; + /** + * The URL of this embed + * @type {?string} + */ + this.url = data.url ?? null; - /** - * The color of this embed - * @type {?number} - */ - this.color = 'color' in data ? Util.resolveColor(data.color) : null; + /** + * The color of this embed + * @type {?number} + */ + this.color = 'color' in data ? Util.resolveColor(data.color) : null; - /** - * Represents the image of a MessageEmbed - * @typedef {Object} MessageEmbedImage - * @property {string} url URL for this image - * @property {string} proxyURL ProxyURL for this image - * @property {number} height Height of this image - * @property {number} width Width of this image - */ + /** + * Represents the image of a MessageEmbed + * @typedef {Object} MessageEmbedImage + * @property {string} url URL for this image + * @property {string} proxyURL ProxyURL for this image + * @property {number} height Height of this image + * @property {number} width Width of this image + */ - /** - * The image of this embed, if there is one - * @type {?MessageEmbedImage} - */ - this.image = data.image - ? { - url: data.image.url, - proxyURL: data.image.proxyURL ?? data.image.proxy_url, - height: data.image.height, - width: data.image.width, - } - : null; + /** + * The image of this embed, if there is one + * @type {?MessageEmbedImage} + */ + this.image = data.image + ? { + url: data.image.url, + proxyURL: data.image.proxyURL ?? data.image.proxy_url, + height: data.image.height, + width: data.image.width, + } + : null; - /** - * Represents the video of a MessageEmbed - * @typedef {Object} MessageEmbedVideo - * @property {string} url URL of this video - * @property {string} proxyURL ProxyURL for this video - * @property {number} height Height of this video - * @property {number} width Width of this video - */ + /** + * The thumbnail of this embed (if there is one) + * @type {?MessageEmbedThumbnail} + */ + this.thumbnail = data.thumbnail + ? { + url: data.thumbnail.url, + proxyURL: data.thumbnail.proxyURL ?? data.thumbnail.proxy_url, + height: data.thumbnail.height, + width: data.thumbnail.width, + } + : null; - /** - * The video of this embed (if there is one) - * @type {?MessageEmbedVideo} - * @readonly - */ - this.video = data.video - ? { - url: data.video.url, - proxyURL: data.video.proxyURL ?? data.video.proxy_url, - height: data.video.height, - width: data.video.width, - } - : null; + /** + * Represents the video of a MessageEmbed + * @typedef {Object} MessageEmbedVideo + * @property {string} url URL of this video + * @property {string} proxyURL ProxyURL for this video + * @property {number} height Height of this video + * @property {number} width Width of this video + */ - /** - * Represents the author field of a MessageEmbed - * @typedef {Object} MessageEmbedAuthor - * @property {string} name The name of this author - * @property {string} url URL of this author - * @property {string} iconURL URL of the icon for this author - * @property {string} proxyIconURL Proxied URL of the icon for this author - */ + /** + * The video of this embed (if there is one) + * @type {?MessageEmbedVideo} + * @readonly + */ + this.video = data.video + ? { + url: data.video.url, + proxyURL: data.video.proxyURL ?? data.video.proxy_url, + height: data.video.height, + width: data.video.width, + } + : null; - /** - * The author of this embed (if there is one) - * @type {?MessageEmbedAuthor} - */ - this.author = data.author - ? { - name: data.author.name, - url: data.author.url, - } - : null; + /** + * Represents the author field of a MessageEmbed + * @typedef {Object} MessageEmbedAuthor + * @property {string} name The name of this author + * @property {string} url URL of this author + * @property {string} iconURL URL of the icon for this author + * @property {string} proxyIconURL Proxied URL of the icon for this author + */ - /** - * Represents the provider of a MessageEmbed - * @typedef {Object} MessageEmbedProvider - * @property {string} name The name of this provider - * @property {string} url URL of this provider - */ + /** + * The author of this embed (if there is one) + * @type {?MessageEmbedAuthor} + */ + this.author = data.author + ? { + name: data.author.name, + url: data.author.url, + } + : null; - /** - * The provider of this embed (if there is one) - * @type {?MessageEmbedProvider} - */ - this.provider = data.provider - ? { - name: data.provider.name, - url: data.provider.name, - } - : null; - } - /** - * The options to provide for setting an author for a {@link MessageEmbed}. - * @typedef {Object} EmbedAuthorData - * @property {string} name The name of this author. - */ + /** + * Represents the provider of a MessageEmbed + * @typedef {Object} MessageEmbedProvider + * @property {string} name The name of this provider + * @property {string} url URL of this provider + */ - /** - * Sets the author of this embed. - * @param {string|EmbedAuthorData|null} options The options to provide for the author. - * Provide `null` to remove the author data. - * @returns {MessageEmbed} - */ - setAuthor(options) { - if (options === null) { - this.author = {}; - return this; + /** + * The provider of this embed (if there is one) + * @type {?MessageEmbedProvider} + */ + this.provider = data.provider + ? { + name: data.provider.name, + url: data.provider.name, + } + : null; + } + /** + * The options to provide for setting an author for a {@link MessageEmbed}. + * @typedef {Object} EmbedAuthorData + * @property {string} name The name of this author. + */ + + /** + * Sets the author of this embed. + * @param {string|EmbedAuthorData|null} options The options to provide for the author. + * Provide `null` to remove the author data. + * @returns {MessageEmbed} + */ + setAuthor(options) { + if (options === null) { + this.author = {}; + return this; + } + const { name, url } = options; + this.author = { + name: Util.verifyString(name, RangeError, 'EMBED_AUTHOR_NAME'), + url, + }; + return this; + } + + /** + * The options to provide for setting an provider for a {@link MessageEmbed}. + * @typedef {Object} EmbedProviderData + * @property {string} name The name of this provider. + */ + + /** + * Sets the provider of this embed. + * @param {string|EmbedProviderData|null} options The options to provide for the provider. + * Provide `null` to remove the provider data. + * @returns {MessageEmbed} + */ + setProvider(options) { + if (options === null) { + this.provider = {}; + return this; + } + const { name, url } = options; + this.provider = { + name: Util.verifyString(name, RangeError, 'EMBED_PROVIDER_NAME'), + url, + }; + return this; + } + + /** + * Sets the color of this embed. + * @param {ColorResolvable} color The color of the embed + * @returns {MessageEmbed} + */ + setColor(color) { + this.color = Util.resolveColor(color); + return this; + } + + /** + * Sets the description of this embed. + * @param {string} description The description (Limit 350 characters) + * @returns {MessageEmbed} + */ + setDescription(description) { + this.description = Util.verifyString( + description, + RangeError, + 'EMBED_DESCRIPTION', + ); + return this; + } + + /** + * Sets the image of this embed. + * @param {string} url The URL of the image + * @returns {MessageEmbed} + */ + setImage(url) { + if (this.thumbnail.url) { + console.warn('You can only set image or thumbnail per embed.'); + this.thumbnail.url = null; + this.imageType = 'image'; + } + this.image = { url }; + return this; + } + + /** + * Sets the thumbnail of this embed. + * @param {string} url The URL of the image + * @returns {MessageEmbed} + */ + setThumbnail(url) { + if (this.image.url) { + console.warn('You can only set image or thumbnail per embed.'); + this.image.url = null; + this.imageType = 'thumbnail'; } - const { name, url } = options; - this.author = { - name: Util.verifyString(name, RangeError, 'EMBED_AUTHOR_NAME'), - url, - }; - return this; - } + this.thumbnail = { url }; + return this; + } - /** - * The options to provide for setting an provider for a {@link MessageEmbed}. - * @typedef {Object} EmbedProviderData - * @property {string} name The name of this provider. - */ + /** + * Sets the video of this embed. + * @param {string} url The URL of the video + * @returns {MessageEmbed} + */ + setVideo(url) { + this.video = { url }; + return this; + } - /** - * Sets the provider of this embed. - * @param {string|EmbedProviderData|null} options The options to provide for the provider. - * Provide `null` to remove the provider data. - * @returns {MessageEmbed} - */ - setProvider(options) { - if (options === null) { - this.provider = {}; - return this; - } - const { name, url } = options; - this.provider = { - name: Util.verifyString(name, RangeError, 'EMBED_PROVIDER_NAME'), - url, - }; - return this; - } + /** + * Sets the title of this embed. + * @param {string} title The title + * @returns {MessageEmbed} + */ + setTitle(title) { + this.title = Util.verifyString(title, RangeError, 'EMBED_TITLE'); + return this; + } - /** - * Sets the color of this embed. - * @param {ColorResolvable} color The color of the embed - * @returns {MessageEmbed} - */ - setColor(color) { - this.color = Util.resolveColor(color); - return this; - } + /** + * Sets the URL of this embed. + * @param {string} url The URL + * @returns {MessageEmbed} + */ + setURL(url) { + this.url = url; + return this; + } - /** - * Sets the description of this embed. - * @param {string} description The description (Limit 350 characters) - * @returns {MessageEmbed} - */ - setDescription(description) { - this.description = Util.verifyString( - description, - RangeError, - 'EMBED_DESCRIPTION', - ); - return this; - } - - /** - * Sets the image of this embed. - * @param {string} url The URL of the image - * @returns {MessageEmbed} - */ - setImage(url) { - this.image = { url }; - return this; - } - - /** - * Sets the video of this embed. - * @param {string} url The URL of the video - * @returns {MessageEmbed} - */ - setVideo(url) { - this.video = { url }; - return this; - } - - /** - * Sets the title of this embed. - * @param {string} title The title - * @returns {MessageEmbed} - */ - setTitle(title) { - this.title = Util.verifyString(title, RangeError, 'EMBED_TITLE'); - return this; - } - - /** - * Sets the URL of this embed. - * @param {string} url The URL - * @returns {MessageEmbed} - */ - setURL(url) { - this.url = url; - return this; - } - - /** - * Return Message Content + Embed (if hidden, pls check content length because it has 1000+ length) - * @returns {string} Message Content - */ - async toMessage() { - const arrayQuery = []; - if (this.title) { - arrayQuery.push(`title=${encodeURIComponent(this.title)}`); + /** + * Return Message Content + Embed (if hidden, pls check content length because it has 1000+ length) + * @returns {string} Message Content + */ + async toMessage() { + const arrayQuery = [`image_type=${this.imageType}`]; + if (this.title) { + arrayQuery.push(`title=${encodeURIComponent(this.title)}`); + } + if (this.description) { + arrayQuery.push(`description=${encodeURIComponent(this.description)}`); + } + if (this.url) { + arrayQuery.push(`url=${encodeURIComponent(this.url)}`); + } + if (this.color) { + arrayQuery.push( + `color=${encodeURIComponent('#' + this.color.toString(16))}`, + ); + } + if (this.image?.url) { + arrayQuery.push(`image=${encodeURIComponent(this.image.url)}`); + } + if (this.video?.url) { + arrayQuery.push(`video=${encodeURIComponent(this.video.url)}`); + } + if (this.author) { + if (this.author.name) + arrayQuery.push(`author_name=${encodeURIComponent(this.author.name)}`); + if (this.author.url) + arrayQuery.push(`author_url=${encodeURIComponent(this.author.url)}`); + } + if (this.provider) { + if (this.provider.name) + arrayQuery.push( + `provider_name=${encodeURIComponent(this.provider.name)}`, + ); + if (this.provider.url) + arrayQuery.push( + `provider_url=${encodeURIComponent(this.provider.url)}`, + ); + } + if (this.thumbnail?.url) { + arrayQuery.push(`image=${encodeURIComponent(this.thumbnail.url)}`); } - if (this.description) { - arrayQuery.push( - `description=${encodeURIComponent(this.description)}`, - ); - } - if (this.url) { - arrayQuery.push(`url=${encodeURIComponent(this.url)}`); - } - if (this.color) { - arrayQuery.push( - `colour=${encodeURIComponent('#' + this.color.toString(16))}`, - ); - } - if (this.image?.url) { - arrayQuery.push(`image=${encodeURIComponent(this.image.url)}`); - } - if (this.video?.url) { - arrayQuery.push(`video=${encodeURIComponent(this.video.url)}`); - } - if (this.author) { - if (this.author.name) arrayQuery.push( - `author_name=${encodeURIComponent(this.author.name)}`, - ); - if (this.author.url) arrayQuery.push( - `author_url=${encodeURIComponent(this.author.url)}`, - ); - } - if (this.provider) { - if (this.provider.name) arrayQuery.push( - `provider_name=${encodeURIComponent(this.provider.name)}`, - ); - if (this.provider.url) arrayQuery.push( - `provider_url=${encodeURIComponent(this.provider.url)}`, - ); - } - const fullURL = `${baseURL}${arrayQuery.join('&')}`; - if (this.shorten) { - const url = await getShorten(fullURL); - if (!url) console.log('Cannot shorten URL in WebEmbed'); - return this.hidden ? `${hiddenCharter} ${url || fullURL}` : (url || fullURL); - } else { - return this.hidden ? `${hiddenCharter} ${fullURL}` : fullURL; - } - } + const fullURL = `${baseURL}${arrayQuery.join('&')}`; + if (this.shorten) { + const url = await getShorten(fullURL); + if (!url) console.log('Cannot shorten URL in WebEmbed'); + return this.hidden + ? `${hiddenCharter} ${url || fullURL}` + : url || fullURL; + } else { + return this.hidden ? `${hiddenCharter} ${fullURL}` : fullURL; + } + } } // Credit: https://www.npmjs.com/package/node-url-shortener + google :)) diff --git a/typings/index.d.ts b/typings/index.d.ts index b313fa8..a95d6b0 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1776,10 +1776,12 @@ export class WebEmbed { public video: MessageEmbedVideo | null; public hidden: Boolean; public shorten: Boolean; + public imageType: 'thumbnail' | 'image'; public setAuthor(options: EmbedAuthorData | null): this; public setColor(color: ColorResolvable): this; public setDescription(description: string): this; public setImage(url: string): this; + public setThumbnail(url: string): this; public setVideo(url: string): this; public setTitle(title: string): this; public setURL(url: string): this; @@ -5192,6 +5194,7 @@ export interface WebEmbedOptions { image?: Partial & { proxy_url?: string }; video?: Partial & { proxy_url?: string }; footer?: Partial & { icon_url?: string; proxy_icon_url?: string }; + imageType?: 'thumbnail' | 'image'; } export interface MessageEmbedAuthor {