revert: support for nested arrays of components, fix error handling (#6081)

This commit is contained in:
monbrey
2021-07-12 16:53:27 +10:00
committed by GitHub
parent dee5c83fc0
commit 1dcad051a8
8 changed files with 15 additions and 23 deletions

View File

@@ -53,11 +53,10 @@ class BaseMessageComponent {
* Constructs a MessageComponent based on the type of the incoming data * Constructs a MessageComponent based on the type of the incoming data
* @param {MessageComponentOptions} data Data for a MessageComponent * @param {MessageComponentOptions} data Data for a MessageComponent
* @param {Client|WebhookClient} [client] Client constructing this component * @param {Client|WebhookClient} [client] Client constructing this component
* @param {boolean} [skipValidation=false] Whether or not to validate the component type
* @returns {?MessageComponent} * @returns {?MessageComponent}
* @private * @private
*/ */
static create(data, client, skipValidation = false) { static create(data, client) {
let component; let component;
let type = data.type; let type = data.type;
@@ -66,7 +65,7 @@ class BaseMessageComponent {
switch (type) { switch (type) {
case MessageComponentTypes.ACTION_ROW: { case MessageComponentTypes.ACTION_ROW: {
const MessageActionRow = require('./MessageActionRow'); const MessageActionRow = require('./MessageActionRow');
component = new MessageActionRow(data); component = new MessageActionRow(data, client);
break; break;
} }
case MessageComponentTypes.BUTTON: { case MessageComponentTypes.BUTTON: {
@@ -82,7 +81,7 @@ class BaseMessageComponent {
default: default:
if (client) { if (client) {
client.emit(Events.DEBUG, `[BaseMessageComponent] Received component with unknown type: ${data.type}`); client.emit(Events.DEBUG, `[BaseMessageComponent] Received component with unknown type: ${data.type}`);
} else if (!skipValidation) { } else {
throw new TypeError('INVALID_TYPE', 'data.type', 'valid MessageComponentType'); throw new TypeError('INVALID_TYPE', 'data.type', 'valid MessageComponentType');
} }
} }

View File

@@ -572,7 +572,7 @@ class Message extends Base {
* @property {MessageAttachment[]} [attachments] An array of attachments to keep, * @property {MessageAttachment[]} [attachments] An array of attachments to keep,
* all attachments will be kept if omitted * all attachments will be kept if omitted
* @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] Files to add to the message * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] Files to add to the message
* @property {MessageActionRow[]|MessageActionRowOptions[]|MessageActionRowComponentResolvable[][]} [components] * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
* Action rows containing interactive components for the message (buttons, select menus) * Action rows containing interactive components for the message (buttons, select menus)
*/ */

View File

@@ -37,15 +37,16 @@ class MessageActionRow extends BaseMessageComponent {
/** /**
* @param {MessageActionRow|MessageActionRowOptions} [data={}] MessageActionRow to clone or raw data * @param {MessageActionRow|MessageActionRowOptions} [data={}] MessageActionRow to clone or raw data
* @param {Client} [client] The client constructing this MessageActionRow, if provided
*/ */
constructor(data = {}) { constructor(data = {}, client = null) {
super({ type: 'ACTION_ROW' }); super({ type: 'ACTION_ROW' });
/** /**
* The components in this action row * The components in this action row
* @type {MessageActionRowComponent[]} * @type {MessageActionRowComponent[]}
*/ */
this.components = data.components?.map(c => BaseMessageComponent.create(c, null, true)) ?? []; this.components = data.components?.map(c => BaseMessageComponent.create(c, client)) ?? [];
} }
/** /**
@@ -54,7 +55,7 @@ class MessageActionRow extends BaseMessageComponent {
* @returns {MessageActionRow} * @returns {MessageActionRow}
*/ */
addComponents(...components) { addComponents(...components) {
this.components.push(...components.flat(Infinity).map(c => BaseMessageComponent.create(c, null, true))); this.components.push(...components.flat(Infinity).map(c => BaseMessageComponent.create(c)));
return this; return this;
} }
@@ -66,11 +67,7 @@ class MessageActionRow extends BaseMessageComponent {
* @returns {MessageActionRow} * @returns {MessageActionRow}
*/ */
spliceComponents(index, deleteCount, ...components) { spliceComponents(index, deleteCount, ...components) {
this.components.splice( this.components.splice(index, deleteCount, ...components.flat(Infinity).map(c => BaseMessageComponent.create(c)));
index,
deleteCount,
...components.flat(Infinity).map(c => BaseMessageComponent.create(c, null, true)),
);
return this; return this;
} }

View File

@@ -3,7 +3,6 @@
const BaseMessageComponent = require('./BaseMessageComponent'); const BaseMessageComponent = require('./BaseMessageComponent');
const MessageEmbed = require('./MessageEmbed'); const MessageEmbed = require('./MessageEmbed');
const { RangeError } = require('../errors'); const { RangeError } = require('../errors');
const { MessageComponentTypes } = require('../util/Constants');
const DataResolver = require('../util/DataResolver'); const DataResolver = require('../util/DataResolver');
const MessageFlags = require('../util/MessageFlags'); const MessageFlags = require('../util/MessageFlags');
const Util = require('../util/Util'); const Util = require('../util/Util');
@@ -138,11 +137,7 @@ class MessagePayload {
} }
} }
const components = this.options.components?.map(c => const components = this.options.components?.map(c => BaseMessageComponent.create(c).toJSON());
BaseMessageComponent.create(
Array.isArray(c) ? { type: MessageComponentTypes.ACTION_ROW, components: c } : c,
).toJSON(),
);
let username; let username;
let avatarURL; let avatarURL;

View File

@@ -103,7 +103,7 @@ class Webhook {
* @property {string} [content] See {@link BaseMessageOptions#content} * @property {string} [content] See {@link BaseMessageOptions#content}
* @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] See {@link BaseMessageOptions#files} * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] See {@link BaseMessageOptions#files}
* @property {MessageMentionOptions} [allowedMentions] See {@link BaseMessageOptions#allowedMentions} * @property {MessageMentionOptions} [allowedMentions] See {@link BaseMessageOptions#allowedMentions}
* @property {MessageActionRow[]|MessageActionRowOptions[]|MessageActionRowComponentResolvable[][]} [components] * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
* Action rows containing interactive components for the message (buttons, select menus) * Action rows containing interactive components for the message (buttons, select menus)
*/ */

View File

@@ -63,7 +63,7 @@ class TextBasedChannel {
* @property {MessageMentionOptions} [allowedMentions] Which mentions should be parsed from the message content * @property {MessageMentionOptions} [allowedMentions] Which mentions should be parsed from the message content
* (see [here](https://discord.com/developers/docs/resources/channel#allowed-mentions-object) for more details) * (see [here](https://discord.com/developers/docs/resources/channel#allowed-mentions-object) for more details)
* @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] Files to send with the message * @property {FileOptions[]|BufferResolvable[]|MessageAttachment[]} [files] Files to send with the message
* @property {MessageActionRow[]|MessageActionRowOptions[]|MessageActionRowComponentResolvable[][]} [components] * @property {MessageActionRow[]|MessageActionRowOptions[]} [components]
* Action rows containing interactive components for the message (buttons, select menus) * Action rows containing interactive components for the message (buttons, select menus)
*/ */

4
typings/index.d.ts vendored
View File

@@ -3519,7 +3519,7 @@ export interface MessageEditOptions {
files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[]; files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[];
flags?: BitFieldResolvable<MessageFlagsString, number>; flags?: BitFieldResolvable<MessageFlagsString, number>;
allowedMentions?: MessageMentionOptions; allowedMentions?: MessageMentionOptions;
components?: (MessageActionRow | MessageActionRowOptions | MessageActionRowComponentResolvable[])[]; components?: (MessageActionRow | MessageActionRowOptions)[];
} }
export interface MessageEmbedAuthor { export interface MessageEmbedAuthor {
@@ -3618,7 +3618,7 @@ export interface MessageOptions {
nonce?: string | number; nonce?: string | number;
content?: string | null; content?: string | null;
embeds?: (MessageEmbed | MessageEmbedOptions)[]; embeds?: (MessageEmbed | MessageEmbedOptions)[];
components?: (MessageActionRow | MessageActionRowOptions | MessageActionRowComponentResolvable[])[]; components?: (MessageActionRow | MessageActionRowOptions)[];
allowedMentions?: MessageMentionOptions; allowedMentions?: MessageMentionOptions;
files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[]; files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[];
reply?: ReplyOptions; reply?: ReplyOptions;

View File

@@ -434,6 +434,7 @@ client.on('interaction', async interaction => {
await interaction.reply({ content: 'Hi!', components: [actionRow] }); await interaction.reply({ content: 'Hi!', components: [actionRow] });
// @ts-expect-error
await interaction.reply({ content: 'Hi!', components: [[button]] }); await interaction.reply({ content: 'Hi!', components: [[button]] });
// @ts-expect-error // @ts-expect-error