From e57ef25082eb3b2447b73b551dfc7cc0d4d59a19 Mon Sep 17 00:00:00 2001 From: Tenpi <37512637+Tenpi@users.noreply.github.com> Date: Mon, 24 Feb 2020 05:44:54 -0500 Subject: [PATCH] typings/fix(MessageEmbed): add interfaces for props, fix copy constructor (#3492) * updated typings * Updated docs * fixed types for MessageEmbedOptions * added curly bracket spaces * fix(MessageEmbed): make copy constructor work properly * fix(MessageEmbed): copy the provider too Co-authored-by: SpaceEEC --- src/structures/MessageEmbed.js | 61 +++++++++++++++++++++++--------- typings/index.d.ts | 63 +++++++++++++++++++++++++++------- 2 files changed, 95 insertions(+), 29 deletions(-) diff --git a/src/structures/MessageEmbed.js b/src/structures/MessageEmbed.js index 19a93c346..66f087220 100644 --- a/src/structures/MessageEmbed.js +++ b/src/structures/MessageEmbed.js @@ -67,81 +67,108 @@ class MessageEmbed { this.fields = data.fields ? data.fields.map(Util.cloneObject) : []; /** - * The thumbnail of this embed (if there is one) - * @type {?Object} + * @typedef {Object} MessageEmbedThumbnail * @property {string} url URL for this thumbnail * @property {string} proxyURL ProxyURL for this thumbnail * @property {number} height Height of this thumbnail * @property {number} width Width of this thumbnail */ + + /** + * The thumbnail of this embed (if there is one) + * @type {?MessageEmbedThumbnail} + */ this.thumbnail = data.thumbnail ? { url: data.thumbnail.url, - proxyURL: data.thumbnail.proxy_url, + proxyURL: data.thumbnail.proxyURL || data.thumbnail.proxy_url, height: data.thumbnail.height, width: data.thumbnail.width, } : null; /** - * The image of this embed, if there is one - * @type {?Object} + * @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.proxy_url, + proxyURL: data.image.proxyURL || data.image.proxy_url, height: data.image.height, width: data.image.width, } : null; /** - * The video of this embed (if there is one) - * @type {?Object} + * @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 video of this embed (if there is one) + * @type {?MessageEmbedVideo} * @readonly */ this.video = data.video ? { url: data.video.url, - proxyURL: data.video.proxy_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 {?Object} + * @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 author of this embed (if there is one) + * @type {?MessageEmbedAuthor} + */ this.author = data.author ? { name: data.author.name, url: data.author.url, iconURL: data.author.iconURL || data.author.icon_url, - proxyIconURL: data.author.proxyIconUrl || data.author.proxy_icon_url, + proxyIconURL: data.author.proxyIconURL || data.author.proxy_icon_url, } : null; /** - * The provider of this embed (if there is one) - * @type {?Object} + * @typedef {Object} MessageEmbedProvider * @property {string} name The name of this provider * @property {string} url URL of this provider */ - this.provider = data.provider; /** - * The footer of this embed - * @type {?Object} + * The provider of this embed (if there is one) + * @type {?MessageEmbedProvider} + */ + this.provider = data.provider ? { + name: data.provider.name, + url: data.provider.name, + } : null; + + /** + * @typedef {Object} MessageEmbedFooter * @property {string} text The text of this footer * @property {string} iconURL URL of the icon for this footer * @property {string} proxyIconURL Proxied URL of the icon for this footer */ + + /** + * The footer of this embed + * @type {?MessageEmbedFooter} + */ this.footer = data.footer ? { text: data.footer.text, iconURL: data.footer.iconURL || data.footer.icon_url, diff --git a/typings/index.d.ts b/typings/index.d.ts index 54a04853c..44851f008 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1051,23 +1051,23 @@ declare module 'discord.js' { export class MessageEmbed { constructor(data?: MessageEmbed | MessageEmbedOptions); - public author: { name?: string; url?: string; iconURL?: string; proxyIconURL?: string } | null; + public author: MessageEmbedAuthor | null; public color: number; public readonly createdAt: Date | null; public description: string; public fields: EmbedField[]; public files: (MessageAttachment | string | FileOptions)[]; - public footer: { text?: string; iconURL?: string; proxyIconURL?: string } | null; + public footer: MessageEmbedFooter | null; public readonly hexColor: string | null; - public image: { url: string; proxyURL?: string; height?: number; width?: number; } | null; + public image: MessageEmbedImage | null; public readonly length: number; - public provider: { name: string; url: string; }; - public thumbnail: { url: string; proxyURL?: string; height?: number; width?: number; } | null; + public provider: MessageEmbedProvider | null; + public thumbnail: MessageEmbedThumbnail | null; public timestamp: number | null; public title: string; public type: string; public url: string; - public readonly video: { url?: string; proxyURL?: string; height?: number; width?: number } | null; + public readonly video: MessageEmbedVideo | null; public addFields(...fields: EmbedField[] | EmbedField[][]): this; public attachFiles(file: (MessageAttachment | FileOptions | string)[]): this; public setAuthor(name: StringResolvable, iconURL?: string, url?: string): this; @@ -2449,13 +2449,52 @@ declare module 'discord.js' { url?: string; timestamp?: Date | number; color?: ColorResolvable; - fields?: { name: string; value: string; inline?: boolean; }[]; + fields?: EmbedField[]; files?: (MessageAttachment | string | FileOptions)[]; - author?: { name?: string; url?: string; icon_url?: string; iconURL?: string; }; - thumbnail?: { url?: string; height?: number; width?: number; }; - image?: { url?: string; proxy_url?: string; proxyURL?: string; height?: number; width?: number; }; - video?: { url?: string; height?: number; width?: number; }; - footer?: { text?: string; icon_url?: string; iconURL?: string; }; + author?: Partial & { icon_url?: string; proxy_icon_url?: string }; + thumbnail?: Partial & { proxy_url?: string }; + image?: Partial & { proxy_url?: string }; + video?: Partial & { proxy_url?: string }; + footer?: Partial & { icon_url?: string; proxy_icon_url?: string }; + } + + interface MessageEmbedAuthor { + name?: string; + url?: string; + iconURL?: string; + proxyIconURL?: string; + } + + interface MessageEmbedThumbnail { + url: string; + proxyURL?: string; + height?: number; + width?: number; + } + + interface MessageEmbedFooter { + text?: string; + iconURL?: string; + proxyIconURL?: string; + } + + interface MessageEmbedImage { + url: string; + proxyURL?: string; + height?: number; + width?: number; + } + + interface MessageEmbedProvider { + name: string; + url: string; + } + + interface MessageEmbedVideo { + url?: string; + proxyURL?: string; + height?: number; + width?: number; } interface MessageOptions {