diff --git a/src/errors/Messages.js b/src/errors/Messages.js index 24a3b1af5..0fe993c75 100644 --- a/src/errors/Messages.js +++ b/src/errors/Messages.js @@ -49,6 +49,8 @@ const Messages = { BUTTON_URL: 'MessageButton url must be a string', BUTTON_CUSTOM_ID: 'MessageButton customID must be a string', + INTERACTION_COLLECTOR_TIMEOUT: 'Collector timed out without receiving any interactions', + FILE_NOT_FOUND: file => `File could not be found: ${file}`, USER_NO_DMCHANNEL: 'No DM Channel exists!', diff --git a/src/structures/interfaces/TextBasedChannel.js b/src/structures/interfaces/TextBasedChannel.js index 8f96723d2..415d5ad2f 100644 --- a/src/structures/interfaces/TextBasedChannel.js +++ b/src/structures/interfaces/TextBasedChannel.js @@ -5,7 +5,7 @@ const MessageCollector = require('../MessageCollector'); const APIMessage = require('../APIMessage'); const SnowflakeUtil = require('../../util/SnowflakeUtil'); const Collection = require('../../util/Collection'); -const { RangeError, TypeError } = require('../../errors'); +const { RangeError, TypeError, Error } = require('../../errors'); const MessageComponentInteractionCollector = require('../MessageComponentInteractionCollector'); /** @@ -335,24 +335,25 @@ class TextBasedChannel { } /** - * Similar to createMessageComponentInteractionCollector but in promise form. - * Resolves with a collection of interactions that pass the specified filter. + * Collects a single component interaction that passes the filter. + * The Promise will reject if the time expires. * @param {CollectorFilter} filter The filter function to use - * @param {AwaitMessageComponentInteractionsOptions} [options={}] Optional options to pass to the internal collector - * @returns {Promise>} + * @param {number} [time] Time to wait for an interaction before rejecting + * @returns {Promise} * @example - * // Create a button interaction collector + * // Collect a button interaction * const filter = (interaction) => interaction.customID === 'button' && interaction.user.id === 'someID'; - * channel.awaitMessageComponentInteractions(filter, { time: 15000 }) - * .then(collected => console.log(`Collected ${collected.size} interactions`)) + * channel.awaitMessageComponentInteraction(filter, 15000) + * .then(interaction => console.log(`${interaction.customID} was clicked!`)) * .catch(console.error); */ - awaitMessageComponentInteractions(filter, options = {}) { + awaitMessageComponentInteraction(filter, time) { return new Promise((resolve, reject) => { - const collector = this.createMessageComponentInteractionCollector(filter, options); - collector.once('end', (interactions, reason) => { - if (options.errors && options.errors.includes(reason)) reject(interactions); - else resolve(interactions); + const collector = this.createMessageComponentInteractionCollector(filter, { max: 1, time }); + collector.once('end', interactions => { + const interaction = interactions.first(); + if (!interaction) reject(new Error('INTERACTION_COLLECTOR_TIMEOUT')); + else resolve(interaction); }); }); } diff --git a/typings/index.d.ts b/typings/index.d.ts index 257f66294..8ee313f3b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1231,10 +1231,10 @@ declare module 'discord.js' { public webhookID: Snowflake | null; public flags: Readonly; public reference: MessageReference | null; - public awaitMessageComponentInteractions( + public awaitMessageComponentInteraction( filter: CollectorFilter<[MessageComponentInteraction]>, - options?: AwaitMessageComponentInteractionsOptions, - ): Promise>; + time?: number, + ): Promise; public awaitReactions( filter: CollectorFilter<[MessageReaction, User]>, options?: AwaitReactionsOptions, @@ -1245,7 +1245,7 @@ declare module 'discord.js' { ): ReactionCollector; public createMessageComponentInteractionCollector( filter: CollectorFilter<[MessageComponentInteraction]>, - options?: AwaitMessageComponentInteractionsOptions, + options?: MessageComponentInteractionCollectorOptions, ): MessageComponentInteractionCollector; public delete(): Promise; public edit( @@ -2503,10 +2503,10 @@ declare module 'discord.js' { readonly lastPinAt: Date | null; typing: boolean; typingCount: number; - awaitMessageComponentInteractions( + awaitMessageComponentInteraction( filter: CollectorFilter<[MessageComponentInteraction]>, - options?: AwaitMessageComponentInteractionsOptions, - ): Promise>; + time?: number, + ): Promise; awaitMessages( filter: CollectorFilter<[Message]>, options?: AwaitMessagesOptions, @@ -2729,10 +2729,6 @@ declare module 'discord.js' { new?: any; } - interface AwaitMessageComponentInteractionsOptions extends MessageComponentInteractionCollectorOptions { - errors?: string[]; - } - interface AwaitMessagesOptions extends MessageCollectorOptions { errors?: string[]; }