From cc25455d2c75177e3eddc880b7fd53cb122387c4 Mon Sep 17 00:00:00 2001 From: Almeida Date: Wed, 9 Feb 2022 08:17:45 +0000 Subject: [PATCH] refactor: replace `WSCodes`, `WSEvents`, and `InviteScopes` with `discord-api-types` equivalent (#7409) --- .../discord.js/scripts/generateRequires.mjs | 4 +- packages/discord.js/src/client/Client.js | 14 +- .../src/client/websocket/WebSocketManager.js | 35 ++-- .../src/client/websocket/WebSocketShard.js | 9 +- packages/discord.js/src/errors/Messages.js | 6 + packages/discord.js/src/index.js | 3 + packages/discord.js/src/util/Constants.js | 161 ------------------ packages/discord.js/typings/index.d.ts | 84 +-------- 8 files changed, 48 insertions(+), 268 deletions(-) diff --git a/packages/discord.js/scripts/generateRequires.mjs b/packages/discord.js/scripts/generateRequires.mjs index 4b8ab236a..dfafb3a40 100644 --- a/packages/discord.js/scripts/generateRequires.mjs +++ b/packages/discord.js/scripts/generateRequires.mjs @@ -1,10 +1,10 @@ import { readdir, writeFile } from 'node:fs/promises'; -import { Constants } from '../src/index.js'; +import { GatewayDispatchEvents } from '../src/index.js'; async function writeWebsocketHandlerImports() { const lines = ["'use strict';\n", 'const handlers = Object.fromEntries([']; - for (const name of Object.keys(Constants.WSEvents)) { + for (const name of Object.values(GatewayDispatchEvents)) { lines.push(` ['${name}', require('./${name}')],`); } diff --git a/packages/discord.js/src/client/Client.js b/packages/discord.js/src/client/Client.js index 0a3508c06..d9469043c 100644 --- a/packages/discord.js/src/client/Client.js +++ b/packages/discord.js/src/client/Client.js @@ -2,7 +2,7 @@ const process = require('node:process'); const { Collection } = require('@discordjs/collection'); -const { Routes } = require('discord-api-types/v9'); +const { OAuth2Scopes, Routes } = require('discord-api-types/v9'); const BaseClient = require('./BaseClient'); const ActionsManager = require('./actions/ActionsManager'); const ClientVoiceManager = require('./voice/ClientVoiceManager'); @@ -22,7 +22,6 @@ const StickerPack = require('../structures/StickerPack'); const VoiceRegion = require('../structures/VoiceRegion'); const Webhook = require('../structures/Webhook'); const Widget = require('../structures/Widget'); -const { InviteScopes } = require('../util/Constants'); const DataResolver = require('../util/DataResolver'); const Events = require('../util/Events'); const IntentsBitField = require('../util/IntentsBitField'); @@ -388,7 +387,7 @@ class Client extends BaseClient { /** * Options for {@link Client#generateInvite}. * @typedef {Object} InviteGenerationOptions - * @property {InviteScope[]} scopes Scopes that should be requested + * @property {OAuth2Scopes[]} scopes Scopes that should be requested * @property {PermissionResolvable} [permissions] Permissions to request * @property {GuildResolvable} [guild] Guild to preselect * @property {boolean} [disableGuildSelect] Whether to disable the guild selection @@ -400,7 +399,7 @@ class Client extends BaseClient { * @returns {string} * @example * const link = client.generateInvite({ - * scopes: ['applications.commands'], + * scopes: [OAuth2Scopes.ApplicationsCommands], * }); * console.log(`Generated application invite link: ${link}`); * @example @@ -410,7 +409,7 @@ class Client extends BaseClient { * PermissionFlagsBits.ManageGuild, * PermissionFlagsBits.MentionEveryone, * ], - * scopes: ['bot'], + * scopes: [OAuth2Scopes.Bot], * }); * console.log(`Generated bot invite link: ${link}`); */ @@ -429,10 +428,11 @@ class Client extends BaseClient { if (!Array.isArray(scopes)) { throw new TypeError('INVALID_TYPE', 'scopes', 'Array of Invite Scopes', true); } - if (!scopes.some(scope => ['bot', 'applications.commands'].includes(scope))) { + if (!scopes.some(scope => [OAuth2Scopes.Bot, OAuth2Scopes.ApplicationsCommands].includes(scope))) { throw new TypeError('INVITE_MISSING_SCOPES'); } - const invalidScope = scopes.find(scope => !InviteScopes.includes(scope)); + const validScopes = Object.values(OAuth2Scopes); + const invalidScope = scopes.find(scope => !validScopes.includes(scope)); if (invalidScope) { throw new TypeError('INVALID_ELEMENT', 'Array', 'scopes', invalidScope); } diff --git a/packages/discord.js/src/client/websocket/WebSocketManager.js b/packages/discord.js/src/client/websocket/WebSocketManager.js index 3f08130b6..d716197bc 100644 --- a/packages/discord.js/src/client/websocket/WebSocketManager.js +++ b/packages/discord.js/src/client/websocket/WebSocketManager.js @@ -4,31 +4,32 @@ const EventEmitter = require('node:events'); const { setImmediate } = require('node:timers'); const { setTimeout: sleep } = require('node:timers/promises'); const { Collection } = require('@discordjs/collection'); -const { Routes, RPCErrorCodes } = require('discord-api-types/v9'); +const { GatewayCloseCodes, GatewayDispatchEvents, Routes } = require('discord-api-types/v9'); const WebSocketShard = require('./WebSocketShard'); const PacketHandlers = require('./handlers'); const { Error } = require('../../errors'); -const { WSCodes, WSEvents } = require('../../util/Constants'); const Events = require('../../util/Events'); const ShardEvents = require('../../util/ShardEvents'); const Status = require('../../util/Status'); const BeforeReadyWhitelist = [ - WSEvents.READY, - WSEvents.RESUMED, - WSEvents.GUILD_CREATE, - WSEvents.GUILD_DELETE, - WSEvents.GUILD_MEMBERS_CHUNK, - WSEvents.GUILD_MEMBER_ADD, - WSEvents.GUILD_MEMBER_REMOVE, + GatewayDispatchEvents.Ready, + GatewayDispatchEvents.Resumed, + GatewayDispatchEvents.GuildCreate, + GatewayDispatchEvents.GuildDelete, + GatewayDispatchEvents.GuildMembersChunk, + GatewayDispatchEvents.GuildMemberAdd, + GatewayDispatchEvents.GuildMemberRemove, ]; -const UNRECOVERABLE_CLOSE_CODES = Object.keys(WSCodes).slice(1).map(Number); -const UNRESUMABLE_CLOSE_CODES = [ - RPCErrorCodes.UnknownError, - RPCErrorCodes.InvalidPermissions, - RPCErrorCodes.InvalidClientId, +const UNRECOVERABLE_CLOSE_CODES = [ + GatewayCloseCodes.AuthenticationFailed, + GatewayCloseCodes.InvalidShard, + GatewayCloseCodes.ShardingRequired, + GatewayCloseCodes.InvalidIntents, + GatewayCloseCodes.DisallowedIntents, ]; +const UNRESUMABLE_CLOSE_CODES = [1000, GatewayCloseCodes.AlreadyAuthenticated, GatewayCloseCodes.InvalidSeq]; /** * The WebSocket manager for this client. @@ -129,7 +130,7 @@ class WebSocketManager extends EventEmitter { * @private */ async connect() { - const invalidToken = new Error(WSCodes[4004]); + const invalidToken = new Error(GatewayCloseCodes[GatewayCloseCodes.AuthenticationFailed]); const { url: gatewayURL, shards: recommendedShards, @@ -201,7 +202,7 @@ class WebSocketManager extends EventEmitter { * @param {number} id The shard id that disconnected */ this.client.emit(Events.ShardDisconnect, event, shard.id); - this.debug(WSCodes[event.code], shard); + this.debug(GatewayCloseCodes[event.code], shard); return; } @@ -250,7 +251,7 @@ class WebSocketManager extends EventEmitter { await shard.connect(); } catch (error) { if (error?.code && UNRECOVERABLE_CLOSE_CODES.includes(error.code)) { - throw new Error(WSCodes[error.code]); + throw new Error(GatewayCloseCodes[error.code]); // Undefined if session is invalid, error event for regular closes } else if (!error || error.code) { this.debug('Failed to connect to the gateway, requeueing...', shard); diff --git a/packages/discord.js/src/client/websocket/WebSocketShard.js b/packages/discord.js/src/client/websocket/WebSocketShard.js index 7d2e952db..1098f1703 100644 --- a/packages/discord.js/src/client/websocket/WebSocketShard.js +++ b/packages/discord.js/src/client/websocket/WebSocketShard.js @@ -2,9 +2,8 @@ const EventEmitter = require('node:events'); const { setTimeout, setInterval, clearTimeout, clearInterval } = require('node:timers'); -const { GatewayIntentBits, GatewayOpcodes } = require('discord-api-types/v9'); +const { GatewayDispatchEvents, GatewayIntentBits, GatewayOpcodes } = require('discord-api-types/v9'); const WebSocket = require('../../WebSocket'); -const { WSEvents } = require('../../util/Constants'); const Events = require('../../util/Events'); const IntentsBitField = require('../../util/IntentsBitField'); const ShardEvents = require('../../util/ShardEvents'); @@ -380,7 +379,7 @@ class WebSocketShard extends EventEmitter { } switch (packet.t) { - case WSEvents.READY: + case GatewayDispatchEvents.Ready: /** * Emitted when the shard receives the READY payload and is now waiting for guilds * @event WebSocketShard#ready @@ -394,7 +393,7 @@ class WebSocketShard extends EventEmitter { this.lastHeartbeatAcked = true; this.sendHeartbeat('ReadyHeartbeat'); break; - case WSEvents.RESUMED: { + case GatewayDispatchEvents.Resumed: { /** * Emitted when the shard resumes successfully * @event WebSocketShard#resumed @@ -446,7 +445,7 @@ class WebSocketShard extends EventEmitter { break; default: this.manager.handlePacket(packet, this); - if (this.status === Status.WaitingForGuilds && packet.t === WSEvents.GUILD_CREATE) { + if (this.status === Status.WaitingForGuilds && packet.t === GatewayDispatchEvents.GuildCreate) { this.expectedGuilds.delete(packet.d.id); this.checkReady(); } diff --git a/packages/discord.js/src/errors/Messages.js b/packages/discord.js/src/errors/Messages.js index c93563d88..0553f2ec4 100644 --- a/packages/discord.js/src/errors/Messages.js +++ b/packages/discord.js/src/errors/Messages.js @@ -148,4 +148,10 @@ const Messages = { SWEEP_FILTER_RETURN: 'The return value of the sweepFilter function was not false or a Function', }; +Messages.AuthenticationFailed = Messages.TOKEN_INVALID; +Messages.InvalidShard = Messages.SHARDING_INVALID; +Messages.ShardingRequired = Messages.SHARDING_REQUIRED; +Messages.InvalidIntents = Messages.INVALID_INTENTS; +Messages.DisallowedIntents = Messages.DISALLOWED_INTENTS; + for (const [name, message] of Object.entries(Messages)) register(name, message); diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index 901c31e01..f523f59b4 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -164,6 +164,8 @@ exports.ApplicationCommandPermissionType = require('discord-api-types/v9').Appli exports.ButtonStyle = require('discord-api-types/v9').ButtonStyle; exports.ChannelType = require('discord-api-types/v9').ChannelType; exports.ComponentType = require('discord-api-types/v9').ComponentType; +exports.GatewayCloseCodes = require('discord-api-types/v9').GatewayCloseCodes; +exports.GatewayDispatchEvents = require('discord-api-types/v9').GatewayDispatchEvents; exports.GatewayIntentBits = require('discord-api-types/v9').GatewayIntentBits; exports.GatewayOpcodes = require('discord-api-types/v9').GatewayOpcodes; exports.GuildFeature = require('discord-api-types/v9').GuildFeature; @@ -180,6 +182,7 @@ exports.InteractionResponseType = require('discord-api-types/v9').InteractionRes exports.InviteTargetType = require('discord-api-types/v9').InviteTargetType; exports.MessageType = require('discord-api-types/v9').MessageType; exports.MessageFlags = require('discord-api-types/v9').MessageFlags; +exports.OAuth2Scopes = require('discord-api-types/v9').OAuth2Scopes; exports.PermissionFlagsBits = require('discord-api-types/v9').PermissionFlagsBits; exports.RESTJSONErrorCodes = require('discord-api-types/v9').RESTJSONErrorCodes; exports.StageInstancePrivacyLevel = require('discord-api-types/v9').StageInstancePrivacyLevel; diff --git a/packages/discord.js/src/util/Constants.js b/packages/discord.js/src/util/Constants.js index 79ede9b80..d0b945683 100644 --- a/packages/discord.js/src/util/Constants.js +++ b/packages/discord.js/src/util/Constants.js @@ -6,160 +6,6 @@ const Package = (exports.Package = require('../../package.json')); exports.UserAgent = `DiscordBot (${Package.homepage}, ${Package.version}) Node.js/${process.version}`; -exports.WSCodes = { - 1000: 'WS_CLOSE_REQUESTED', - 4004: 'TOKEN_INVALID', - 4010: 'SHARDING_INVALID', - 4011: 'SHARDING_REQUIRED', - 4013: 'INVALID_INTENTS', - 4014: 'DISALLOWED_INTENTS', -}; - -/** - * The type of a WebSocket message event, e.g. `MESSAGE_CREATE`. Here are the available events: - * * READY - * * RESUMED - * * GUILD_CREATE - * * GUILD_DELETE - * * GUILD_UPDATE - * * INVITE_CREATE - * * INVITE_DELETE - * * GUILD_MEMBER_ADD - * * GUILD_MEMBER_REMOVE - * * GUILD_MEMBER_UPDATE - * * GUILD_MEMBERS_CHUNK - * * GUILD_INTEGRATIONS_UPDATE - * * GUILD_ROLE_CREATE - * * GUILD_ROLE_DELETE - * * GUILD_ROLE_UPDATE - * * GUILD_BAN_ADD - * * GUILD_BAN_REMOVE - * * GUILD_EMOJIS_UPDATE - * * CHANNEL_CREATE - * * CHANNEL_DELETE - * * CHANNEL_UPDATE - * * CHANNEL_PINS_UPDATE - * * MESSAGE_CREATE - * * MESSAGE_DELETE - * * MESSAGE_UPDATE - * * MESSAGE_DELETE_BULK - * * MESSAGE_REACTION_ADD - * * MESSAGE_REACTION_REMOVE - * * MESSAGE_REACTION_REMOVE_ALL - * * MESSAGE_REACTION_REMOVE_EMOJI - * * THREAD_CREATE - * * THREAD_UPDATE - * * THREAD_DELETE - * * THREAD_LIST_SYNC - * * THREAD_MEMBER_UPDATE - * * THREAD_MEMBERS_UPDATE - * * USER_UPDATE - * * PRESENCE_UPDATE - * * TYPING_START - * * VOICE_STATE_UPDATE - * * VOICE_SERVER_UPDATE - * * WEBHOOKS_UPDATE - * * INTERACTION_CREATE - * * STAGE_INSTANCE_CREATE - * * STAGE_INSTANCE_UPDATE - * * STAGE_INSTANCE_DELETE - * * GUILD_STICKERS_UPDATE - * * GUILD_SCHEDULED_EVENT_CREATE - * * GUILD_SCHEDULED_EVENT_UPDATE - * * GUILD_SCHEDULED_EVENT_DELETE - * * GUILD_SCHEDULED_EVENT_USER_ADD - * * GUILD_SCHEDULED_EVENT_USER_REMOVE - * @typedef {string} WSEventType - * @see {@link https://discord.com/developers/docs/topics/gateway#commands-and-events-gateway-events} - */ -exports.WSEvents = keyMirror([ - 'READY', - 'RESUMED', - 'GUILD_CREATE', - 'GUILD_DELETE', - 'GUILD_UPDATE', - 'INVITE_CREATE', - 'INVITE_DELETE', - 'GUILD_MEMBER_ADD', - 'GUILD_MEMBER_REMOVE', - 'GUILD_MEMBER_UPDATE', - 'GUILD_MEMBERS_CHUNK', - 'GUILD_INTEGRATIONS_UPDATE', - 'GUILD_ROLE_CREATE', - 'GUILD_ROLE_DELETE', - 'GUILD_ROLE_UPDATE', - 'GUILD_BAN_ADD', - 'GUILD_BAN_REMOVE', - 'GUILD_EMOJIS_UPDATE', - 'CHANNEL_CREATE', - 'CHANNEL_DELETE', - 'CHANNEL_UPDATE', - 'CHANNEL_PINS_UPDATE', - 'MESSAGE_CREATE', - 'MESSAGE_DELETE', - 'MESSAGE_UPDATE', - 'MESSAGE_DELETE_BULK', - 'MESSAGE_REACTION_ADD', - 'MESSAGE_REACTION_REMOVE', - 'MESSAGE_REACTION_REMOVE_ALL', - 'MESSAGE_REACTION_REMOVE_EMOJI', - 'THREAD_CREATE', - 'THREAD_UPDATE', - 'THREAD_DELETE', - 'THREAD_LIST_SYNC', - 'THREAD_MEMBER_UPDATE', - 'THREAD_MEMBERS_UPDATE', - 'USER_UPDATE', - 'PRESENCE_UPDATE', - 'TYPING_START', - 'VOICE_STATE_UPDATE', - 'VOICE_SERVER_UPDATE', - 'WEBHOOKS_UPDATE', - 'INTERACTION_CREATE', - 'STAGE_INSTANCE_CREATE', - 'STAGE_INSTANCE_UPDATE', - 'STAGE_INSTANCE_DELETE', - 'GUILD_STICKERS_UPDATE', - 'GUILD_SCHEDULED_EVENT_CREATE', - 'GUILD_SCHEDULED_EVENT_UPDATE', - 'GUILD_SCHEDULED_EVENT_DELETE', - 'GUILD_SCHEDULED_EVENT_USER_ADD', - 'GUILD_SCHEDULED_EVENT_USER_REMOVE', -]); - -/** - * A valid scope to request when generating an invite link. - * Scopes that require whitelist are not considered valid for this generator - * * `applications.builds.read`: allows reading build data for a users applications - * * `applications.commands`: allows this bot to create commands in the server - * * `applications.entitlements`: allows reading entitlements for a users applications - * * `applications.store.update`: allows reading and updating of store data for a users applications - * * `bot`: makes the bot join the selected guild - * * `connections`: makes the endpoint for getting a users connections available - * * `email`: allows the `/users/@me` endpoint return with an email - * * `identify`: allows the `/users/@me` endpoint without an email - * * `guilds`: makes the `/users/@me/guilds` endpoint available for a user - * * `guilds.join`: allows the bot to join the user to any guild it is in using Guild#addMember - * * `gdm.join`: allows joining the user to a group dm - * * `webhook.incoming`: generates a webhook to a channel - * @typedef {string} InviteScope - * @see {@link https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes} - */ -exports.InviteScopes = [ - 'applications.builds.read', - 'applications.commands', - 'applications.entitlements', - 'applications.store.update', - 'bot', - 'connections', - 'email', - 'identify', - 'guilds', - 'guilds.join', - 'gdm.join', - 'webhook.incoming', -]; - /** * The name of an item to be swept in Sweepers * * `applicationCommands` - both global and guild commands @@ -261,14 +107,7 @@ exports.VoiceBasedChannelTypes = [ChannelType.GuildVoice, ChannelType.GuildStage /* eslint-enable max-len */ -function keyMirror(arr) { - let tmp = Object.create(null); - for (const value of arr) tmp[value] = value; - return tmp; -} - /** * @typedef {Object} Constants Constants that can be used in an enum or object-like way. * @property {Status} Status The available statuses of the client. - * @property {WSEventType} WSEvents The type of a WebSocket message event. */ diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 9f0df6a97..d5bec6404 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -52,6 +52,7 @@ import { ButtonStyle, ChannelType, ComponentType, + GatewayDispatchEvents, GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData, GuildFeature, @@ -62,6 +63,7 @@ import { InteractionType, InviteTargetType, MessageType, + OAuth2Scopes, RESTPostAPIApplicationCommandsJSONBody, Snowflake, StageInstancePrivacyLevel, @@ -2460,8 +2462,8 @@ export class WebSocketManager extends EventEmitter { public status: Status; public readonly ping: number; - public on(event: WSEventType, listener: (data: any, shardId: number) => void): this; - public once(event: WSEventType, listener: (data: any, shardId: number) => void): this; + public on(event: GatewayDispatchEvents, listener: (data: any, shardId: number) => void): this; + public once(event: GatewayDispatchEvents, listener: (data: any, shardId: number) => void): this; private debug(message: string, shard?: WebSocketShard): void; private connect(): Promise; @@ -2604,19 +2606,9 @@ export const Constants: { [key: string]: unknown; }; UserAgent: string; - WSCodes: { - 1000: 'WS_CLOSE_REQUESTED'; - 4004: 'TOKEN_INVALID'; - 4010: 'SHARDING_INVALID'; - 4011: 'SHARDING_REQUIRED'; - }; - WSEvents: { - [K in WSEventType]: K; - }; ThreadChannelTypes: ThreadChannelType[]; TextBasedChannelTypes: TextBasedChannelTypes[]; VoiceBasedChannelTypes: VoiceBasedChannelTypes[]; - InviteScopes: InviteScope[]; MessageTypes: MessageType[]; SystemMessageTypes: SystemMessageType[]; }; @@ -4421,7 +4413,7 @@ export interface InviteGenerationOptions { permissions?: PermissionResolvable; guild?: GuildResolvable; disableGuildSelect?: boolean; - scopes: InviteScope[]; + scopes: OAuth2Scopes[]; } export type GuildInvitableChannelResolvable = @@ -4445,20 +4437,6 @@ export interface CreateInviteOptions { export type InviteResolvable = string; -export type InviteScope = - | 'applications.builds.read' - | 'applications.commands' - | 'applications.entitlements' - | 'applications.store.update' - | 'bot' - | 'connections' - | 'email' - | 'identify' - | 'guilds' - | 'guilds.join' - | 'gdm.join' - | 'webhook.incoming'; - export interface LifetimeFilterOptions { excludeFromSweep?: (value: V, key: K, collection: LimitedCollection) => boolean; getComparisonTimestamp?: (value: V, key: K, collection: LimitedCollection) => number; @@ -5040,55 +5018,6 @@ export interface WelcomeScreenEditData { welcomeChannels?: WelcomeChannelData[]; } -export type WSEventType = - | 'READY' - | 'RESUMED' - | 'GUILD_CREATE' - | 'GUILD_DELETE' - | 'GUILD_UPDATE' - | 'INVITE_CREATE' - | 'INVITE_DELETE' - | 'GUILD_MEMBER_ADD' - | 'GUILD_MEMBER_REMOVE' - | 'GUILD_MEMBER_UPDATE' - | 'GUILD_MEMBERS_CHUNK' - | 'GUILD_ROLE_CREATE' - | 'GUILD_ROLE_DELETE' - | 'GUILD_ROLE_UPDATE' - | 'GUILD_BAN_ADD' - | 'GUILD_BAN_REMOVE' - | 'GUILD_EMOJIS_UPDATE' - | 'GUILD_INTEGRATIONS_UPDATE' - | 'CHANNEL_CREATE' - | 'CHANNEL_DELETE' - | 'CHANNEL_UPDATE' - | 'CHANNEL_PINS_UPDATE' - | 'MESSAGE_CREATE' - | 'MESSAGE_DELETE' - | 'MESSAGE_UPDATE' - | 'MESSAGE_DELETE_BULK' - | 'MESSAGE_REACTION_ADD' - | 'MESSAGE_REACTION_REMOVE' - | 'MESSAGE_REACTION_REMOVE_ALL' - | 'MESSAGE_REACTION_REMOVE_EMOJI' - | 'THREAD_CREATE' - | 'THREAD_UPDATE' - | 'THREAD_DELETE' - | 'THREAD_LIST_SYNC' - | 'THREAD_MEMBER_UPDATE' - | 'THREAD_MEMBERS_UPDATE' - | 'USER_UPDATE' - | 'PRESENCE_UPDATE' - | 'TYPING_START' - | 'VOICE_STATE_UPDATE' - | 'VOICE_SERVER_UPDATE' - | 'WEBHOOKS_UPDATE' - | 'INTERACTION_CREATE' - | 'STAGE_INSTANCE_CREATE' - | 'STAGE_INSTANCE_UPDATE' - | 'STAGE_INSTANCE_DELETE' - | 'GUILD_STICKERS_UPDATE'; - export type Serialized = T extends symbol | bigint | (() => any) ? never : T extends number | string | boolean | undefined @@ -5145,6 +5074,8 @@ export { GuildMFALevel, GuildNSFWLevel, GuildPremiumTier, + GatewayCloseCodes, + GatewayDispatchEvents, GatewayIntentBits, GatewayOpcodes, GuildScheduledEventEntityType, @@ -5156,6 +5087,7 @@ export { InviteTargetType, MessageType, MessageFlags, + OAuth2Scopes, PermissionFlagsBits, RESTJSONErrorCodes, StageInstancePrivacyLevel,