From 2d7c12b0e9387f56f1809822bc2c8c4ee52a00e9 Mon Sep 17 00:00:00 2001 From: monbrey Date: Thu, 24 Jun 2021 09:02:30 +1000 Subject: [PATCH] fix(Message): flags not being parsed on some edits (#5886) * fix(Message): flags not being parsed on some edits * refactor(MessageManager): access cache once --- src/managers/MessageManager.js | 16 ++++++++++------ src/structures/APIMessage.js | 17 ++++++++++++++--- src/structures/Message.js | 2 +- typings/index.d.ts | 5 ++++- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/managers/MessageManager.js b/src/managers/MessageManager.js index a25e80ecd744..06c8b929316e 100644 --- a/src/managers/MessageManager.js +++ b/src/managers/MessageManager.js @@ -120,16 +120,20 @@ class MessageManager extends BaseManager { * @returns {Promise} */ async edit(message, options) { - message = this.resolveID(message); - if (!message) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable'); + const messageID = this.resolveID(message); + if (!messageID) throw new TypeError('INVALID_TYPE', 'message', 'MessageResolvable'); - const { data, files } = await (options instanceof APIMessage ? options : APIMessage.create(this, options)) + const { data, files } = await (options instanceof APIMessage + ? options + : APIMessage.create(message instanceof Message ? message : this, options) + ) .resolveData() .resolveFiles(); - const d = await this.client.api.channels[this.channel.id].messages[message].patch({ data, files }); + const d = await this.client.api.channels[this.channel.id].messages[messageID].patch({ data, files }); - if (this.cache.has(message)) { - const clone = this.cache.get(message)._clone(); + const existing = this.cache.get(messageID); + if (existing) { + const clone = existing._clone(); clone._patch(d); return clone; } diff --git a/src/structures/APIMessage.js b/src/structures/APIMessage.js index b755ba162119..db467bfacb65 100644 --- a/src/structures/APIMessage.js +++ b/src/structures/APIMessage.js @@ -74,6 +74,16 @@ class APIMessage { return this.target instanceof Message; } + /** + * Wether or not the target is a message manager + * @type {boolean} + * @readonly + */ + get isMessageManager() { + const MessageManager = require('../managers/MessageManager'); + return this.target instanceof MessageManager; + } + /** * Whether or not the target is an interaction * @type {boolean} @@ -156,9 +166,9 @@ class APIMessage { } let flags; - if (this.isMessage) { + if (this.isMessage || this.isMessageManager) { // eslint-disable-next-line eqeqeq - flags = this.options.flags != null ? new MessageFlags(this.options.flags).bitfield : this.target.flags.bitfield; + flags = this.options.flags != null ? new MessageFlags(this.options.flags).bitfield : this.target.flags?.bitfield; } else if (isInteraction && this.options.ephemeral) { flags = MessageFlags.FLAGS.EPHEMERAL; } @@ -300,5 +310,6 @@ module.exports = APIMessage; /** * A target for a message. - * @typedef {TextChannel|DMChannel|User|GuildMember|Webhook|WebhookClient|Interaction|InteractionWebhook} MessageTarget + * @typedef {TextChannel|DMChannel|User|GuildMember|Webhook|WebhookClient|Interaction|InteractionWebhook| + * Message|MessageManager} MessageTarget */ diff --git a/src/structures/Message.js b/src/structures/Message.js index 2dc8dcc7657a..0b22cf2110d7 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -559,7 +559,7 @@ class Message extends Base { * .catch(console.error); */ edit(options) { - return this.channel.messages.edit(this.id, options); + return this.channel.messages.edit(this, options); } /** diff --git a/typings/index.d.ts b/typings/index.d.ts index 64505d1e9461..b6b30b1d5b04 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -205,6 +205,7 @@ declare module 'discord.js' { public readonly isUser: boolean; public readonly isWebhook: boolean; public readonly isMessage: boolean; + public readonly isMessageManager: boolean; public readonly isInteraction: boolean; public files: unknown[] | null; public options: MessageOptions | WebhookMessageOptions; @@ -3560,7 +3561,9 @@ declare module 'discord.js' { | User | GuildMember | Webhook - | WebhookClient; + | WebhookClient + | Message + | MessageManager; type MessageType = | 'DEFAULT'