fix: allowedMentions, container, media item toJSON() for components v2

backport #10852 djs
This commit is contained in:
Elysia
2025-07-08 20:34:29 +07:00
parent e2732da506
commit b15cbdde8e
4 changed files with 25 additions and 6 deletions

View File

@@ -161,6 +161,19 @@ class BaseMessageComponent {
static resolveType(type) { static resolveType(type) {
return typeof type === 'string' ? type : MessageComponentTypes[type]; return typeof type === 'string' ? type : MessageComponentTypes[type];
} }
static extractInteractiveComponents(component) {
switch (component.type) {
case MessageComponentTypes.ACTION_ROW:
return component.components;
case MessageComponentTypes.SECTION:
return [...component.components, component.accessory];
case MessageComponentTypes.CONTAINER:
return component.components.flatMap(BaseMessageComponent.extractInteractiveComponents);
default:
return [component];
}
}
} }
module.exports = BaseMessageComponent; module.exports = BaseMessageComponent;

View File

@@ -1003,7 +1003,11 @@ class Message extends Base {
* @returns {?MessageActionRowComponent} * @returns {?MessageActionRowComponent}
*/ */
resolveComponent(customId) { resolveComponent(customId) {
return this.components.flatMap(row => row.components).find(component => component.customId === customId) ?? null; return (
this.components
.flatMap(BaseMessageComponent.extractInteractiveComponents)
.find(component => (component.customId ?? component.custom_id) === customId) ?? null
);
} }
/** /**

View File

@@ -257,7 +257,7 @@ class MessagePayload {
username, username,
avatar_url: avatarURL, avatar_url: avatarURL,
allowed_mentions: allowed_mentions:
typeof content === 'undefined' && typeof message_reference === 'undefined' ? undefined : allowedMentions, this.isMessage && this.target?.author?.id !== this.target?.client?.user?.id ? undefined : allowedMentions,
flags, flags,
message_reference, message_reference,
attachments: this.options.attachments, attachments: this.options.attachments,

View File

@@ -12,15 +12,17 @@ class UnfurledMediaItem {
* @type {string} * @type {string}
*/ */
this.url = data.url ?? null; this.url = data.url ?? null;
/**
* @type {APIUnfurledMediaItem}
*/
this.data = data;
} }
/** /**
* * Returns the API-compatible JSON for this media item
* @returns {APIUnfurledMediaItem} * @returns {APIUnfurledMediaItem}
*/ */
toJSON() { toJSON() {
return { return { ...this.data };
url: this.url,
};
} }
} }