refactor: Use Base prefix for channel and interaction base classes (#8099)

This commit is contained in:
Suneet Tipirneni
2022-06-24 04:42:50 -04:00
committed by GitHub
parent 65dc8d677e
commit e24970e3c3
25 changed files with 128 additions and 112 deletions

View File

@@ -118,7 +118,7 @@ class Client extends BaseClient {
this.guilds = new GuildManager(this); this.guilds = new GuildManager(this);
/** /**
* All of the {@link Channel}s that the client is currently handling, mapped by their ids - * All of the {@link BaseChannel}s that the client is currently handling, mapped by their ids -
* as long as sharding isn't being used, this will be *every* channel in *every* guild the bot * as long as sharding isn't being used, this will be *every* channel in *every* guild the bot
* is a member of. Note that DM channels will not be initially cached, and thus not be present * is a member of. Note that DM channels will not be initially cached, and thus not be present
* in the Manager without their explicit fetching or use. * in the Manager without their explicit fetching or use.

View File

@@ -76,7 +76,7 @@ class InteractionCreateAction extends Action {
/** /**
* Emitted when an interaction is created. * Emitted when an interaction is created.
* @event Client#interactionCreate * @event Client#interactionCreate
* @param {Interaction} interaction The interaction which was created * @param {BaseInteraction} interaction The interaction which was created
*/ */
client.emit(Events.InteractionCreate, interaction); client.emit(Events.InteractionCreate, interaction);
} }

View File

@@ -94,7 +94,7 @@ exports.ButtonBuilder = require('./structures/ButtonBuilder');
exports.ButtonComponent = require('./structures/ButtonComponent'); exports.ButtonComponent = require('./structures/ButtonComponent');
exports.ButtonInteraction = require('./structures/ButtonInteraction'); exports.ButtonInteraction = require('./structures/ButtonInteraction');
exports.CategoryChannel = require('./structures/CategoryChannel'); exports.CategoryChannel = require('./structures/CategoryChannel');
exports.Channel = require('./structures/Channel').Channel; exports.BaseChannel = require('./structures/BaseChannel').BaseChannel;
exports.ChatInputCommandInteraction = require('./structures/ChatInputCommandInteraction'); exports.ChatInputCommandInteraction = require('./structures/ChatInputCommandInteraction');
exports.ClientApplication = require('./structures/ClientApplication'); exports.ClientApplication = require('./structures/ClientApplication');
exports.ClientPresence = require('./structures/ClientPresence'); exports.ClientPresence = require('./structures/ClientPresence');
@@ -121,7 +121,7 @@ exports.GuildScheduledEvent = require('./structures/GuildScheduledEvent').GuildS
exports.GuildTemplate = require('./structures/GuildTemplate'); exports.GuildTemplate = require('./structures/GuildTemplate');
exports.Integration = require('./structures/Integration'); exports.Integration = require('./structures/Integration');
exports.IntegrationApplication = require('./structures/IntegrationApplication'); exports.IntegrationApplication = require('./structures/IntegrationApplication');
exports.Interaction = require('./structures/Interaction'); exports.BaseInteraction = require('./structures/BaseInteraction');
exports.InteractionCollector = require('./structures/InteractionCollector'); exports.InteractionCollector = require('./structures/InteractionCollector');
exports.InteractionResponse = require('./structures/InteractionResponse'); exports.InteractionResponse = require('./structures/InteractionResponse');
exports.InteractionWebhook = require('./structures/InteractionWebhook'); exports.InteractionWebhook = require('./structures/InteractionWebhook');

View File

