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 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);
}
/**

View File

@@ -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,

View File

@@ -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;
}

View File

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

137
typings/enums.d.ts vendored
View File

@@ -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,
}

149
typings/index.d.ts vendored
View File

@@ -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[];

View File

@@ -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: <T>(value: T) => asserts value is 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<null>(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);