refactor: rename Constants.OPCode to Opcode, moved objects to enums (#6065)

This commit is contained in:
Antonio Román
2021-07-07 14:40:36 +02:00
committed by GitHub
parent 755c180659
commit 4eb3a2a885
7 changed files with 181 additions and 150 deletions

View File

@@ -2,7 +2,7 @@
const EventEmitter = require('events'); const EventEmitter = require('events');
const WebSocket = require('../../WebSocket'); 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 Intents = require('../../util/Intents');
const STATUS_KEYS = Object.keys(Status); const STATUS_KEYS = Object.keys(Status);
@@ -296,7 +296,7 @@ class WebSocketShard extends EventEmitter {
return; return;
} }
this.manager.client.emit(Events.RAW, packet, this.id); 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); this.onPacket(packet);
} }
@@ -408,16 +408,16 @@ class WebSocketShard extends EventEmitter {
if (packet.s > this.sequence) this.sequence = packet.s; if (packet.s > this.sequence) this.sequence = packet.s;
switch (packet.op) { switch (packet.op) {
case OPCodes.HELLO: case Opcodes.HELLO:
this.setHelloTimeout(-1); this.setHelloTimeout(-1);
this.setHeartbeatTimer(packet.d.heartbeat_interval); this.setHeartbeatTimer(packet.d.heartbeat_interval);
this.identify(); this.identify();
break; break;
case OPCodes.RECONNECT: case Opcodes.RECONNECT:
this.debug('[RECONNECT] Discord asked us to reconnect'); this.debug('[RECONNECT] Discord asked us to reconnect');
this.destroy({ closeCode: 4000 }); this.destroy({ closeCode: 4000 });
break; break;
case OPCodes.INVALID_SESSION: case Opcodes.INVALID_SESSION:
this.debug(`[INVALID SESSION] Resumable: ${packet.d}.`); this.debug(`[INVALID SESSION] Resumable: ${packet.d}.`);
// If we can resume the session, do so immediately // If we can resume the session, do so immediately
if (packet.d) { if (packet.d) {
@@ -433,10 +433,10 @@ class WebSocketShard extends EventEmitter {
// Finally, emit the INVALID_SESSION event // Finally, emit the INVALID_SESSION event
this.emit(ShardEvents.INVALID_SESSION); this.emit(ShardEvents.INVALID_SESSION);
break; break;
case OPCodes.HEARTBEAT_ACK: case Opcodes.HEARTBEAT_ACK:
this.ackHeartbeat(); this.ackHeartbeat();
break; break;
case OPCodes.HEARTBEAT: case Opcodes.HEARTBEAT:
this.sendHeartbeat('HeartbeatRequest', true); this.sendHeartbeat('HeartbeatRequest', true);
break; break;
default: default:
@@ -556,7 +556,7 @@ class WebSocketShard extends EventEmitter {
this.debug(`[${tag}] Sending a heartbeat.`); this.debug(`[${tag}] Sending a heartbeat.`);
this.lastHeartbeatAcked = false; this.lastHeartbeatAcked = false;
this.lastPingTimestamp = Date.now(); 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.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, seq: this.closeSequence,
}; };
this.send({ op: OPCodes.RESUME, d }, true); this.send({ op: Opcodes.RESUME, d }, true);
} }
/** /**

View File

@@ -6,7 +6,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel');
const GuildMember = require('../structures/GuildMember'); const GuildMember = require('../structures/GuildMember');
const Role = require('../structures/Role'); const Role = require('../structures/Role');
const Collection = require('../util/Collection'); const Collection = require('../util/Collection');
const { Events, OPCodes } = require('../util/Constants'); const { Events, Opcodes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil'); const SnowflakeUtil = require('../util/SnowflakeUtil');
/** /**
@@ -346,7 +346,7 @@ class GuildMemberManager extends CachedManager {
if (!query && !user_ids) query = ''; if (!query && !user_ids) query = '';
if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH'); if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH');
this.guild.shard.send({ this.guild.shard.send({
op: OPCodes.REQUEST_GUILD_MEMBERS, op: Opcodes.REQUEST_GUILD_MEMBERS,
d: { d: {
guild_id: this.guild.id, guild_id: this.guild.id,
presences, presences,

View File

@@ -2,7 +2,7 @@
const { Presence } = require('./Presence'); const { Presence } = require('./Presence');
const { TypeError } = require('../errors'); const { TypeError } = require('../errors');
const { ActivityTypes, OPCodes } = require('../util/Constants'); const { ActivityTypes, Opcodes } = require('../util/Constants');
class ClientPresence extends Presence { class ClientPresence extends Presence {
/** /**
@@ -17,13 +17,13 @@ class ClientPresence extends Presence {
const packet = this._parse(presence); const packet = this._parse(presence);
this._patch(packet); this._patch(packet);
if (typeof presence.shardId === 'undefined') { 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)) { } else if (Array.isArray(presence.shardId)) {
for (const shardId of 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 { } 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; return this;
} }

View File

@@ -98,7 +98,7 @@ exports.Status = {
RESUMING: 8, RESUMING: 8,
}; };
exports.OPCodes = { exports.Opcodes = {
DISPATCH: 0, DISPATCH: 0,
HEARTBEAT: 1, HEARTBEAT: 1,
IDENTIFY: 2, IDENTIFY: 2,

137
typings/enums.d.ts vendored
View File

@@ -152,3 +152,140 @@ export enum WebhookTypes {
Incoming = 1, Incoming = 1,
'Channel Follower' = 2, '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,
}

149
typings/index.d.ts vendored
View File

@@ -39,7 +39,10 @@ import {
ApplicationCommandPermissionTypes, ApplicationCommandPermissionTypes,
ChannelType, ChannelType,
ChannelTypes, ChannelTypes,
ConstantsClientApplicationAssetTypes,
ConstantsColors,
DefaultMessageNotificationLevels, DefaultMessageNotificationLevels,
ConstantsEvents,
ExplicitContentFilterLevels, ExplicitContentFilterLevels,
InteractionResponseTypes, InteractionResponseTypes,
InteractionTypes, InteractionTypes,
@@ -49,12 +52,15 @@ import {
MessageComponentTypes, MessageComponentTypes,
MFALevels, MFALevels,
NSFWLevels, NSFWLevels,
ConstantsOpcodes,
OverwriteTypes, OverwriteTypes,
PremiumTiers, PremiumTiers,
PrivacyLevels, PrivacyLevels,
ConstantsStatus,
StickerFormatTypes, StickerFormatTypes,
VerificationLevels, VerificationLevels,
WebhookTypes, WebhookTypes,
ConstantsShardEvents,
} from './enums'; } from './enums';
//#region Classes //#region Classes
@@ -220,7 +226,11 @@ export class BaseGuildVoiceChannel extends GuildChannel {
export class BaseMessageComponent { export class BaseMessageComponent {
public constructor(data?: BaseMessageComponent | BaseMessageComponentOptions); public constructor(data?: BaseMessageComponent | BaseMessageComponentOptions);
public type: MessageComponentType | null; 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; private static resolveType(type: MessageComponentTypeResolvable): MessageComponentType;
} }
@@ -1982,146 +1992,21 @@ export const Constants: {
4010: 'SHARDING_INVALID'; 4010: 'SHARDING_INVALID';
4011: 'SHARDING_REQUIRED'; 4011: 'SHARDING_REQUIRED';
}; };
Events: { Events: typeof ConstantsEvents;
RATE_LIMIT: 'rateLimit'; ShardEvents: typeof ConstantsShardEvents;
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';
};
PartialTypes: { PartialTypes: {
[K in PartialTypes]: K; [K in PartialTypes]: K;
}; };
WSEvents: { WSEvents: {
[K in WSEventType]: K; [K in WSEventType]: K;
}; };
Colors: { Colors: typeof ConstantsColors;
DEFAULT: 0x000000; Status: typeof ConstantsStatus;
WHITE: 0xffffff; Opcodes: typeof ConstantsOpcodes;
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;
};
APIErrors: APIErrors; APIErrors: APIErrors;
ChannelTypes: typeof ChannelTypes; ChannelTypes: typeof ChannelTypes;
ThreadChannelTypes: ThreadChannelType[]; ThreadChannelTypes: ThreadChannelType[];
ClientApplicationAssetTypes: { ClientApplicationAssetTypes: typeof ConstantsClientApplicationAssetTypes;
SMALL: 1;
BIG: 2;
};
InviteScopes: InviteScope[]; InviteScopes: InviteScope[];
MessageTypes: MessageType[]; MessageTypes: MessageType[];
SystemMessageTypes: SystemMessageType[]; SystemMessageTypes: SystemMessageType[];

View File

@@ -1,6 +1,7 @@
import { import {
Client, Client,
Collection, Collection,
Constants,
DMChannel, DMChannel,
GuildMember, GuildMember,
Intents, Intents,
@@ -431,7 +432,7 @@ client.login('absolutely-valid-token');
// Test type transformation: // Test type transformation:
declare const assertType: <T>(value: T) => asserts value is T; declare const assertType: <T>(value: T) => asserts value is T;
declare const serialize: <T>(value: T) => Serialized<T>; declare const serialize: <T>(value: T) => Serialized<T>;
declare const notPropertyOf: <T, P extends string>(value: T, property: P & Exclude<P, keyof T>) => void; declare const notPropertyOf: <T, P extends PropertyKey>(value: T, property: P & Exclude<P, keyof T>) => void;
assertType<undefined>(serialize(undefined)); assertType<undefined>(serialize(undefined));
assertType<null>(serialize(null)); assertType<null>(serialize(null));
@@ -503,3 +504,11 @@ declare const reactionCollector: ReactionCollector;
reactionCollector.on('dispose', (...args) => { reactionCollector.on('dispose', (...args) => {
assertType<[MessageReaction, User]>(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);