From 20fade2a875695aa677e32b983320e746fd4d69c Mon Sep 17 00:00:00 2001 From: Qjuh <76154676+Qjuh@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:23:12 +0200 Subject: [PATCH] fix: allowedMentions, container, media item `toJSON()` for components v2 (#10852) * fix: allowedMentions for components v2 * refactor: passing allowed_mentions * Update packages/discord.js/src/structures/MessagePayload.js * fix: missing UnfurledMediaItem#toJSON() * fix: find interactive component in container * fix: recursive flatMap * fix: lint * refactor: top-level function * fix: jsdoc * fix: jsdoc --- .../src/structures/MessagePayload.js | 3 +- .../src/structures/UnfurledMediaItem.js | 8 +++++ packages/discord.js/src/util/Components.js | 31 +++++++++++++------ packages/discord.js/typings/index.d.ts | 7 ++++- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/packages/discord.js/src/structures/MessagePayload.js b/packages/discord.js/src/structures/MessagePayload.js index cf53dc755..e46b48f83 100644 --- a/packages/discord.js/src/structures/MessagePayload.js +++ b/packages/discord.js/src/structures/MessagePayload.js @@ -248,7 +248,8 @@ class MessagePayload { components, username, avatar_url: avatarURL, - allowed_mentions: content === undefined && message_reference === undefined ? undefined : allowedMentions, + allowed_mentions: + this.isMessage && this.target.author.id !== this.target.client.user.id ? undefined : allowedMentions, flags, message_reference, attachments: this.options.attachments, diff --git a/packages/discord.js/src/structures/UnfurledMediaItem.js b/packages/discord.js/src/structures/UnfurledMediaItem.js index d52c4dd01..71526a016 100644 --- a/packages/discord.js/src/structures/UnfurledMediaItem.js +++ b/packages/discord.js/src/structures/UnfurledMediaItem.js @@ -20,6 +20,14 @@ class UnfurledMediaItem { get url() { return this.data.url; } + + /** + * Returns the API-compatible JSON for this media item + * @returns {APIUnfurledMediaItem} + */ + toJSON() { + return { ...this.data }; + } } module.exports = UnfurledMediaItem; diff --git a/packages/discord.js/src/util/Components.js b/packages/discord.js/src/util/Components.js index 55890725d..605e33ae5 100644 --- a/packages/discord.js/src/util/Components.js +++ b/packages/discord.js/src/util/Components.js @@ -214,25 +214,36 @@ function createComponentBuilder(data) { } } +/** + * Extracts all interactive components from the component tree + * @param {Component|APIMessageComponent} component The component to find all interactive components in + * @returns {Array} + * @ignore + */ +function extractInteractiveComponents(component) { + switch (component.type) { + case ComponentType.ActionRow: + return component.components; + case ComponentType.Section: + return [...component.components, component.accessory]; + case ComponentType.Container: + return component.components.flatMap(extractInteractiveComponents); + default: + return [component]; + } +} + /** * Finds a component by customId in nested components * @param {Array} components The components to search in * @param {string} customId The customId to search for * @returns {Component|APIMessageComponent} + * @ignore */ function findComponentByCustomId(components, customId) { return ( components - .flatMap(component => { - switch (component.type) { - case ComponentType.ActionRow: - return component.components; - case ComponentType.Section: - return [...component.components, component.accessory]; - default: - return [component]; - } - }) + .flatMap(extractInteractiveComponents) .find(component => (component.customId ?? component.custom_id) === customId) ?? null ); } diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index a990b930d..8998b7b91 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -7043,7 +7043,12 @@ export interface MessageEditAttachmentData { export interface MessageEditOptions extends Omit { content?: string | null; attachments?: readonly (Attachment | MessageEditAttachmentData)[]; - flags?: BitFieldResolvable, MessageFlags.SuppressEmbeds> | undefined; + flags?: + | BitFieldResolvable< + Extract, + MessageFlags.SuppressEmbeds | MessageFlags.IsComponentsV2 + > + | undefined; } export type MessageReactionResolvable = MessageReaction | Snowflake | string;