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
This commit is contained in:
Qjuh
2025-04-27 19:23:12 +02:00
committed by GitHub
parent e827644b5a
commit 20fade2a87
4 changed files with 37 additions and 12 deletions

View File

@@ -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,

View File

@@ -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;

View File

@@ -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<Component|APIMessageComponent>}
* @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<Component|APIMessageComponent>} 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
);
}

View File

@@ -7043,7 +7043,12 @@ export interface MessageEditAttachmentData {
export interface MessageEditOptions extends Omit<BaseMessageOptions, 'content'> {
content?: string | null;
attachments?: readonly (Attachment | MessageEditAttachmentData)[];
flags?: BitFieldResolvable<Extract<MessageFlagsString, 'SuppressEmbeds'>, MessageFlags.SuppressEmbeds> | undefined;
flags?:
| BitFieldResolvable<
Extract<MessageFlagsString, 'SuppressEmbeds' | 'IsComponentsV2'>,
MessageFlags.SuppressEmbeds | MessageFlags.IsComponentsV2
>
| undefined;
}
export type MessageReactionResolvable = MessageReaction | Snowflake | string;