From 4eb3a2a885efd480a953a23c5e5289912364ccd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Rom=C3=A1n?= Date: Wed, 7 Jul 2021 14:40:36 +0200 Subject: [PATCH] refactor: rename `Constants.OPCode` to `Opcode`, moved objects to enums (#6065) --- src/client/websocket/WebSocketShard.js | 20 ++-- src/managers/GuildMemberManager.js | 4 +- src/structures/ClientPresence.js | 8 +- src/util/Constants.js | 2 +- typings/enums.d.ts | 137 +++++++++++++++++++++++ typings/index.d.ts | 149 +++---------------------- typings/index.ts | 11 +- 7 files changed, 181 insertions(+), 150 deletions(-) diff --git a/src/client/websocket/WebSocketShard.js b/src/client/websocket/WebSocketShard.js index e366d333c..4d2aa64d0 100644 --- a/src/client/websocket/WebSocketShard.js +++ b/src/client/websocket/WebSocketShard.js @@ -2,7 +2,7 @@ const EventEmitter = require('events'); const WebSocket = require('../../WebSocket'); -const { Status, Events, ShardEvents, OPCodes, WSEvents } = require('../../util/Constants'); +const { Status, Events, ShardEvents, Opcodes, WSEvents } = require('../../util/Constants'); const Intents = require('../../util/Intents'); const STATUS_KEYS = Object.keys(Status); @@ -296,7 +296,7 @@ class WebSocketShard extends EventEmitter { return; } this.manager.client.emit(Events.RAW, packet, this.id); - if (packet.op === OPCodes.DISPATCH) this.manager.emit(packet.t, packet.d, this.id); + if (packet.op === Opcodes.DISPATCH) this.manager.emit(packet.t, packet.d, this.id); this.onPacket(packet); } @@ -408,16 +408,16 @@ class WebSocketShard extends EventEmitter { if (packet.s > this.sequence) this.sequence = packet.s; switch (packet.op) { - case OPCodes.HELLO: + case Opcodes.HELLO: this.setHelloTimeout(-1); this.setHeartbeatTimer(packet.d.heartbeat_interval); this.identify(); break; - case OPCodes.RECONNECT: + case Opcodes.RECONNECT: this.debug('[RECONNECT] Discord asked us to reconnect'); this.destroy({ closeCode: 4000 }); break; - case OPCodes.INVALID_SESSION: + case Opcodes.INVALID_SESSION: this.debug(`[INVALID SESSION] Resumable: ${packet.d}.`); // If we can resume the session, do so immediately if (packet.d) { @@ -433,10 +433,10 @@ class WebSocketShard extends EventEmitter { // Finally, emit the INVALID_SESSION event this.emit(ShardEvents.INVALID_SESSION); break; - case OPCodes.HEARTBEAT_ACK: + case Opcodes.HEARTBEAT_ACK: this.ackHeartbeat(); break; - case OPCodes.HEARTBEAT: + case Opcodes.HEARTBEAT: this.sendHeartbeat('HeartbeatRequest', true); break; default: @@ -556,7 +556,7 @@ class WebSocketShard extends EventEmitter { this.debug(`[${tag}] Sending a heartbeat.`); this.lastHeartbeatAcked = false; this.lastPingTimestamp = Date.now(); - this.send({ op: OPCodes.HEARTBEAT, d: this.sequence }, true); + this.send({ op: Opcodes.HEARTBEAT, d: this.sequence }, true); } /** @@ -601,7 +601,7 @@ class WebSocketShard extends EventEmitter { }; this.debug(`[IDENTIFY] Shard ${this.id}/${client.options.shardCount} with intents: ${d.intents}`); - this.send({ op: OPCodes.IDENTIFY, d }, true); + this.send({ op: Opcodes.IDENTIFY, d }, true); } /** @@ -625,7 +625,7 @@ class WebSocketShard extends EventEmitter { seq: this.closeSequence, }; - this.send({ op: OPCodes.RESUME, d }, true); + this.send({ op: Opcodes.RESUME, d }, true); } /** diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index e652f49df..a56e9e3f8 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -6,7 +6,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel'); const GuildMember = require('../structures/GuildMember'); const Role = require('../structures/Role'); const Collection = require('../util/Collection'); -const { Events, OPCodes } = require('../util/Constants'); +const { Events, Opcodes } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); /** @@ -346,7 +346,7 @@ class GuildMemberManager extends CachedManager { if (!query && !user_ids) query = ''; if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH'); this.guild.shard.send({ - op: OPCodes.REQUEST_GUILD_MEMBERS, + op: Opcodes.REQUEST_GUILD_MEMBERS, d: { guild_id: this.guild.id, presences, diff --git a/src/structures/ClientPresence.js b/src/structures/ClientPresence.js index 6d471b716..f276c019f 100644 --- a/src/structures/ClientPresence.js +++ b/src/structures/ClientPresence.js @@ -2,7 +2,7 @@ const { Presence } = require('./Presence'); const { TypeError } = require('../errors'); -const { ActivityTypes, OPCodes } = require('../util/Constants'); +const { ActivityTypes, Opcodes } = require('../util/Constants'); class ClientPresence extends Presence { /** @@ -17,13 +17,13 @@ class ClientPresence extends Presence { const packet = this._parse(presence); this._patch(packet); if (typeof presence.shardId === 'undefined') { - this.client.ws.broadcast({ op: OPCodes.STATUS_UPDATE, d: packet }); + this.client.ws.broadcast({ op: Opcodes.STATUS_UPDATE, d: packet }); } else if (Array.isArray(presence.shardId)) { for (const shardId of presence.shardId) { - this.client.ws.shards.get(shardId).send({ op: OPCodes.STATUS_UPDATE, d: packet }); + this.client.ws.shards.get(shardId).send({ op: Opcodes.STATUS_UPDATE, d: packet }); } } else { - this.client.ws.shards.get(presence.shardId).send({ op: OPCodes.STATUS_UPDATE, d: packet }); + this.client.ws.shards.get(presence.shardId).send({ op: Opcodes.STATUS_UPDATE, d: packet }); } return this; } diff --git a/src/util/Constants.js b/src/util/Constants.js index 92caafbef..ee2e744f9 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -98,7 +98,7 @@ exports.Status = { RESUMING: 8, }; -exports.OPCodes = { +exports.Opcodes = { DISPATCH: 0, HEARTBEAT: 1, IDENTIFY: 2, diff --git a/typings/enums.d.ts b/typings/enums.d.ts index cd7fd3081..70b96f6ec 100644 --- a/typings/enums.d.ts +++ b/typings/enums.d.ts @@ -152,3 +152,140 @@ export enum WebhookTypes { Incoming = 1, 'Channel Follower' = 2, } + +export const enum ConstantsEvents { + RATE_LIMIT = 'rateLimit', + INVALID_REQUEST_WARNING = 'invalidRequestWarning', + CLIENT_READY = 'ready', + APPLICATION_COMMAND_CREATE = 'applicationCommandCreate', + APPLICATION_COMMAND_DELETE = 'applicationCommandDelete', + APPLICATION_COMMAND_UPDATE = 'applicationCommandUpdate', + GUILD_CREATE = 'guildCreate', + GUILD_DELETE = 'guildDelete', + GUILD_UPDATE = 'guildUpdate', + INVITE_CREATE = 'inviteCreate', + INVITE_DELETE = 'inviteDelete', + GUILD_UNAVAILABLE = 'guildUnavailable', + GUILD_MEMBER_ADD = 'guildMemberAdd', + GUILD_MEMBER_REMOVE = 'guildMemberRemove', + GUILD_MEMBER_UPDATE = 'guildMemberUpdate', + GUILD_MEMBER_AVAILABLE = 'guildMemberAvailable', + GUILD_MEMBERS_CHUNK = 'guildMembersChunk', + GUILD_INTEGRATIONS_UPDATE = 'guildIntegrationsUpdate', + GUILD_ROLE_CREATE = 'roleCreate', + GUILD_ROLE_DELETE = 'roleDelete', + GUILD_ROLE_UPDATE = 'roleUpdate', + GUILD_EMOJI_CREATE = 'emojiCreate', + GUILD_EMOJI_DELETE = 'emojiDelete', + GUILD_EMOJI_UPDATE = 'emojiUpdate', + GUILD_BAN_ADD = 'guildBanAdd', + GUILD_BAN_REMOVE = 'guildBanRemove', + CHANNEL_CREATE = 'channelCreate', + CHANNEL_DELETE = 'channelDelete', + CHANNEL_UPDATE = 'channelUpdate', + CHANNEL_PINS_UPDATE = 'channelPinsUpdate', + MESSAGE_CREATE = 'messageCreate', + MESSAGE_DELETE = 'messageDelete', + MESSAGE_UPDATE = 'messageUpdate', + MESSAGE_BULK_DELETE = 'messageDeleteBulk', + MESSAGE_REACTION_ADD = 'messageReactionAdd', + MESSAGE_REACTION_REMOVE = 'messageReactionRemove', + MESSAGE_REACTION_REMOVE_ALL = 'messageReactionRemoveAll', + MESSAGE_REACTION_REMOVE_EMOJI = 'messageReactionRemoveEmoji', + THREAD_CREATE = 'threadCreate', + THREAD_DELETE = 'threadDelete', + THREAD_UPDATE = 'threadUpdate', + THREAD_LIST_SYNC = 'threadListSync', + THREAD_MEMBER_UPDATE = 'threadMemberUpdate', + THREAD_MEMBERS_UPDATE = 'threadMembersUpdate', + USER_UPDATE = 'userUpdate', + PRESENCE_UPDATE = 'presenceUpdate', + VOICE_SERVER_UPDATE = 'voiceServerUpdate', + VOICE_STATE_UPDATE = 'voiceStateUpdate', + TYPING_START = 'typingStart', + WEBHOOKS_UPDATE = 'webhookUpdate', + INTERACTION_CREATE = 'interactionCreate', + ERROR = 'error', + WARN = 'warn', + DEBUG = 'debug', + SHARD_DISCONNECT = 'shardDisconnect', + SHARD_ERROR = 'shardError', + SHARD_RECONNECTING = 'shardReconnecting', + SHARD_READY = 'shardReady', + SHARD_RESUME = 'shardResume', + INVALIDATED = 'invalidated', + RAW = 'raw', + STAGE_INSTANCE_CREATE = 'stageInstanceCreate', + STAGE_INSTANCE_UPDATE = 'stageInstanceUpdate', + STAGE_INSTANCE_DELETE = 'stageInstanceDelete', +} + +export const enum ConstantsShardEvents { + CLOSE = 'close', + DESTROYED = 'destroyed', + INVALID_SESSION = 'invalidSession', + READY = 'ready', + RESUMED = 'resumed', +} + +export const enum ConstantsColors { + DEFAULT = 0x000000, + WHITE = 0xffffff, + AQUA = 0x1abc9c, + GREEN = 0x57f287, + BLUE = 0x3498db, + YELLOW = 0xfee75c, + PURPLE = 0x9b59b6, + LUMINOUS_VIVID_PINK = 0xe91e63, + FUCHSIA = 0xeb459e, + GOLD = 0xf1c40f, + ORANGE = 0xe67e22, + RED = 0xed4245, + GREY = 0x95a5a6, + NAVY = 0x34495e, + DARK_AQUA = 0x11806a, + DARK_GREEN = 0x1f8b4c, + DARK_BLUE = 0x206694, + DARK_PURPLE = 0x71368a, + DARK_VIVID_PINK = 0xad1457, + DARK_GOLD = 0xc27c0e, + DARK_ORANGE = 0xa84300, + DARK_RED = 0x992d22, + DARK_GREY = 0x979c9f, + DARKER_GREY = 0x7f8c8d, + LIGHT_GREY = 0xbcc0c0, + DARK_NAVY = 0x2c3e50, + BLURPLE = 0x5865f2, + GREYPLE = 0x99aab5, + DARK_BUT_NOT_BLACK = 0x2c2f33, + NOT_QUITE_BLACK = 0x23272a, +} + +export const enum ConstantsStatus { + READY = 0, + CONNECTING = 1, + RECONNECTING = 2, + IDLE = 3, + NEARLY = 4, + DISCONNECTED = 5, +} + +export const enum ConstantsOpcodes { + DISPATCH = 0, + HEARTBEAT = 1, + IDENTIFY = 2, + STATUS_UPDATE = 3, + VOICE_STATE_UPDATE = 4, + VOICE_GUILD_PING = 5, + RESUME = 6, + RECONNECT = 7, + REQUEST_GUILD_MEMBERS = 8, + INVALID_SESSION = 9, + HELLO = 10, + HEARTBEAT_ACK = 11, +} + +export const enum ConstantsClientApplicationAssetTypes { + SMALL = 1, + BIG = 2, +} diff --git a/typings/index.d.ts b/typings/index.d.ts index 324baeeb6..634c97429 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -39,7 +39,10 @@ import { ApplicationCommandPermissionTypes, ChannelType, ChannelTypes, + ConstantsClientApplicationAssetTypes, + ConstantsColors, DefaultMessageNotificationLevels, + ConstantsEvents, ExplicitContentFilterLevels, InteractionResponseTypes, InteractionTypes, @@ -49,12 +52,15 @@ import { MessageComponentTypes, MFALevels, NSFWLevels, + ConstantsOpcodes, OverwriteTypes, PremiumTiers, PrivacyLevels, + ConstantsStatus, StickerFormatTypes, VerificationLevels, WebhookTypes, + ConstantsShardEvents, } from './enums'; //#region Classes @@ -220,7 +226,11 @@ export class BaseGuildVoiceChannel extends GuildChannel { export class BaseMessageComponent { public constructor(data?: BaseMessageComponent | BaseMessageComponentOptions); public type: MessageComponentType | null; - private static create(data: MessageComponentOptions, client?: Client | WebhookClient, skipValidation?: boolean): MessageComponent | undefined; + private static create( + data: MessageComponentOptions, + client?: Client | WebhookClient, + skipValidation?: boolean, + ): MessageComponent | undefined; private static resolveType(type: MessageComponentTypeResolvable): MessageComponentType; } @@ -1982,146 +1992,21 @@ export const Constants: { 4010: 'SHARDING_INVALID'; 4011: 'SHARDING_REQUIRED'; }; - Events: { - RATE_LIMIT: 'rateLimit'; - INVALID_REQUEST_WARNING: 'invalidRequestWarning'; - CLIENT_READY: 'ready'; - APPLICATION_COMMAND_CREATE: 'applicationCommandCreate'; - APPLICATION_COMMAND_DELETE: 'applicationCommandDelete'; - APPLICATION_COMMAND_UPDATE: 'applicationCommandUpdate'; - GUILD_CREATE: 'guildCreate'; - GUILD_DELETE: 'guildDelete'; - GUILD_UPDATE: 'guildUpdate'; - INVITE_CREATE: 'inviteCreate'; - INVITE_DELETE: 'inviteDelete'; - GUILD_UNAVAILABLE: 'guildUnavailable'; - GUILD_MEMBER_ADD: 'guildMemberAdd'; - GUILD_MEMBER_REMOVE: 'guildMemberRemove'; - GUILD_MEMBER_UPDATE: 'guildMemberUpdate'; - GUILD_MEMBER_AVAILABLE: 'guildMemberAvailable'; - GUILD_MEMBERS_CHUNK: 'guildMembersChunk'; - GUILD_INTEGRATIONS_UPDATE: 'guildIntegrationsUpdate'; - GUILD_ROLE_CREATE: 'roleCreate'; - GUILD_ROLE_DELETE: 'roleDelete'; - GUILD_ROLE_UPDATE: 'roleUpdate'; - GUILD_EMOJI_CREATE: 'emojiCreate'; - GUILD_EMOJI_DELETE: 'emojiDelete'; - GUILD_EMOJI_UPDATE: 'emojiUpdate'; - GUILD_BAN_ADD: 'guildBanAdd'; - GUILD_BAN_REMOVE: 'guildBanRemove'; - CHANNEL_CREATE: 'channelCreate'; - CHANNEL_DELETE: 'channelDelete'; - CHANNEL_UPDATE: 'channelUpdate'; - CHANNEL_PINS_UPDATE: 'channelPinsUpdate'; - MESSAGE_CREATE: 'messageCreate'; - MESSAGE_DELETE: 'messageDelete'; - MESSAGE_UPDATE: 'messageUpdate'; - MESSAGE_BULK_DELETE: 'messageDeleteBulk'; - MESSAGE_REACTION_ADD: 'messageReactionAdd'; - MESSAGE_REACTION_REMOVE: 'messageReactionRemove'; - MESSAGE_REACTION_REMOVE_ALL: 'messageReactionRemoveAll'; - MESSAGE_REACTION_REMOVE_EMOJI: 'messageReactionRemoveEmoji'; - THREAD_CREATE: 'threadCreate'; - THREAD_DELETE: 'threadDelete'; - THREAD_UPDATE: 'threadUpdate'; - THREAD_LIST_SYNC: 'threadListSync'; - THREAD_MEMBER_UPDATE: 'threadMemberUpdate'; - THREAD_MEMBERS_UPDATE: 'threadMembersUpdate'; - USER_UPDATE: 'userUpdate'; - PRESENCE_UPDATE: 'presenceUpdate'; - VOICE_SERVER_UPDATE: 'voiceServerUpdate'; - VOICE_STATE_UPDATE: 'voiceStateUpdate'; - TYPING_START: 'typingStart'; - WEBHOOKS_UPDATE: 'webhookUpdate'; - INTERACTION_CREATE: 'interactionCreate'; - ERROR: 'error'; - WARN: 'warn'; - DEBUG: 'debug'; - SHARD_DISCONNECT: 'shardDisconnect'; - SHARD_ERROR: 'shardError'; - SHARD_RECONNECTING: 'shardReconnecting'; - SHARD_READY: 'shardReady'; - SHARD_RESUME: 'shardResume'; - INVALIDATED: 'invalidated'; - RAW: 'raw'; - STAGE_INSTANCE_CREATE: 'stageInstanceCreate'; - STAGE_INSTANCE_UPDATE: 'stageInstanceUpdate'; - STAGE_INSTANCE_DELETE: 'stageInstanceDelete'; - }; - ShardEvents: { - CLOSE: 'close'; - DESTROYED: 'destroyed'; - INVALID_SESSION: 'invalidSession'; - READY: 'ready'; - RESUMED: 'resumed'; - }; + Events: typeof ConstantsEvents; + ShardEvents: typeof ConstantsShardEvents; PartialTypes: { [K in PartialTypes]: K; }; WSEvents: { [K in WSEventType]: K; }; - Colors: { - DEFAULT: 0x000000; - WHITE: 0xffffff; - AQUA: 0x1abc9c; - GREEN: 0x57f287; - BLUE: 0x3498db; - YELLOW: 0xfee75c; - PURPLE: 0x9b59b6; - LUMINOUS_VIVID_PINK: 0xe91e63; - FUCHSIA: 0xeb459e; - GOLD: 0xf1c40f; - ORANGE: 0xe67e22; - RED: 0xed4245; - GREY: 0x95a5a6; - NAVY: 0x34495e; - DARK_AQUA: 0x11806a; - DARK_GREEN: 0x1f8b4c; - DARK_BLUE: 0x206694; - DARK_PURPLE: 0x71368a; - DARK_VIVID_PINK: 0xad1457; - DARK_GOLD: 0xc27c0e; - DARK_ORANGE: 0xa84300; - DARK_RED: 0x992d22; - DARK_GREY: 0x979c9f; - DARKER_GREY: 0x7f8c8d; - LIGHT_GREY: 0xbcc0c0; - DARK_NAVY: 0x2c3e50; - BLURPLE: 0x5865f2; - GREYPLE: 0x99aab5; - DARK_BUT_NOT_BLACK: 0x2c2f33; - NOT_QUITE_BLACK: 0x23272a; - }; - Status: { - READY: 0; - CONNECTING: 1; - RECONNECTING: 2; - IDLE: 3; - NEARLY: 4; - DISCONNECTED: 5; - }; - OPCodes: { - DISPATCH: 0; - HEARTBEAT: 1; - IDENTIFY: 2; - STATUS_UPDATE: 3; - VOICE_STATE_UPDATE: 4; - VOICE_GUILD_PING: 5; - RESUME: 6; - RECONNECT: 7; - REQUEST_GUILD_MEMBERS: 8; - INVALID_SESSION: 9; - HELLO: 10; - HEARTBEAT_ACK: 11; - }; + Colors: typeof ConstantsColors; + Status: typeof ConstantsStatus; + Opcodes: typeof ConstantsOpcodes; APIErrors: APIErrors; ChannelTypes: typeof ChannelTypes; ThreadChannelTypes: ThreadChannelType[]; - ClientApplicationAssetTypes: { - SMALL: 1; - BIG: 2; - }; + ClientApplicationAssetTypes: typeof ConstantsClientApplicationAssetTypes; InviteScopes: InviteScope[]; MessageTypes: MessageType[]; SystemMessageTypes: SystemMessageType[]; diff --git a/typings/index.ts b/typings/index.ts index d1bcf5891..0ab4c2bd8 100644 --- a/typings/index.ts +++ b/typings/index.ts @@ -1,6 +1,7 @@ import { Client, Collection, + Constants, DMChannel, GuildMember, Intents, @@ -431,7 +432,7 @@ client.login('absolutely-valid-token'); // Test type transformation: declare const assertType: (value: T) => asserts value is T; declare const serialize: (value: T) => Serialized; -declare const notPropertyOf: (value: T, property: P & Exclude) => void; +declare const notPropertyOf: (value: T, property: P & Exclude) => void; assertType(serialize(undefined)); assertType(serialize(null)); @@ -503,3 +504,11 @@ declare const reactionCollector: ReactionCollector; reactionCollector.on('dispose', (...args) => { assertType<[MessageReaction, User]>(args); }); + +// Make sure the properties are typed correctly, and that no backwards properties +// (K -> V and V -> K) exist: +assertType<'messageCreate'>(Constants.Events.MESSAGE_CREATE); +assertType<'close'>(Constants.ShardEvents.CLOSE); +assertType<1>(Constants.Status.CONNECTING); +assertType<0>(Constants.Opcodes.DISPATCH); +assertType<2>(Constants.ClientApplicationAssetTypes.BIG);