@@ -3,7 +3,7 @@
const process = require('node:process'); const process = require('node:process');
const { Routes } = require('discord-api-types/v10'); const { Routes } = require('discord-api-types/v10');
const CachedManager = require('./CachedManager'); const CachedManager = require('./CachedManager');
const { Channel } = require('../structures/Channel'); const { BaseChannel } = require('../structures/BaseChannel');
const { createChannel } = require('../util/Channels'); const { createChannel } = require('../util/Channels');
const { ThreadChannelTypes } = require('../util/Constants'); const { ThreadChannelTypes } = require('../util/Constants');
const Events = require('../util/Events'); const Events = require('../util/Events');
@@ -16,7 +16,7 @@ let cacheWarningEmitted = false;
*/ */
class ChannelManager extends CachedManager { class ChannelManager extends CachedManager {
constructor(client, iterable) { constructor(client, iterable) {
super(client, Channel, iterable); super(client, BaseChannel, iterable);
const defaultCaching = const defaultCaching =
this._cache.constructor.name === 'Collection' || this._cache.constructor.name === 'Collection' ||
this._cache.maxSize === undefined || this._cache.maxSize === undefined ||
@@ -32,7 +32,7 @@ class ChannelManager extends CachedManager {
/** /**
* The cache of Channels * The cache of Channels
* @type {Collection<Snowflake, Channel>} * @type {Collection<Snowflake, BaseChannel>}
* @name ChannelManager#cache * @name ChannelManager#cache
*/ */
@@ -75,7 +75,7 @@ class ChannelManager extends CachedManager {
* Data that can be resolved to give a Channel object. This can be: * Data that can be resolved to give a Channel object. This can be:
* * A Channel object * * A Channel object
* * A Snowflake * * A Snowflake
* @typedef {Channel|Snowflake} ChannelResolvable * @typedef {BaseChannel|Snowflake} ChannelResolvable
*/ */
/** /**
@@ -84,7 +84,7 @@ class ChannelManager extends CachedManager {
* @memberof ChannelManager * @memberof ChannelManager
* @instance * @instance
* @param {ChannelResolvable} channel The channel resolvable to resolve * @param {ChannelResolvable} channel The channel resolvable to resolve
* @returns {?Channel} * @returns {?BaseChannel}
*/ */
/** /**
@@ -107,7 +107,7 @@ class ChannelManager extends CachedManager {
* Obtains a channel from Discord, or the channel cache if it's already available. * Obtains a channel from Discord, or the channel cache if it's already available.
* @param {Snowflake} id The channel's id * @param {Snowflake} id The channel's id
* @param {FetchChannelOptions} [options] Additional options for this fetch * @param {FetchChannelOptions} [options] Additional options for this fetch
* @returns {Promise<?Channel>} * @returns {Promise<?BaseChannel>}
* @example * @example
* // Fetch a channel by its id * // Fetch a channel by its id
* client.channels.fetch('222109930545610754') * client.channels.fetch('222109930545610754')

View File

@@ -1,15 +1,15 @@
'use strict'; 'use strict';
const { InteractionResponseType, Routes } = require('discord-api-types/v10'); const { InteractionResponseType, Routes } = require('discord-api-types/v10');
const BaseInteraction = require('./BaseInteraction');
const CommandInteractionOptionResolver = require('./CommandInteractionOptionResolver'); const CommandInteractionOptionResolver = require('./CommandInteractionOptionResolver');
const Interaction = require('./Interaction');
const { ErrorCodes } = require('../errors'); const { ErrorCodes } = require('../errors');
/** /**
* Represents an autocomplete interaction. * Represents an autocomplete interaction.
* @extends {Interaction} * @extends {BaseInteraction}
*/ */
class AutocompleteInteraction extends Interaction { class AutocompleteInteraction extends BaseInteraction {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);

View File

@@ -10,7 +10,7 @@ const { ThreadChannelTypes } = require('../util/Constants');
* @extends {Base} * @extends {Base}
* @abstract * @abstract
*/ */
class Channel extends Base { class BaseChannel extends Base {
constructor(client, data, immediatePatch = true) { constructor(client, data, immediatePatch = true) {
super(client); super(client);
@@ -81,7 +81,7 @@ class Channel extends Base {
/** /**
* Deletes this channel. * Deletes this channel.
* @returns {Promise<Channel>} * @returns {Promise<BaseChannel>}
* @example * @example
* // Delete the channel * // Delete the channel
* channel.delete() * channel.delete()
@@ -96,7 +96,7 @@ class Channel extends Base {
/** /**
* Fetches this channel. * Fetches this channel.
* @param {boolean} [force=true] Whether to skip the cache check and request the API * @param {boolean} [force=true] Whether to skip the cache check and request the API
* @returns {Promise<Channel>} * @returns {Promise<BaseChannel>}
*/ */
fetch(force = true) { fetch(force = true) {
return this.client.channels.fetch(this.id, { force }); return this.client.channels.fetch(this.id, { force });
@@ -139,7 +139,7 @@ class Channel extends Base {
} }
} }
exports.Channel = Channel; exports.BaseChannel = BaseChannel;
/** /**
* @external APIChannel * @external APIChannel

View File

@@ -8,8 +8,9 @@ const PermissionsBitField = require('../util/PermissionsBitField');
/** /**
* Represents an interaction. * Represents an interaction.
* @extends {Base} * @extends {Base}
* @abstract
*/ */
class Interaction extends Base { class BaseInteraction extends Base {
constructor(client, data) { constructor(client, data) {
super(client); super(client);
@@ -28,7 +29,7 @@ class Interaction extends Base {
/** /**
* The interaction's token * The interaction's token
* @type {string} * @type {string}
* @name Interaction#token * @name BaseInteraction#token
* @readonly * @readonly
*/ */
Object.defineProperty(this, 'token', { value: data.token }); Object.defineProperty(this, 'token', { value: data.token });
@@ -246,4 +247,4 @@ class Interaction extends Base {
} }
} }
module.exports = Interaction; module.exports = BaseInteraction;

View File

@@ -2,17 +2,17 @@
const { Collection } = require('@discordjs/collection'); const { Collection } = require('@discordjs/collection');
const Attachment = require('./Attachment'); const Attachment = require('./Attachment');
const Interaction = require('./Interaction'); const BaseInteraction = require('./BaseInteraction');
const InteractionWebhook = require('./InteractionWebhook'); const InteractionWebhook = require('./InteractionWebhook');
const InteractionResponses = require('./interfaces/InteractionResponses'); const InteractionResponses = require('./interfaces/InteractionResponses');
/** /**
* Represents a command interaction. * Represents a command interaction.
* @extends {Interaction} * @extends {BaseInteraction}
* @implements {InteractionResponses} * @implements {InteractionResponses}
* @abstract * @abstract
*/ */
class CommandInteraction extends Interaction { class CommandInteraction extends BaseInteraction {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);
@@ -86,7 +86,7 @@ class CommandInteraction extends Interaction {
* @property {Collection<Snowflake, User>} [users] The resolved users * @property {Collection<Snowflake, User>} [users] The resolved users
* @property {Collection<Snowflake, GuildMember|APIGuildMember>} [members] The resolved guild members * @property {Collection<Snowflake, GuildMember|APIGuildMember>} [members] The resolved guild members
* @property {Collection<Snowflake, Role|APIRole>} [roles] The resolved roles * @property {Collection<Snowflake, Role|APIRole>} [roles] The resolved roles
* @property {Collection<Snowflake, Channel|APIChannel>} [channels] The resolved channels * @property {Collection<Snowflake, BaseChannel|APIChannel>} [channels] The resolved channels
* @property {Collection<Snowflake, Message|APIMessage>} [messages] The resolved messages * @property {Collection<Snowflake, Message|APIMessage>} [messages] The resolved messages
* @property {Collection<Snowflake, Attachment>} [attachments] The resolved attachments * @property {Collection<Snowflake, Attachment>} [attachments] The resolved attachments
*/ */

View File

@@ -2,17 +2,17 @@
const { userMention } = require('@discordjs/builders'); const { userMention } = require('@discordjs/builders');
const { ChannelType } = require('discord-api-types/v10'); const { ChannelType } = require('discord-api-types/v10');
const { Channel } = require('./Channel'); const { BaseChannel } = require('./BaseChannel');
const TextBasedChannel = require('./interfaces/TextBasedChannel'); const TextBasedChannel = require('./interfaces/TextBasedChannel');
const MessageManager = require('../managers/MessageManager'); const MessageManager = require('../managers/MessageManager');
const Partials = require('../util/Partials'); const Partials = require('../util/Partials');
/** /**
* Represents a direct message channel between two users. * Represents a direct message channel between two users.
* @extends {Channel} * @extends {BaseChannel}
* @implements {TextBasedChannel} * @implements {TextBasedChannel}
*/ */
class DMChannel extends Channel { class DMChannel extends BaseChannel {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);

View File

@@ -1,12 +1,12 @@
'use strict'; 'use strict';
const { Channel } = require('./Channel'); const { BaseChannel } = require('./BaseChannel');
/** /**
* Represents a channel that displays a directory of guilds. * Represents a channel that displays a directory of guilds.
* @extends {Channel} * @extends {BaseChannel}
*/ */
class DirectoryChannel extends Channel { class DirectoryChannel extends BaseChannel {
constructor(guild, data, client) { constructor(guild, data, client) {
super(client, data); super(client, data);

View File

@@ -48,7 +48,7 @@ const Targets = {
* * An application command * * An application command
* * An object with an id key if target was deleted or fake entity * * An object with an id key if target was deleted or fake entity
* * An object where the keys represent either the new value or the old value * * An object where the keys represent either the new value or the old value
* @typedef {?(Object|Guild|Channel|User|Role|Invite|Webhook|GuildEmoji|Message|Integration|StageInstance|Sticker| * @typedef {?(Object|Guild|BaseChannel|User|Role|Invite|Webhook|GuildEmoji|Message|Integration|StageInstance|Sticker|
* GuildScheduledEvent|ApplicationCommand)} AuditLogEntryTarget * GuildScheduledEvent|ApplicationCommand)} AuditLogEntryTarget
*/ */

View File

@@ -1,7 +1,7 @@
'use strict'; 'use strict';
const { PermissionFlagsBits } = require('discord-api-types/v10'); const { PermissionFlagsBits } = require('discord-api-types/v10');
const { Channel } = require('./Channel'); const { BaseChannel } = require('./BaseChannel');
const { Error, ErrorCodes } = require('../errors'); const { Error, ErrorCodes } = require('../errors');
const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager'); const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager');
const { VoiceBasedChannelTypes } = require('../util/Constants'); const { VoiceBasedChannelTypes } = require('../util/Constants');
@@ -14,10 +14,10 @@ const PermissionsBitField = require('../util/PermissionsBitField');
* - {@link CategoryChannel} * - {@link CategoryChannel}
* - {@link NewsChannel} * - {@link NewsChannel}
* - {@link StageChannel} * - {@link StageChannel}
* @extends {Channel} * @extends {BaseChannel}
* @abstract * @abstract
*/ */
class GuildChannel extends Channel { class GuildChannel extends BaseChannel {
constructor(guild, data, client, immediatePatch = true) { constructor(guild, data, client, immediatePatch = true) {
super(guild?.client ?? client, data, false); super(guild?.client ?? client, data, false);

View File

@@ -137,7 +137,7 @@ class InteractionCollector extends Collector {
/** /**
* Handles an incoming interaction for possible collection. * Handles an incoming interaction for possible collection.
* @param {Interaction} interaction The interaction to possibly collect * @param {BaseInteraction} interaction The interaction to possibly collect
* @returns {?Snowflake} * @returns {?Snowflake}
* @private * @private
*/ */
@@ -145,7 +145,7 @@ class InteractionCollector extends Collector {
/** /**
* Emitted whenever an interaction is collected. * Emitted whenever an interaction is collected.
* @event InteractionCollector#collect * @event InteractionCollector#collect
* @param {Interaction} interaction The interaction that was collected * @param {BaseInteraction} interaction The interaction that was collected
*/ */
if (this.interactionType && interaction.type !== this.interactionType) return null; if (this.interactionType && interaction.type !== this.interactionType) return null;
if (this.componentType && interaction.componentType !== this.componentType) return null; if (this.componentType && interaction.componentType !== this.componentType) return null;
@@ -159,14 +159,14 @@ class InteractionCollector extends Collector {
/** /**
* Handles an interaction for possible disposal. * Handles an interaction for possible disposal.
* @param {Interaction} interaction The interaction that could be disposed of * @param {BaseInteraction} interaction The interaction that could be disposed of
* @returns {?Snowflake} * @returns {?Snowflake}
*/ */
dispose(interaction) { dispose(interaction) {
/** /**
* Emitted whenever an interaction is disposed of. * Emitted whenever an interaction is disposed of.
* @event InteractionCollector#dispose * @event InteractionCollector#dispose
* @param {Interaction} interaction The interaction that was disposed of * @param {BaseInteraction} interaction The interaction that was disposed of
*/ */
if (this.type && interaction.type !== this.type) return null; if (this.type && interaction.type !== this.type) return null;
if (this.componentType && interaction.componentType !== this.componentType) return null; if (this.componentType && interaction.componentType !== this.componentType) return null;

View File

@@ -8,14 +8,14 @@ const { ErrorCodes } = require('../errors');
*/ */
class InteractionResponse { class InteractionResponse {
/** /**
* @param {Interaction} interaction The interaction associated with this response * @param {BaseInteraction} interaction The interaction associated with this response
* @param {Snowflake?} id The interaction id associated with the original response * @param {Snowflake?} id The interaction id associated with the original response
* @private * @private
*/ */
constructor(interaction, id) { constructor(interaction, id) {
/** /**
* The interaction associated with the interaction response * The interaction associated with the interaction response
* @type {Interaction} * @type {BaseInteraction}
*/ */
this.interaction = interaction; this.interaction = interaction;
/** /**

View File

@@ -169,7 +169,7 @@ class Invite extends Base {
if ('channel' in data) { if ('channel' in data) {
/** /**
* The channel this invite is for * The channel this invite is for
* @type {?Channel} * @type {?BaseChannel}
*/ */
this.channel = this.channel =
this.client.channels._add(data.channel, this.guild, { cache: false }) ?? this.client.channels._add(data.channel, this.guild, { cache: false }) ??

View File

@@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Interaction = require('./Interaction'); const BaseInteraction = require('./BaseInteraction');
const InteractionWebhook = require('./InteractionWebhook'); const InteractionWebhook = require('./InteractionWebhook');
const InteractionResponses = require('./interfaces/InteractionResponses'); const InteractionResponses = require('./interfaces/InteractionResponses');
const { lazy } = require('../util/Util'); const { lazy } = require('../util/Util');
@@ -9,10 +9,10 @@ const getMessage = lazy(() => require('./Message').Message);
/** /**
* Represents a message component interaction. * Represents a message component interaction.
* @extends {Interaction} * @extends {BaseInteraction}
* @implements {InteractionResponses} * @implements {InteractionResponses}
*/ */
class MessageComponentInteraction extends Interaction { class MessageComponentInteraction extends BaseInteraction {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);

View File

@@ -115,7 +115,7 @@ class MessageMentions {
/** /**
* Cached channels for {@link MessageMentions#channels} * Cached channels for {@link MessageMentions#channels}
* @type {?Collection<Snowflake, Channel>} * @type {?Collection<Snowflake, BaseChannel>}
* @private * @private
*/ */
this._channels = null; this._channels = null;
@@ -179,7 +179,7 @@ class MessageMentions {
/** /**
* Any channels that were mentioned * Any channels that were mentioned
* <info>Order as they appear first in the message content</info> * <info>Order as they appear first in the message content</info>
* @type {Collection<Snowflake, Channel>} * @type {Collection<Snowflake, BaseChannel>}
* @readonly * @readonly
*/ */
get channels() { get channels() {

View File

@@ -7,7 +7,9 @@ const ActionRowBuilder = require('./ActionRowBuilder');
const { RangeError, ErrorCodes } = require('../errors'); const { RangeError, ErrorCodes } = require('../errors');
const DataResolver = require('../util/DataResolver'); const DataResolver = require('../util/DataResolver');
const MessageFlagsBitField = require('../util/MessageFlagsBitField'); const MessageFlagsBitField = require('../util/MessageFlagsBitField');
const { basename, cloneObject, verifyString } = require('../util/Util'); const { basename, cloneObject, verifyString, lazy } = require('../util/Util');
const getBaseInteraction = lazy(() => require('./BaseInteraction'));
/** /**
* Represents a message to be sent to the API. * Represents a message to be sent to the API.
@@ -86,14 +88,14 @@ class MessagePayload {
} }
/** /**
* Whether or not the target is an {@link Interaction} or an {@link InteractionWebhook} * Whether or not the target is an {@link BaseInteraction} or an {@link InteractionWebhook}
* @type {boolean} * @type {boolean}
* @readonly * @readonly
*/ */
get isInteraction() { get isInteraction() {
const Interaction = require('./Interaction'); const BaseInteraction = getBaseInteraction();
const InteractionWebhook = require('./InteractionWebhook'); const InteractionWebhook = require('./InteractionWebhook');
return this.target instanceof Interaction || this.target instanceof InteractionWebhook; return this.target instanceof BaseInteraction || this.target instanceof InteractionWebhook;
} }
/** /**
@@ -277,7 +279,7 @@ module.exports = MessagePayload;
/** /**
* A target for a message. * A target for a message.
* @typedef {TextBasedChannels|User|GuildMember|Webhook|WebhookClient|Interaction|InteractionWebhook| * @typedef {TextBasedChannels|User|GuildMember|Webhook|WebhookClient|BaseInteraction|InteractionWebhook|
* Message|MessageManager} MessageTarget * Message|MessageManager} MessageTarget
*/ */

View File

@@ -1,6 +1,6 @@
'use strict'; 'use strict';
const Interaction = require('./Interaction'); const BaseInteraction = require('./BaseInteraction');
const InteractionWebhook = require('./InteractionWebhook'); const InteractionWebhook = require('./InteractionWebhook');
const ModalSubmitFields = require('./ModalSubmitFields'); const ModalSubmitFields = require('./ModalSubmitFields');
const InteractionResponses = require('./interfaces/InteractionResponses'); const InteractionResponses = require('./interfaces/InteractionResponses');
@@ -25,7 +25,7 @@ const getMessage = lazy(() => require('./Message').Message);
* Represents a modal interaction * Represents a modal interaction
* @implements {InteractionResponses} * @implements {InteractionResponses}
*/ */
class ModalSubmitInteraction extends Interaction { class ModalSubmitInteraction extends BaseInteraction {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);
/** /**

View File

@@ -1,13 +1,13 @@
'use strict'; 'use strict';
const { Channel } = require('./Channel'); const { BaseChannel } = require('./BaseChannel');
const { Error, ErrorCodes } = require('../errors'); const { Error, ErrorCodes } = require('../errors');
/** /**
* Represents a Partial Group DM Channel on Discord. * Represents a Partial Group DM Channel on Discord.
* @extends {Channel} * @extends {BaseChannel}
*/ */
class PartialGroupDMChannel extends Channel { class PartialGroupDMChannel extends BaseChannel {
constructor(client, data) { constructor(client, data) {
super(client, data); super(client, data);

View File

@@ -1,7 +1,7 @@
'use strict'; 'use strict';
const { ChannelType, PermissionFlagsBits, Routes } = require('discord-api-types/v10'); const { ChannelType, PermissionFlagsBits, Routes } = require('discord-api-types/v10');
const { Channel } = require('./Channel'); const { BaseChannel } = require('./BaseChannel');
const TextBasedChannel = require('./interfaces/TextBasedChannel'); const TextBasedChannel = require('./interfaces/TextBasedChannel');
const { RangeError, ErrorCodes } = require('../errors'); const { RangeError, ErrorCodes } = require('../errors');
const MessageManager = require('../managers/MessageManager'); const MessageManager = require('../managers/MessageManager');
@@ -9,10 +9,10 @@ const ThreadMemberManager = require('../managers/ThreadMemberManager');
/** /**
* Represents a thread channel on Discord. * Represents a thread channel on Discord.
* @extends {Channel} * @extends {BaseChannel}
* @implements {TextBasedChannel} * @implements {TextBasedChannel}
*/ */
class ThreadChannel extends Channel { class ThreadChannel extends BaseChannel {
constructor(guild, data, client, fromInteraction = false) { constructor(guild, data, client, fromInteraction = false) {
super(guild?.client ?? client, data, false); super(guild?.client ?? client, data, false);

View File

@@ -20,7 +20,7 @@ const MessagePayload = require('../MessagePayload');
*/ */
class InteractionResponses { class InteractionResponses {
/** /**
* Options for deferring the reply to an {@link Interaction}. * Options for deferring the reply to an {@link BaseInteraction}.
* @typedef {Object} InteractionDeferReplyOptions * @typedef {Object} InteractionDeferReplyOptions
* @property {boolean} [ephemeral] Whether the reply should be ephemeral * @property {boolean} [ephemeral] Whether the reply should be ephemeral
* @property {boolean} [fetchReply] Whether to fetch the reply * @property {boolean} [fetchReply] Whether to fetch the reply
@@ -33,7 +33,7 @@ class InteractionResponses {
*/ */
/** /**
* Options for a reply to an {@link Interaction}. * Options for a reply to an {@link BaseInteraction}.
* @typedef {BaseMessageOptions} InteractionReplyOptions * @typedef {BaseMessageOptions} InteractionReplyOptions
* @property {boolean} [ephemeral] Whether the reply should be ephemeral * @property {boolean} [ephemeral] Whether the reply should be ephemeral
* @property {boolean} [fetchReply] Whether to fetch the reply * @property {boolean} [fetchReply] Whether to fetch the reply

View File

@@ -445,14 +445,14 @@ function discordSort(collection) {
/** /**
* Sets the position of a Channel or Role. * Sets the position of a Channel or Role.
* @param {Channel|Role} item Object to set the position of * @param {BaseChannel|Role} item Object to set the position of
* @param {number} position New position for the object * @param {number} position New position for the object
* @param {boolean} relative Whether `position` is relative to its current position * @param {boolean} relative Whether `position` is relative to its current position
* @param {Collection<string, Channel|Role>} sorted A collection of the objects sorted properly * @param {Collection<string, BaseChannel|Role>} sorted A collection of the objects sorted properly
* @param {Client} client The client to use to patch the data * @param {Client} client The client to use to patch the data
* @param {string} route Route to call PATCH on * @param {string} route Route to call PATCH on
* @param {string} [reason] Reason for the change * @param {string} [reason] Reason for the change
* @returns {Promise<Channel[]|Role[]>} Updated item list, with `id` and `position` properties * @returns {Promise<BaseChannel[]|Role[]>} Updated item list, with `id` and `position` properties
* @private * @private
*/ */
async function setPosition(item, position, relative, sorted, client, route, reason) { async function setPosition(item, position, relative, sorted, client, route, reason) {

View File

@@ -416,7 +416,7 @@ export interface InteractionResponseFields<Cached extends CacheType = CacheType>
export type BooleanCache<T extends CacheType> = T extends 'cached' ? true : false; export type BooleanCache<T extends CacheType> = T extends 'cached' ? true : false;
export abstract class CommandInteraction<Cached extends CacheType = CacheType> extends Interaction<Cached> { export abstract class CommandInteraction<Cached extends CacheType = CacheType> extends BaseInteraction<Cached> {
public type: InteractionType.ApplicationCommand; public type: InteractionType.ApplicationCommand;
public get command(): ApplicationCommand | ApplicationCommand<{ guild: GuildResolvable }> | null; public get command(): ApplicationCommand | ApplicationCommand<{ guild: GuildResolvable }> | null;
public options: Omit< public options: Omit<
@@ -481,10 +481,10 @@ export class InteractionResponse<Cached extends boolean = boolean> {
public interaction: Interaction<WrapBooleanCache<Cached>>; public interaction: Interaction<WrapBooleanCache<Cached>>;
public client: Client; public client: Client;
public id: Snowflake; public id: Snowflake;
public awaitMessageComponent<T extends MessageComponentType = ComponentType.ActionRow>( public awaitMessageComponent<T extends MessageComponentType>(
options?: AwaitMessageCollectorOptionsParams<T, Cached>, options?: AwaitMessageCollectorOptionsParams<T, Cached>,
): Promise<MappedInteractionTypes<Cached>[T]>; ): Promise<MappedInteractionTypes<Cached>[T]>;
public createMessageComponentCollector<T extends MessageComponentType = ComponentType.ActionRow>( public createMessageComponentCollector<T extends MessageComponentType>(
options?: MessageCollectorOptionsParams<T, Cached>, options?: MessageCollectorOptionsParams<T, Cached>,
): InteractionCollector<MappedInteractionTypes<Cached>[T]>; ): InteractionCollector<MappedInteractionTypes<Cached>[T]>;
} }
@@ -746,7 +746,7 @@ export class CategoryChannel extends GuildChannel {
export type CategoryChannelResolvable = Snowflake | CategoryChannel; export type CategoryChannelResolvable = Snowflake | CategoryChannel;
export abstract class Channel extends Base { export abstract class BaseChannel extends Base {
public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean); public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean);
public get createdAt(): Date | null; public get createdAt(): Date | null;
public get createdTimestamp(): number | null; public get createdTimestamp(): number | null;
@@ -932,7 +932,7 @@ export class ChatInputCommandInteraction<Cached extends CacheType = CacheType> e
public toString(): string; public toString(): string;
} }
export class AutocompleteInteraction<Cached extends CacheType = CacheType> extends Interaction<Cached> { export class AutocompleteInteraction<Cached extends CacheType = CacheType> extends BaseInteraction<Cached> {
public type: InteractionType.ApplicationCommandAutocomplete; public type: InteractionType.ApplicationCommandAutocomplete;
public get command(): ApplicationCommand | ApplicationCommand<{ guild: GuildResolvable }> | null; public get command(): ApplicationCommand | ApplicationCommand<{ guild: GuildResolvable }> | null;
public channelId: Snowflake; public channelId: Snowflake;
@@ -1045,7 +1045,7 @@ export class DataResolver extends null {
public static resolveGuildTemplateCode(data: GuildTemplateResolvable): string; public static resolveGuildTemplateCode(data: GuildTemplateResolvable): string;
} }
export class DMChannel extends TextBasedChannelMixin(Channel, [ export class DMChannel extends TextBasedChannelMixin(BaseChannel, [
'bulkDelete', 'bulkDelete',
'fetchWebhooks', 'fetchWebhooks',
'createWebhook', 'createWebhook',
@@ -1226,7 +1226,7 @@ export class GuildBan extends Base {
public fetch(force?: boolean): Promise<GuildBan>; public fetch(force?: boolean): Promise<GuildBan>;
} }
export abstract class GuildChannel extends Channel { export abstract class GuildChannel extends BaseChannel {
public constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean); public constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean);
private memberPermissions(member: GuildMember, checkAdmin: boolean): Readonly<PermissionsBitField>; private memberPermissions(member: GuildMember, checkAdmin: boolean): Readonly<PermissionsBitField>;
private rolePermissions(role: Role, checkAdmin: boolean): Readonly<PermissionsBitField>; private rolePermissions(role: Role, checkAdmin: boolean): Readonly<PermissionsBitField>;
@@ -1486,7 +1486,7 @@ export type CacheTypeReducer<
? PresentType ? PresentType
: Fallback; : Fallback;
export type AnyInteraction<Cached extends CacheType = CacheType> = export type Interaction<Cached extends CacheType = CacheType> =
| ChatInputCommandInteraction<Cached> | ChatInputCommandInteraction<Cached>
| MessageContextMenuCommandInteraction<Cached> | MessageContextMenuCommandInteraction<Cached>
| UserContextMenuCommandInteraction<Cached> | UserContextMenuCommandInteraction<Cached>
@@ -1495,7 +1495,7 @@ export type AnyInteraction<Cached extends CacheType = CacheType> =
| AutocompleteInteraction<Cached> | AutocompleteInteraction<Cached>
| ModalSubmitInteraction<Cached>; | ModalSubmitInteraction<Cached>;
export class Interaction<Cached extends CacheType = CacheType> extends Base { export class BaseInteraction<Cached extends CacheType = CacheType> extends Base {
// This a technique used to brand different cached types. Or else we'll get `never` errors on typeguard checks. // This a technique used to brand different cached types. Or else we'll get `never` errors on typeguard checks.
private readonly _cacheType: Cached; private readonly _cacheType: Cached;
protected constructor(client: Client, data: RawInteractionData); protected constructor(client: Client, data: RawInteractionData);
@@ -1521,9 +1521,9 @@ export class Interaction<Cached extends CacheType = CacheType> extends Base {
public memberPermissions: CacheTypeReducer<Cached, Readonly<PermissionsBitField>>; public memberPermissions: CacheTypeReducer<Cached, Readonly<PermissionsBitField>>;
public locale: Locale; public locale: Locale;
public guildLocale: CacheTypeReducer<Cached, Locale>; public guildLocale: CacheTypeReducer<Cached, Locale>;
public inGuild(): this is Interaction<'raw' | 'cached'>; public inGuild(): this is BaseInteraction<'raw' | 'cached'>;
public inCachedGuild(): this is Interaction<'cached'>; public inCachedGuild(): this is BaseInteraction<'cached'>;
public inRawGuild(): this is Interaction<'raw'>; public inRawGuild(): this is BaseInteraction<'raw'>;
public isButton(): this is ButtonInteraction<Cached>; public isButton(): this is ButtonInteraction<Cached>;
public isChatInputCommand(): this is ChatInputCommandInteraction<Cached>; public isChatInputCommand(): this is ChatInputCommandInteraction<Cached>;
public isContextMenuCommand(): this is ContextMenuCommandInteraction<Cached>; public isContextMenuCommand(): this is ContextMenuCommandInteraction<Cached>;
@@ -1533,7 +1533,11 @@ export class Interaction<Cached extends CacheType = CacheType> extends Base {
public isRepliable(): this is this & InteractionResponseFields<Cached>; public isRepliable(): this is this & InteractionResponseFields<Cached>;
} }
export class InteractionCollector<T extends Interaction> extends Collector<Snowflake, T, [Collection<Snowflake, T>]> { export class InteractionCollector<T extends CollectedInteraction> extends Collector<
Snowflake,
T,
[Collection<Snowflake, T>]
> {
public constructor(client: Client, options?: InteractionCollectorOptions<T>); public constructor(client: Client, options?: InteractionCollectorOptions<T>);
private _handleMessageDeletion(message: Message): void; private _handleMessageDeletion(message: Message): void;
private _handleChannelDeletion(channel: NonThreadGuildBasedChannel): void; private _handleChannelDeletion(channel: NonThreadGuildBasedChannel): void;
@@ -1628,7 +1632,7 @@ export class LimitedCollection<K, V> extends Collection<K, V> {
public keepOverLimit: ((value: V, key: K, collection: this) => boolean) | null; public keepOverLimit: ((value: V, key: K, collection: this) => boolean) | null;
} }
export type MessageComponentType = Exclude<ComponentType, ComponentType.TextInput>; export type MessageComponentType = Exclude<ComponentType, ComponentType.TextInput | ComponentType.ActionRow>;
export type MessageCollectorOptionsParams<T extends MessageComponentType, Cached extends boolean = boolean> = export type MessageCollectorOptionsParams<T extends MessageComponentType, Cached extends boolean = boolean> =
| { | {
@@ -1657,8 +1661,6 @@ export type WrapBooleanCache<T extends boolean> = If<T, 'cached', CacheType>;
export interface MappedInteractionTypes<Cached extends boolean = boolean> { export interface MappedInteractionTypes<Cached extends boolean = boolean> {
[ComponentType.Button]: ButtonInteraction<WrapBooleanCache<Cached>>; [ComponentType.Button]: ButtonInteraction<WrapBooleanCache<Cached>>;
[ComponentType.SelectMenu]: SelectMenuInteraction<WrapBooleanCache<Cached>>; [ComponentType.SelectMenu]: SelectMenuInteraction<WrapBooleanCache<Cached>>;
[ComponentType.ActionRow]: MessageComponentInteraction<WrapBooleanCache<Cached>>;
[ComponentType.TextInput]: never;
} }
export class Message<Cached extends boolean = boolean> extends Base { export class Message<Cached extends boolean = boolean> extends Base {
@@ -1705,12 +1707,12 @@ export class Message<Cached extends boolean = boolean> extends Base {
public webhookId: Snowflake | null; public webhookId: Snowflake | null;
public flags: Readonly<MessageFlagsBitField>; public flags: Readonly<MessageFlagsBitField>;
public reference: MessageReference | null; public reference: MessageReference | null;
public awaitMessageComponent<T extends MessageComponentType = ComponentType.ActionRow>( public awaitMessageComponent<T extends MessageComponentType>(
options?: AwaitMessageCollectorOptionsParams<T, Cached>, options?: AwaitMessageCollectorOptionsParams<T, Cached>,
): Promise<MappedInteractionTypes<Cached>[T]>; ): Promise<MappedInteractionTypes<Cached>[T]>;
public awaitReactions(options?: AwaitReactionsOptions): Promise<Collection<Snowflake | string, MessageReaction>>; public awaitReactions(options?: AwaitReactionsOptions): Promise<Collection<Snowflake | string, MessageReaction>>;
public createReactionCollector(options?: ReactionCollectorOptions): ReactionCollector; public createReactionCollector(options?: ReactionCollectorOptions): ReactionCollector;
public createMessageComponentCollector<T extends MessageComponentType = ComponentType.ActionRow>( public createMessageComponentCollector<T extends MessageComponentType>(
options?: MessageCollectorOptionsParams<T, Cached>, options?: MessageCollectorOptionsParams<T, Cached>,
): InteractionCollector<MappedInteractionTypes<Cached>[T]>; ): InteractionCollector<MappedInteractionTypes<Cached>[T]>;
public delete(): Promise<Message>; public delete(): Promise<Message>;
@@ -1777,7 +1779,7 @@ export class MessageCollector extends Collector<Snowflake, Message, [Collection<
public dispose(message: Message): Snowflake | null; public dispose(message: Message): Snowflake | null;
} }
export class MessageComponentInteraction<Cached extends CacheType = CacheType> extends Interaction<Cached> { export class MessageComponentInteraction<Cached extends CacheType = CacheType> extends BaseInteraction<Cached> {
protected constructor(client: Client, data: RawMessageComponentInteractionData); protected constructor(client: Client, data: RawMessageComponentInteractionData);
public type: InteractionType.MessageComponent; public type: InteractionType.MessageComponent;
public get component(): CacheTypeReducer< public get component(): CacheTypeReducer<
@@ -1854,11 +1856,11 @@ export class MessageMentions {
everyone: boolean, everyone: boolean,
repliedUser?: APIUser | User, repliedUser?: APIUser | User,
); );
private _channels: Collection<Snowflake, AnyChannel> | null; private _channels: Collection<Snowflake, Channel> | null;
private readonly _content: string; private readonly _content: string;
private _members: Collection<Snowflake, GuildMember> | null; private _members: Collection<Snowflake, GuildMember> | null;
public get channels(): Collection<Snowflake, AnyChannel>; public get channels(): Collection<Snowflake, Channel>;
public readonly client: Client; public readonly client: Client;
public everyone: boolean; public everyone: boolean;
public readonly guild: Guild; public readonly guild: Guild;
@@ -1968,7 +1970,7 @@ export interface ModalMessageModalSubmitInteraction<Cached extends CacheType = C
inRawGuild(): this is ModalMessageModalSubmitInteraction<'raw'>; inRawGuild(): this is ModalMessageModalSubmitInteraction<'raw'>;
} }
export class ModalSubmitInteraction<Cached extends CacheType = CacheType> extends Interaction<Cached> { export class ModalSubmitInteraction<Cached extends CacheType = CacheType> extends BaseInteraction<Cached> {
private constructor(client: Client, data: APIModalSubmitInteraction); private constructor(client: Client, data: APIModalSubmitInteraction);
public type: InteractionType.ModalSubmit; public type: InteractionType.ModalSubmit;
public readonly customId: string; public readonly customId: string;
@@ -2011,7 +2013,7 @@ export class OAuth2Guild extends BaseGuild {
public permissions: Readonly<PermissionsBitField>; public permissions: Readonly<PermissionsBitField>;
} }
export class PartialGroupDMChannel extends Channel { export class PartialGroupDMChannel extends BaseChannel {
private constructor(client: Client, data: RawPartialGroupDMChannelData); private constructor(client: Client, data: RawPartialGroupDMChannelData);
public type: ChannelType.GroupDM; public type: ChannelType.GroupDM;
public name: string | null; public name: string | null;
@@ -2306,7 +2308,7 @@ export class StageChannel extends BaseGuildVoiceChannel {
public setTopic(topic: string): Promise<StageChannel>; public setTopic(topic: string): Promise<StageChannel>;
} }
export class DirectoryChannel extends Channel { export class DirectoryChannel extends BaseChannel {
public guild: InviteGuild; public guild: InviteGuild;
public guildId: Snowflake; public guildId: Snowflake;
public name: string; public name: string;
@@ -2487,7 +2489,7 @@ export interface PrivateThreadChannel extends ThreadChannel {
type: ChannelType.GuildPrivateThread; type: ChannelType.GuildPrivateThread;
} }
export class ThreadChannel extends TextBasedChannelMixin(Channel, ['fetchWebhooks', 'createWebhook', 'setNSFW']) { export class ThreadChannel extends TextBasedChannelMixin(BaseChannel, ['fetchWebhooks', 'createWebhook', 'setNSFW']) {
private constructor(guild: Guild, data?: RawThreadChannelData, client?: Client, fromInteraction?: boolean); private constructor(guild: Guild, data?: RawThreadChannelData, client?: Client, fromInteraction?: boolean);
public archived: boolean | null; public archived: boolean | null;
public get archivedAt(): Date | null; public get archivedAt(): Date | null;
@@ -2648,7 +2650,7 @@ export function parseEmoji(text: string): { animated: boolean; name: string; id:
export function resolveColor(color: ColorResolvable): number; export function resolveColor(color: ColorResolvable): number;
export function resolvePartialEmoji(emoji: EmojiIdentifierResolvable): Partial<APIPartialEmoji> | null; export function resolvePartialEmoji(emoji: EmojiIdentifierResolvable): Partial<APIPartialEmoji> | null;
export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string; export function verifyString(data: string, error?: typeof Error, errorMessage?: string, allowEmpty?: boolean): string;
export function setPosition<T extends AnyChannel | Role>( export function setPosition<T extends Channel | Role>(
item: T, item: T,
position: number, position: number,
relative: boolean, relative: boolean,
@@ -2677,7 +2679,7 @@ export interface CreateChannelOptions {
fromInteraction?: boolean; fromInteraction?: boolean;
} }
export function createChannel(client: Client, data: APIChannel, options?: CreateChannelOptions): AnyChannel; export function createChannel(client: Client, data: APIChannel, options?: CreateChannelOptions): Channel;
export function createComponent<T extends keyof MappedComponentTypes>( export function createComponent<T extends keyof MappedComponentTypes>(
data: APIMessageComponent & { type: T }, data: APIMessageComponent & { type: T },
@@ -3285,9 +3287,9 @@ export class CategoryChannelChildManager extends DataManager<
public create(options: CategoryCreateChannelOptions): Promise<TextChannel>; public create(options: CategoryCreateChannelOptions): Promise<TextChannel>;
} }
export class ChannelManager extends CachedManager<Snowflake, AnyChannel, ChannelResolvable> { export class ChannelManager extends CachedManager<Snowflake, Channel, ChannelResolvable> {
private constructor(client: Client, iterable: Iterable<RawChannelData>); private constructor(client: Client, iterable: Iterable<RawChannelData>);
public fetch(id: Snowflake, options?: FetchChannelOptions): Promise<AnyChannel | null>; public fetch(id: Snowflake, options?: FetchChannelOptions): Promise<Channel | null>;
} }
export type FetchGuildApplicationCommandFetchOptions = Omit<FetchApplicationCommandOptions, 'guildId'>; export type FetchGuildApplicationCommandFetchOptions = Omit<FetchApplicationCommandOptions, 'guildId'>;
@@ -3615,7 +3617,7 @@ export interface TextBasedChannelFields extends PartialTextBasedChannelFields {
lastPinTimestamp: number | null; lastPinTimestamp: number | null;
get lastPinAt(): Date | null; get lastPinAt(): Date | null;
messages: MessageManager; messages: MessageManager;
awaitMessageComponent<T extends MessageComponentType = ComponentType.ActionRow>( awaitMessageComponent<T extends MessageComponentType>(
options?: AwaitMessageCollectorOptionsParams<T, true>, options?: AwaitMessageCollectorOptionsParams<T, true>,
): Promise<MappedInteractionTypes[T]>; ): Promise<MappedInteractionTypes[T]>;
awaitMessages(options?: AwaitMessagesOptions): Promise<Collection<Snowflake, Message>>; awaitMessages(options?: AwaitMessagesOptions): Promise<Collection<Snowflake, Message>>;
@@ -3623,7 +3625,7 @@ export interface TextBasedChannelFields extends PartialTextBasedChannelFields {
messages: Collection<Snowflake, Message> | readonly MessageResolvable[] | number, messages: Collection<Snowflake, Message> | readonly MessageResolvable[] | number,
filterOld?: boolean, filterOld?: boolean,
): Promise<Collection<Snowflake, Message>>; ): Promise<Collection<Snowflake, Message>>;
createMessageComponentCollector<T extends MessageComponentType = ComponentType.ActionRow>( createMessageComponentCollector<T extends MessageComponentType>(
options?: MessageChannelCollectorOptionsParams<T, true>, options?: MessageChannelCollectorOptionsParams<T, true>,
): InteractionCollector<MappedInteractionTypes[T]>; ): InteractionCollector<MappedInteractionTypes[T]>;
createMessageCollector(options?: MessageCollectorOptions): MessageCollector; createMessageCollector(options?: MessageCollectorOptions): MessageCollector;
@@ -3896,7 +3898,7 @@ export interface AuditLogChange {
export type Awaitable<T> = T | PromiseLike<T>; export type Awaitable<T> = T | PromiseLike<T>;
export type AwaitMessageComponentOptions<T extends MessageComponentInteraction> = Omit< export type AwaitMessageComponentOptions<T extends CollectedMessageInteraction> = Omit<
MessageComponentCollectorOptions<T>, MessageComponentCollectorOptions<T>,
'max' | 'maxComponents' | 'maxUsers' 'max' | 'maxComponents' | 'maxUsers'
>; >;
@@ -4038,7 +4040,7 @@ export interface ChannelPosition {
} }
export type GuildTextChannelResolvable = TextChannel | NewsChannel | Snowflake; export type GuildTextChannelResolvable = TextChannel | NewsChannel | Snowflake;
export type ChannelResolvable = AnyChannel | Snowflake; export type ChannelResolvable = Channel | Snowflake;
export interface ChannelWebhookCreateOptions { export interface ChannelWebhookCreateOptions {
name: string; name: string;
@@ -4115,7 +4117,7 @@ export interface ClientEvents {
userUpdate: [oldUser: User | PartialUser, newUser: User]; userUpdate: [oldUser: User | PartialUser, newUser: User];
voiceStateUpdate: [oldState: VoiceState, newState: VoiceState]; voiceStateUpdate: [oldState: VoiceState, newState: VoiceState];
webhookUpdate: [channel: TextChannel | NewsChannel | VoiceChannel]; webhookUpdate: [channel: TextChannel | NewsChannel | VoiceChannel];
interactionCreate: [interaction: AnyInteraction]; interactionCreate: [interaction: Interaction];
shardDisconnect: [closeEvent: CloseEvent, shardId: number]; shardDisconnect: [closeEvent: CloseEvent, shardId: number];
shardError: [error: Error, shardId: number]; shardError: [error: Error, shardId: number];
shardReady: [shardId: number, unavailableGuilds: Set<Snowflake> | undefined]; shardReady: [shardId: number, unavailableGuilds: Set<Snowflake> | undefined];
@@ -4218,7 +4220,7 @@ export interface CommandInteractionResolvedData<Cached extends CacheType = Cache
users?: Collection<Snowflake, User>; users?: Collection<Snowflake, User>;
members?: Collection<Snowflake, CacheTypeReducer<Cached, GuildMember, APIInteractionDataResolvedGuildMember>>; members?: Collection<Snowflake, CacheTypeReducer<Cached, GuildMember, APIInteractionDataResolvedGuildMember>>;
roles?: Collection<Snowflake, CacheTypeReducer<Cached, Role, APIRole>>; roles?: Collection<Snowflake, CacheTypeReducer<Cached, Role, APIRole>>;
channels?: Collection<Snowflake, CacheTypeReducer<Cached, AnyChannel, APIInteractionDataResolvedChannel>>; channels?: Collection<Snowflake, CacheTypeReducer<Cached, Channel, APIInteractionDataResolvedChannel>>;
messages?: Collection<Snowflake, CacheTypeReducer<Cached, Message, APIMessage>>; messages?: Collection<Snowflake, CacheTypeReducer<Cached, Message, APIMessage>>;
attachments?: Collection<Snowflake, Attachment>; attachments?: Collection<Snowflake, Attachment>;
} }
@@ -4857,7 +4859,12 @@ export interface IntegrationAccount {
export type IntegrationType = 'twitch' | 'youtube' | 'discord'; export type IntegrationType = 'twitch' | 'youtube' | 'discord';
export interface InteractionCollectorOptions<T extends Interaction, Cached extends CacheType = CacheType> export type CollectedInteraction<Cached extends CacheType = CacheType> =
| SelectMenuInteraction<Cached>
| ButtonInteraction<Cached>
| ModalSubmitInteraction<Cached>;
export interface InteractionCollectorOptions<T extends CollectedInteraction, Cached extends CacheType = CacheType>
extends CollectorOptions<[T, Collection<Snowflake, T>]> { extends CollectorOptions<[T, Collection<Snowflake, T>]> {
channel?: TextBasedChannelResolvable; channel?: TextBasedChannelResolvable;
componentType?: ComponentType; componentType?: ComponentType;
@@ -4962,12 +4969,17 @@ export type MessageComponent =
| ButtonComponent | ButtonComponent
| SelectMenuComponent; | SelectMenuComponent;
export type MessageComponentCollectorOptions<T extends MessageComponentInteraction> = Omit< export type CollectedMessageInteraction<Cached extends CacheType = CacheType> = Exclude<
CollectedInteraction<Cached>,
ModalSubmitInteraction
>;
export type MessageComponentCollectorOptions<T extends CollectedMessageInteraction> = Omit<
InteractionCollectorOptions<T>, InteractionCollectorOptions<T>,
'channel' | 'message' | 'guild' | 'interactionType' 'channel' | 'message' | 'guild' | 'interactionType'
>; >;
export type MessageChannelComponentCollectorOptions<T extends MessageComponentInteraction> = Omit< export type MessageChannelComponentCollectorOptions<T extends CollectedMessageInteraction> = Omit<
InteractionCollectorOptions<T>, InteractionCollectorOptions<T>,
'channel' | 'guild' | 'interactionType' 'channel' | 'guild' | 'interactionType'
>; >;
@@ -5367,7 +5379,7 @@ export interface LimitedCollectionOptions<K, V> {
keepOverLimit?: (value: V, key: K, collection: LimitedCollection<K, V>) => boolean; keepOverLimit?: (value: V, key: K, collection: LimitedCollection<K, V>) => boolean;
} }
export type AnyChannel = export type Channel =
| CategoryChannel | CategoryChannel
| DMChannel | DMChannel
| PartialDMChannel | PartialDMChannel
@@ -5378,13 +5390,13 @@ export type AnyChannel =
| AnyThreadChannel | AnyThreadChannel
| VoiceChannel; | VoiceChannel;
export type TextBasedChannel = Extract<AnyChannel, { messages: MessageManager }>; export type TextBasedChannel = Extract<Channel, { messages: MessageManager }>;
export type TextBasedChannelTypes = TextBasedChannel['type']; export type TextBasedChannelTypes = TextBasedChannel['type'];
export type VoiceBasedChannel = Extract<AnyChannel, { bitrate: number }>; export type VoiceBasedChannel = Extract<Channel, { bitrate: number }>;
export type GuildBasedChannel = Extract<AnyChannel, { guild: Guild }>; export type GuildBasedChannel = Extract<Channel, { guild: Guild }>;
export type NonCategoryGuildBasedChannel = Exclude<GuildBasedChannel, CategoryChannel>; export type NonCategoryGuildBasedChannel = Exclude<GuildBasedChannel, CategoryChannel>;

View File

@@ -127,6 +127,7 @@ import {
UserContextMenuCommandInteraction, UserContextMenuCommandInteraction,
AnyThreadChannel, AnyThreadChannel,
ThreadMemberManager, ThreadMemberManager,
CollectedMessageInteraction,
} from '.'; } from '.';
import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd'; import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd';
import { UnsafeButtonBuilder, UnsafeEmbedBuilder, UnsafeSelectMenuBuilder } from '@discordjs/builders'; import { UnsafeButtonBuilder, UnsafeEmbedBuilder, UnsafeSelectMenuBuilder } from '@discordjs/builders';
@@ -754,13 +755,13 @@ client.on('messageCreate', async message => {
const defaultCollector = message.createMessageComponentCollector(); const defaultCollector = message.createMessageComponentCollector();
expectAssignable<Promise<MessageComponentInteraction>>(message.awaitMessageComponent()); expectAssignable<Promise<MessageComponentInteraction>>(message.awaitMessageComponent());
expectAssignable<Promise<MessageComponentInteraction>>(channel.awaitMessageComponent()); expectAssignable<Promise<MessageComponentInteraction>>(channel.awaitMessageComponent());
expectAssignable<InteractionCollector<MessageComponentInteraction>>(defaultCollector); expectAssignable<InteractionCollector<CollectedMessageInteraction>>(defaultCollector);
// Verify that additional options don't affect default collector types. // Verify that additional options don't affect default collector types.
const semiDefaultCollector = message.createMessageComponentCollector({ time: 10000 }); const semiDefaultCollector = message.createMessageComponentCollector({ time: 10000 });
expectType<InteractionCollector<MessageComponentInteraction>>(semiDefaultCollector); expectType<InteractionCollector<CollectedMessageInteraction>>(semiDefaultCollector);
const semiDefaultCollectorChannel = message.createMessageComponentCollector({ time: 10000 }); const semiDefaultCollectorChannel = message.createMessageComponentCollector({ time: 10000 });
expectType<InteractionCollector<MessageComponentInteraction>>(semiDefaultCollectorChannel); expectType<InteractionCollector<CollectedMessageInteraction>>(semiDefaultCollectorChannel);
// Verify that interaction collector options can't be used. // Verify that interaction collector options can't be used.
message.createMessageComponentCollector({ message.createMessageComponentCollector({
@@ -771,7 +772,7 @@ client.on('messageCreate', async message => {
// Make sure filter parameters are properly inferred. // Make sure filter parameters are properly inferred.
message.createMessageComponentCollector({ message.createMessageComponentCollector({
filter: i => { filter: i => {
expectType<MessageComponentInteraction>(i); expectType<CollectedMessageInteraction>(i);
return true; return true;
}, },
}); });
@@ -794,7 +795,7 @@ client.on('messageCreate', async message => {
message.awaitMessageComponent({ message.awaitMessageComponent({
filter: i => { filter: i => {
expectType<MessageComponentInteraction>(i); expectType<CollectedMessageInteraction>(i);
return true; return true;
}, },
}); });
@@ -830,7 +831,7 @@ client.on('messageCreate', async message => {
channel.awaitMessageComponent({ channel.awaitMessageComponent({
filter: i => { filter: i => {
expectType<MessageComponentInteraction<'cached'>>(i); expectType<CollectedMessageInteraction<'cached'>>(i);
return true; return true;
}, },
}); });