From f7eeccba4b7015496df811f10cc2da2b0fab0630 Mon Sep 17 00:00:00 2001 From: Shubham Parihar Date: Tue, 15 Jun 2021 17:03:31 +0530 Subject: [PATCH] feat(*): use enums for consistency and speed (#5843) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antonio Román --- src/managers/GuildManager.js | 14 +++--- src/structures/ClientPresence.js | 4 +- src/structures/Guild.js | 26 +++++------ src/structures/Presence.js | 2 +- src/structures/Sticker.js | 2 +- src/structures/TeamMember.js | 2 +- src/structures/Webhook.js | 2 +- src/util/Constants.js | 40 +++++++---------- typings/index.d.ts | 77 ++++++++++++++++++++++++-------- 9 files changed, 100 insertions(+), 69 deletions(-) diff --git a/src/managers/GuildManager.js b/src/managers/GuildManager.js index 1cad93627..86df25bd8 100644 --- a/src/managers/GuildManager.js +++ b/src/managers/GuildManager.js @@ -13,7 +13,7 @@ const { ChannelTypes, Events, VerificationLevels, - DefaultMessageNotifications, + DefaultMessageNotificationLevels, ExplicitContentFilterLevels, } = require('../util/Constants'); const DataResolver = require('../util/DataResolver'); @@ -168,14 +168,14 @@ class GuildManager extends BaseManager { } = {}, ) { icon = await DataResolver.resolveImage(icon); - if (typeof verificationLevel !== 'undefined' && typeof verificationLevel !== 'number') { - verificationLevel = VerificationLevels.indexOf(verificationLevel); + if (typeof verificationLevel === 'string') { + verificationLevel = VerificationLevels[verificationLevel]; } - if (typeof defaultMessageNotifications !== 'undefined' && typeof defaultMessageNotifications !== 'number') { - defaultMessageNotifications = DefaultMessageNotifications.indexOf(defaultMessageNotifications); + if (typeof defaultMessageNotifications === 'string') { + defaultMessageNotifications = DefaultMessageNotificationLevels[defaultMessageNotifications]; } - if (typeof explicitContentFilter !== 'undefined' && typeof explicitContentFilter !== 'number') { - explicitContentFilter = ExplicitContentFilterLevels.indexOf(explicitContentFilter); + if (typeof explicitContentFilter === 'string') { + explicitContentFilter = ExplicitContentFilterLevels[explicitContentFilter]; } for (const channel of channels) { if (channel.type) channel.type = ChannelTypes[channel.type.toUpperCase()]; diff --git a/src/structures/ClientPresence.js b/src/structures/ClientPresence.js index faf753dc8..7b2f77510 100644 --- a/src/structures/ClientPresence.js +++ b/src/structures/ClientPresence.js @@ -41,7 +41,7 @@ class ClientPresence extends Presence { if (!activity.type) activity.type = 0; data.activities.push({ - type: typeof activity.type === 'number' ? activity.type : ActivityTypes.indexOf(activity.type), + type: typeof activity.type === 'number' ? activity.type : ActivityTypes[activity.type], name: activity.name, url: activity.url, }); @@ -50,7 +50,7 @@ class ClientPresence extends Presence { data.activities.push( ...this.activities.map(a => ({ name: a.name, - type: ActivityTypes.indexOf(a.type), + type: ActivityTypes[a.type], url: a.url ?? undefined, })), ); diff --git a/src/structures/Guild.js b/src/structures/Guild.js index dd6b0138a..7213c6b2e 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -20,7 +20,7 @@ const VoiceStateManager = require('../managers/VoiceStateManager'); const Collection = require('../util/Collection'); const { ChannelTypes, - DefaultMessageNotifications, + DefaultMessageNotificationLevels, PartialTypes, VerificationLevels, ExplicitContentFilterLevels, @@ -280,11 +280,10 @@ class Guild extends BaseGuild { this.joinedTimestamp = data.joined_at ? new Date(data.joined_at).getTime() : this.joinedTimestamp; /** - * The value set for the guild's default message notifications - * @type {DefaultMessageNotifications|number} + * The default message notification level of the guild + * @type {DefaultMessageNotificationLevel} */ - this.defaultMessageNotifications = - DefaultMessageNotifications[data.default_message_notifications] || data.default_message_notifications; + this.defaultMessageNotifications = DefaultMessageNotificationLevels[data.default_message_notifications]; /** * The value set for the guild's system channel flags @@ -831,7 +830,8 @@ class Guild extends BaseGuild { * @property {Base64Resolvable} [splash] The invite splash image of the guild * @property {Base64Resolvable} [discoverySplash] The discovery splash image of the guild * @property {Base64Resolvable} [banner] The banner of the guild - * @property {DefaultMessageNotifications|number} [defaultMessageNotifications] The default message notifications + * @property {DefaultMessageNotificationLevel|number} [defaultMessageNotifications] The default message notification + * level of the guild * @property {SystemChannelFlagsResolvable} [systemChannelFlags] The system channel flags of the guild * @property {ChannelResolvable} [rulesChannel] The rules channel of the guild * @property {ChannelResolvable} [publicUpdatesChannel] The community updates channel of the guild @@ -859,8 +859,8 @@ class Guild extends BaseGuild { if (typeof data.verificationLevel !== 'undefined') { _data.verification_level = typeof data.verificationLevel === 'number' - ? Number(data.verificationLevel) - : VerificationLevels.indexOf(data.verificationLevel); + ? data.verificationLevel + : VerificationLevels[data.verificationLevel]; } if (typeof data.afkChannel !== 'undefined') { _data.afk_channel_id = this.client.channels.resolveID(data.afkChannel); @@ -878,13 +878,13 @@ class Guild extends BaseGuild { _data.explicit_content_filter = typeof data.explicitContentFilter === 'number' ? data.explicitContentFilter - : ExplicitContentFilterLevels.indexOf(data.explicitContentFilter); + : ExplicitContentFilterLevels[data.explicitContentFilter]; } if (typeof data.defaultMessageNotifications !== 'undefined') { _data.default_message_notifications = - typeof data.defaultMessageNotifications === 'string' - ? DefaultMessageNotifications.indexOf(data.defaultMessageNotifications) - : data.defaultMessageNotifications; + typeof data.defaultMessageNotifications === 'number' + ? data.defaultMessageNotifications + : DefaultMessageNotificationLevels[data.defaultMessageNotifications]; } if (typeof data.systemChannelFlags !== 'undefined') { _data.system_channel_flags = SystemChannelFlags.resolve(data.systemChannelFlags); @@ -921,7 +921,7 @@ class Guild extends BaseGuild { /* eslint-disable max-len */ /** * Edits the setting of the default message notifications of the guild. - * @param {DefaultMessageNotifications|number} defaultMessageNotifications The new setting for the default message notifications + * @param {DefaultMessageNotificationLevel|number} defaultMessageNotifications The new default message notification level of the guild * @param {string} [reason] Reason for changing the setting of the default message notifications * @returns {Promise} */ diff --git a/src/structures/Presence.js b/src/structures/Presence.js index 3f6052e2d..9442b2904 100644 --- a/src/structures/Presence.js +++ b/src/structures/Presence.js @@ -169,7 +169,7 @@ class Activity { * The type of the activity status * @type {ActivityType} */ - this.type = ActivityTypes[data.type] || ActivityTypes[ActivityTypes.indexOf(data.type)]; + this.type = typeof data.type === 'number' ? ActivityTypes[data.type] : data.type; /** * If the activity is being streamed, a link to the stream diff --git a/src/structures/Sticker.js b/src/structures/Sticker.js index bac20e1db..941e28cbb 100644 --- a/src/structures/Sticker.js +++ b/src/structures/Sticker.js @@ -31,7 +31,7 @@ class Sticker extends Base { /** * The format of the sticker - * @type {StickerFormatTypes} + * @type {StickerFormatType} */ this.format = StickerFormatTypes[sticker.format_type]; diff --git a/src/structures/TeamMember.js b/src/structures/TeamMember.js index ba7ecd266..92360bc07 100644 --- a/src/structures/TeamMember.js +++ b/src/structures/TeamMember.js @@ -29,7 +29,7 @@ class TeamMember extends Base { /** * The permissions this Team Member has with regard to the team - * @type {MembershipStates} + * @type {MembershipState} */ this.membershipState = MembershipStates[data.membership_state]; diff --git a/src/structures/Webhook.js b/src/structures/Webhook.js index f90ee6404..6fb278a4b 100644 --- a/src/structures/Webhook.js +++ b/src/structures/Webhook.js @@ -50,7 +50,7 @@ class Webhook { /** * The type of the webhook - * @type {WebhookTypes} + * @type {WebhookType} */ this.type = WebhookTypes[data.type]; diff --git a/src/util/Constants.js b/src/util/Constants.js index 72f5942a5..a75ef8616 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -488,17 +488,17 @@ exports.SystemMessageTypes = exports.MessageTypes.filter( ); /** - * Bots cannot set a `CUSTOM_STATUS`, it is only for custom statuses received from users + * Bots cannot set a `CUSTOM` activity type, it is only for custom statuses received from users * The type of an activity of a users presence, e.g. `PLAYING`. Here are the available types: * * PLAYING * * STREAMING * * LISTENING * * WATCHING - * * CUSTOM_STATUS + * * CUSTOM * * COMPETING * @typedef {string} ActivityType */ -exports.ActivityTypes = ['PLAYING', 'STREAMING', 'LISTENING', 'WATCHING', 'CUSTOM_STATUS', 'COMPETING']; +exports.ActivityTypes = createEnum(['PLAYING', 'STREAMING', 'LISTENING', 'WATCHING', 'CUSTOM', 'COMPETING']); exports.ChannelTypes = createEnum([ 'TEXT', @@ -559,7 +559,7 @@ exports.Colors = { * * ALL_MEMBERS * @typedef {string} ExplicitContentFilterLevel */ -exports.ExplicitContentFilterLevels = ['DISABLED', 'MEMBERS_WITHOUT_ROLES', 'ALL_MEMBERS']; +exports.ExplicitContentFilterLevels = createEnum(['DISABLED', 'MEMBERS_WITHOUT_ROLES', 'ALL_MEMBERS']); /** * The value set for the verification levels for a guild: @@ -570,7 +570,7 @@ exports.ExplicitContentFilterLevels = ['DISABLED', 'MEMBERS_WITHOUT_ROLES', 'ALL * * VERY_HIGH * @typedef {string} VerificationLevel */ -exports.VerificationLevels = ['NONE', 'LOW', 'MEDIUM', 'HIGH', 'VERY_HIGH']; +exports.VerificationLevels = createEnum(['NONE', 'LOW', 'MEDIUM', 'HIGH', 'VERY_HIGH']); /** * An error encountered while performing an API request. Here are the potential errors: @@ -717,45 +717,35 @@ exports.APIErrors = { }; /** - * The value set for a guild's default message notifications, e.g. `ALL`. Here are the available types: - * * ALL - * * MENTIONS - * @typedef {string} DefaultMessageNotifications + * The value set for a guild's default message notifications, e.g. `ALL_MESSAGES`. Here are the available types: + * * ALL_MESSAGES + * * ONLY_MENTIONS + * @typedef {string} DefaultMessageNotificationLevel */ -exports.DefaultMessageNotifications = ['ALL', 'MENTIONS']; +exports.DefaultMessageNotificationLevels = createEnum(['ALL_MESSAGES', 'ONLY_MENTIONS']); /** * The value set for a team members's membership state: * * INVITED * * ACCEPTED - * @typedef {string} MembershipStates + * @typedef {string} MembershipState */ -exports.MembershipStates = [ - // They start at 1 - null, - 'INVITED', - 'ACCEPTED', -]; +exports.MembershipStates = createEnum([null, 'INVITED', 'ACCEPTED']); /** * The value set for a webhook's type: * * Incoming * * Channel Follower - * @typedef {string} WebhookTypes + * @typedef {string} WebhookType */ -exports.WebhookTypes = [ - // They start at 1 - null, - 'Incoming', - 'Channel Follower', -]; +exports.WebhookTypes = createEnum([null, 'Incoming', 'Channel Follower']); /** * The value set for a sticker's type: * * PNG * * APNG * * LOTTIE - * @typedef {string} StickerFormatTypes + * @typedef {string} StickerFormatType */ exports.StickerFormatTypes = createEnum([null, 'PNG', 'APNG', 'LOTTIE']); diff --git a/typings/index.d.ts b/typings/index.d.ts index 6b90809fa..256fe7131 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,3 +1,12 @@ +declare enum ActivityTypes { + PLAYING = 0, + STREAMING = 1, + LISTENING = 2, + WATCHING = 3, + CUSTOM = 4, + COMPETING = 5, +} + declare enum ChannelType { text = 0, dm = 1, @@ -21,6 +30,17 @@ declare enum ChannelTypes { STAGE = 13, } +declare enum DefaultMessageNotificationLevels { + ALL_MESSAGES = 0, + ONLY_MENTIONS = 1, +} + +declare enum ExplicitContentFilterLevels { + DISABLED = 0, + MEMBERS_WITHOUT_ROLES = 1, + ALL_MEMBERS = 2, +} + declare enum InteractionResponseTypes { PONG = 1, CHANNEL_MESSAGE_WITH_SOURCE = 4, @@ -40,6 +60,11 @@ declare enum InviteTargetType { EMBEDDED_APPLICATION = 2, } +declare enum MembershipStates { + INVITED = 1, + ACCEPTED = 2, +} + declare enum MessageButtonStyles { PRIMARY = 1, SECONDARY = 2, @@ -81,6 +106,19 @@ declare enum StickerFormatTypes { LOTTIE = 3, } +declare enum VerificationLevels { + NONE = 0, + LOW = 1, + MEDIUM = 2, + HIGH = 3, + VERY_HIGH = 4, +} + +declare enum WebhookTypes { + Incoming = 1, + 'Channel Follower' = 2, +} + type Awaited = T | Promise; declare module 'discord.js' { @@ -662,13 +700,13 @@ declare module 'discord.js' { InviteScopes: InviteScope[]; MessageTypes: MessageType[]; SystemMessageTypes: SystemMessageType[]; - ActivityTypes: ActivityType[]; + ActivityTypes: typeof ActivityTypes; StickerFormatTypes: typeof StickerFormatTypes; OverwriteTypes: typeof OverwriteTypes; - ExplicitContentFilterLevels: ExplicitContentFilterLevel[]; - DefaultMessageNotifications: DefaultMessageNotifications[]; - VerificationLevels: VerificationLevel[]; - MembershipStates: 'INVITED' | 'ACCEPTED'; + ExplicitContentFilterLevels: typeof ExplicitContentFilterLevels; + DefaultMessageNotificationLevels: typeof DefaultMessageNotificationLevels; + VerificationLevels: typeof VerificationLevels; + MembershipStates: typeof MembershipStates; ApplicationCommandOptionTypes: typeof ApplicationCommandOptionTypes; ApplicationCommandPermissionTypes: typeof ApplicationCommandPermissionTypes; InteractionTypes: typeof InteractionTypes; @@ -678,6 +716,7 @@ declare module 'discord.js' { MFALevels: typeof MFALevels; NSFWLevels: typeof NSFWLevels; PrivacyLevels: typeof PrivacyLevels; + WebhookTypes: typeof WebhookTypes; }; export class DataResolver { @@ -740,7 +779,7 @@ declare module 'discord.js' { public bans: GuildBanManager; public channels: GuildChannelManager; public commands: GuildApplicationCommandManager; - public defaultMessageNotifications: DefaultMessageNotifications | number; + public defaultMessageNotifications: DefaultMessageNotificationLevel | number; public deleted: boolean; public description: string | null; public discoverySplash: string | null; @@ -805,7 +844,7 @@ declare module 'discord.js' { public setBanner(banner: Base64Resolvable | null, reason?: string): Promise; public setChannelPositions(channelPositions: readonly ChannelPosition[]): Promise; public setDefaultMessageNotifications( - defaultMessageNotifications: DefaultMessageNotifications | number, + defaultMessageNotifications: DefaultMessageNotificationLevel | number, reason?: string, ): Promise; public setDiscoverySplash(discoverySplash: Base64Resolvable | null, reason?: string): Promise; @@ -1762,7 +1801,7 @@ declare module 'discord.js' { public team: Team; public readonly id: Snowflake; public permissions: string[]; - public membershipState: MembershipStates; + public membershipState: MembershipState; public user: User; public toString(): string; @@ -1931,7 +1970,7 @@ declare module 'discord.js' { public sourceGuild: Guild | unknown | null; public sourceChannel: Channel | unknown | null; public token: string | null; - public type: WebhookTypes; + public type: WebhookType; } export class WebhookClient extends WebhookMixin(BaseClient) { @@ -2437,7 +2476,7 @@ declare module 'discord.js' { type ActivityPlatform = 'desktop' | 'samsung' | 'xbox'; - type ActivityType = 'PLAYING' | 'STREAMING' | 'LISTENING' | 'WATCHING' | 'CUSTOM_STATUS' | 'COMPETING'; + type ActivityType = keyof typeof ActivityTypes; interface AddGuildMemberOptions { accessToken: string; @@ -2852,7 +2891,7 @@ declare module 'discord.js' { binary: string; } - type DefaultMessageNotifications = 'ALL' | 'MENTIONS'; + type DefaultMessageNotificationLevel = keyof typeof DefaultMessageNotificationLevels; interface EditGuildTemplateOptions { name?: string; @@ -2894,7 +2933,7 @@ declare module 'discord.js' { codeBlockContent?: boolean; } - type ExplicitContentFilterLevel = 'DISABLED' | 'MEMBERS_WITHOUT_ROLES' | 'ALL_MEMBERS'; + type ExplicitContentFilterLevel = keyof typeof ExplicitContentFilterLevels; interface Extendable { GuildEmoji: typeof GuildEmoji; @@ -3072,7 +3111,7 @@ declare module 'discord.js' { afkChannelID?: Snowflake | number; afkTimeout?: number; channels?: PartialChannelData[]; - defaultMessageNotifications?: DefaultMessageNotifications | number; + defaultMessageNotifications?: DefaultMessageNotificationLevel | number; explicitContentFilter?: ExplicitContentFilterLevel | number; icon?: BufferResolvable | Base64Resolvable | null; roles?: PartialRoleData[]; @@ -3090,7 +3129,7 @@ declare module 'discord.js' { name?: string; verificationLevel?: VerificationLevel | number; explicitContentFilter?: ExplicitContentFilterLevel | number; - defaultMessageNotifications?: DefaultMessageNotifications | number; + defaultMessageNotifications?: DefaultMessageNotificationLevel | number; afkChannel?: ChannelResolvable; systemChannel?: ChannelResolvable; systemChannelFlags?: SystemChannelFlagsResolvable; @@ -3281,7 +3320,7 @@ declare module 'discord.js' { stack: string; } - type MembershipStates = 'INVITED' | 'ACCEPTED'; + type MembershipState = keyof typeof MembershipStates; type MessageActionRowComponent = MessageButton; @@ -3805,7 +3844,7 @@ declare module 'discord.js' { public readonly createdTimestamp: number; public readonly createdAt: Date; public description: string; - public format: StickerFormatTypes; + public format: StickerFormatType; public id: Snowflake; public name: string; public packID: Snowflake; @@ -3813,6 +3852,8 @@ declare module 'discord.js' { public readonly url: string; } + type StickerFormatType = keyof typeof StickerFormatTypes; + type SystemChannelFlagsString = | 'SUPPRESS_JOIN_NOTIFICATIONS' | 'SUPPRESS_PREMIUM_SUBSCRIPTIONS' @@ -3857,7 +3898,7 @@ declare module 'discord.js' { uses: number | null; } - type VerificationLevel = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH'; + type VerificationLevel = keyof typeof VerificationLevels; type WebhookClientOptions = Pick< ClientOptions, @@ -3880,7 +3921,7 @@ declare module 'discord.js' { avatarURL?: string; } - type WebhookTypes = 'Incoming' | 'Channel Follower'; + type WebhookType = keyof typeof WebhookTypes; interface WebSocketOptions { large_threshold?: number;