diff --git a/packages/discord.js/scripts/generateRequires.mjs b/packages/discord.js/scripts/generateRequires.mjs index 52897016e..e0029d998 100644 --- a/packages/discord.js/scripts/generateRequires.mjs +++ b/packages/discord.js/scripts/generateRequires.mjs @@ -123,9 +123,15 @@ declare class ActionsManager { dtsLines.push(` ${fileName}: Action<[import('discord-api-types/v10').GatewayMessagePollVoteDispatchData]>;`); break; } + case 'ChannelCreate': { + dtsLines.push( + ` ${fileName}: Action<[import('discord-api-types/v10').GatewayChannelCreateDispatchData], { channel?: BaseChannel | null }>;`, + ); + break; + } case 'ChannelUpdate': { dtsLines.push( - ` ${fileName}: Action<[import('discord-api-types/v10').GatewayChannelUpdateDispatchData], { old?: BaseChannel; updated?: BaseChannel; }>;`, + ` ${fileName}: Action<[import('discord-api-types/v10').GatewayChannelUpdateDispatchData], { old?: BaseChannel | null; updated?: BaseChannel; }>;`, ); break; } diff --git a/packages/discord.js/src/client/actions/Action.js b/packages/discord.js/src/client/actions/Action.js index b44292165..d55041696 100644 --- a/packages/discord.js/src/client/actions/Action.js +++ b/packages/discord.js/src/client/actions/Action.js @@ -2,6 +2,7 @@ /** * @import Client from '../Client'; + * @import CachedManager from '../../managers/CachedManager'; */ const Partials = require('../../util/Partials'); @@ -21,6 +22,7 @@ that WebSocket events don't clash with REST methods. /** * @template {any[]} Arguments * @template {any} [ReturnType=void] + * @ignore */ class GenericAction { /** @@ -35,6 +37,7 @@ class GenericAction { /** * @param {Arguments} _args Arguments passed to the handler * @returns {ReturnType} + * @ignore */ handle(..._args) { /** @type {any} */ @@ -42,6 +45,14 @@ class GenericAction { return casted; } + /** + * @param {unknown} data The data to add + * @param {CachedManager} manager The manager the data is for + * @param {string} id The id of the entry + * @param {Partials} partialType If a partial structure is supported, the type of partial + * @param {boolean} cache Whether the added data should be cached + * @returns {unknown} + */ getPayload(data, manager, id, partialType, cache) { return this.client.options.partials.includes(partialType) ? manager._add(data, cache) : manager.cache.get(id); } diff --git a/packages/discord.js/src/client/actions/ActionsManager.d.ts b/packages/discord.js/src/client/actions/ActionsManager.d.ts index c48679968..de49a8db6 100644 --- a/packages/discord.js/src/client/actions/ActionsManager.d.ts +++ b/packages/discord.js/src/client/actions/ActionsManager.d.ts @@ -25,11 +25,14 @@ declare class ActionsManager { AutoModerationRuleCreate: Action<[import('discord-api-types/v10').GatewayAutoModerationRuleCreateDispatchData]>; AutoModerationRuleDelete: Action<[import('discord-api-types/v10').GatewayAutoModerationRuleDeleteDispatchData]>; AutoModerationRuleUpdate: Action<[import('discord-api-types/v10').GatewayAutoModerationRuleUpdateDispatchData]>; - ChannelCreate: Action<[import('discord-api-types/v10').GatewayChannelCreateDispatchData]>; + ChannelCreate: Action< + [import('discord-api-types/v10').GatewayChannelCreateDispatchData], + { channel?: BaseChannel | null } + >; ChannelDelete: Action<[import('discord-api-types/v10').GatewayChannelDeleteDispatchData]>; ChannelUpdate: Action< [import('discord-api-types/v10').GatewayChannelUpdateDispatchData], - { old?: BaseChannel; updated?: BaseChannel } + { old?: BaseChannel | null; updated?: BaseChannel } >; EntitlementCreate: Action<[import('discord-api-types/v10').GatewayEntitlementCreateDispatchData]>; EntitlementDelete: Action<[import('discord-api-types/v10').GatewayEntitlementDeleteDispatchData]>; diff --git a/packages/discord.js/src/client/actions/ApplicationCommandPermissionsUpdate.js b/packages/discord.js/src/client/actions/ApplicationCommandPermissionsUpdate.js index f2bc214d2..5ef987edf 100644 --- a/packages/discord.js/src/client/actions/ApplicationCommandPermissionsUpdate.js +++ b/packages/discord.js/src/client/actions/ApplicationCommandPermissionsUpdate.js @@ -12,7 +12,16 @@ const Events = require('../../util/Events'); * @property {ApplicationCommandPermissions[]} permissions The updated permissions */ +/** + * @extends {Action<[import('discord-api-types/v10').GatewayApplicationCommandPermissionsUpdateDispatchData]>} + * @private + * @internal + */ class ApplicationCommandPermissionsUpdateAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayApplicationCommandPermissionsUpdateDispatchData} data + */ handle(data) { const client = this.client; /** diff --git a/packages/discord.js/src/client/actions/AutoModerationActionExecution.js b/packages/discord.js/src/client/actions/AutoModerationActionExecution.js index ad601167c..3d2792618 100644 --- a/packages/discord.js/src/client/actions/AutoModerationActionExecution.js +++ b/packages/discord.js/src/client/actions/AutoModerationActionExecution.js @@ -4,7 +4,16 @@ const Action = require('./Action'); const AutoModerationActionExecution = require('../../structures/AutoModerationActionExecution'); const Events = require('../../util/Events'); +/** + * @extends {Action<[import('discord-api-types/v10').GatewayAutoModerationActionExecutionDispatchData]>} + * @private + * @internal + */ class AutoModerationActionExecutionAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayAutoModerationActionExecutionDispatchData} data + */ handle(data) { const { client } = this; const guild = client.guilds.cache.get(data.guild_id); diff --git a/packages/discord.js/src/client/actions/AutoModerationRuleCreate.js b/packages/discord.js/src/client/actions/AutoModerationRuleCreate.js index 775b1d370..5c44a3e9e 100644 --- a/packages/discord.js/src/client/actions/AutoModerationRuleCreate.js +++ b/packages/discord.js/src/client/actions/AutoModerationRuleCreate.js @@ -3,7 +3,16 @@ const Action = require('./Action'); const Events = require('../../util/Events'); +/** + * @extends {Action<[import('discord-api-types/v10').GatewayAutoModerationRuleCreateDispatchData]>} + * @private + * @internal + */ class AutoModerationRuleCreateAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayAutoModerationRuleCreateDispatchData} data + */ handle(data) { const { client } = this; const guild = client.guilds.cache.get(data.guild_id); diff --git a/packages/discord.js/src/client/actions/AutoModerationRuleDelete.js b/packages/discord.js/src/client/actions/AutoModerationRuleDelete.js index 641822c24..ed5a0b8d1 100644 --- a/packages/discord.js/src/client/actions/AutoModerationRuleDelete.js +++ b/packages/discord.js/src/client/actions/AutoModerationRuleDelete.js @@ -3,7 +3,16 @@ const Action = require('./Action'); const Events = require('../../util/Events'); +/** + * @extends {Action<[import('discord-api-types/v10').GatewayAutoModerationRuleDeleteDispatchData]>} + * @private + * @internal + */ class AutoModerationRuleDeleteAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayAutoModerationRuleDeleteDispatchData} data + */ handle(data) { const { client } = this; const guild = client.guilds.cache.get(data.guild_id); diff --git a/packages/discord.js/src/client/actions/AutoModerationRuleUpdate.js b/packages/discord.js/src/client/actions/AutoModerationRuleUpdate.js index 56e39568c..e3a78f452 100644 --- a/packages/discord.js/src/client/actions/AutoModerationRuleUpdate.js +++ b/packages/discord.js/src/client/actions/AutoModerationRuleUpdate.js @@ -3,7 +3,16 @@ const Action = require('./Action'); const Events = require('../../util/Events'); +/** + * @extends {Action<[import('discord-api-types/v10').GatewayAutoModerationRuleDeleteDispatchData]>} + * @private + * @internal + */ class AutoModerationRuleUpdateAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayAutoModerationRuleDeleteDispatchData} data + */ handle(data) { const { client } = this; const guild = client.guilds.cache.get(data.guild_id); diff --git a/packages/discord.js/src/client/actions/ChannelCreate.js b/packages/discord.js/src/client/actions/ChannelCreate.js index fdf8dddd4..88d81f1a7 100644 --- a/packages/discord.js/src/client/actions/ChannelCreate.js +++ b/packages/discord.js/src/client/actions/ChannelCreate.js @@ -1,13 +1,27 @@ 'use strict'; +/** + * @import { BaseChannel } from '../../structures/BaseChannel'; + */ + const Action = require('./Action'); const Events = require('../../util/Events'); +/** + * @extends {Action<[import('discord-api-types/v10').GatewayChannelCreateDispatchData], { channel?: BaseChannel | null }>} + * @private + * @internal + */ class ChannelCreateAction extends Action { + /** + * @override + * @param {import('discord-api-types/v10').GatewayChannelCreateDispatchData} data + */ handle(data) { const client = this.client; const existing = client.channels.cache.has(data.id); const channel = client.channels._add(data); + if (!existing && channel) { /** * Emitted whenever a guild channel is created. @@ -16,6 +30,7 @@ class ChannelCreateAction extends Action { */ client.emit(Events.ChannelCreate, channel); } + return { channel }; } } diff --git a/packages/discord.js/src/managers/BaseManager.d.ts b/packages/discord.js/src/managers/BaseManager.d.ts new file mode 100644 index 000000000..2bc2e651d --- /dev/null +++ b/packages/discord.js/src/managers/BaseManager.d.ts @@ -0,0 +1,8 @@ +import Client from '../client/Client'; + +declare class BaseManager { + readonly client: Client; + constructor(client: Client); +} + +export = BaseManager; diff --git a/packages/discord.js/src/managers/ChannelManager.js b/packages/discord.js/src/managers/ChannelManager.js index 0126d9144..6860e348a 100644 --- a/packages/discord.js/src/managers/ChannelManager.js +++ b/packages/discord.js/src/managers/ChannelManager.js @@ -1,5 +1,10 @@ 'use strict'; +/** + * @import { Guild } from '../structures/Guild'; + * @import Client from '../client/Client'; + */ + const process = require('node:process'); const { Routes } = require('discord-api-types/v10'); const CachedManager = require('./CachedManager'); @@ -15,12 +20,19 @@ let cacheWarningEmitted = false; * @extends {CachedManager} */ class ChannelManager extends CachedManager { + /** + * @ignore + * @param {Client} client The client + * @param {unknown[]} iterable existing channels + */ constructor(client, iterable) { super(client, BaseChannel, iterable); + const defaultCaching = this._cache.constructor.name === 'Collection' || this._cache.maxSize === undefined || this._cache.maxSize === Infinity; + if (!cacheWarningEmitted && !defaultCaching) { cacheWarningEmitted = true; process.emitWarning( @@ -36,6 +48,15 @@ class ChannelManager extends CachedManager { * @name ChannelManager#cache */ + // eslint-disable-next-line valid-jsdoc + /** + * @ignore + * @param {import('discord-api-types/v10').APIChannel} data + * @param {Guild} [guild] + * @param {{ cache?: boolean; allowUnknownGuild?: boolean; }} [options] + * @returns {?BaseChannel} + * @override + */ _add(data, guild, { cache = true, allowUnknownGuild = false } = {}) { const existing = this.cache.get(data.id); if (existing) { diff --git a/packages/discord.js/src/util/Channels.js b/packages/discord.js/src/util/Channels.js index aaf2152a1..f159be9f7 100644 --- a/packages/discord.js/src/util/Channels.js +++ b/packages/discord.js/src/util/Channels.js @@ -18,7 +18,7 @@ const getMediaChannel = lazy(() => require('../structures/MediaChannel')); /** * Extra options for creating a channel. * @typedef {Object} CreateChannelOptions - * @property {boolean} [allowFromUnknownGuild] Whether to allow creating a channel from an unknown guild + * @property {boolean} [allowUnknownGuild] Whether to allow creating a channel from an unknown guild * @private */