From 37a22e04c27724c2a65b05c701e3000ba3653ba1 Mon Sep 17 00:00:00 2001 From: Rodry <38259440+ImRodry@users.noreply.github.com> Date: Wed, 12 Jan 2022 19:30:06 +0000 Subject: [PATCH] feat(Channel): improve typeguards (#6957) Co-authored-by: Papageorgiadis Savvas <50584606+papsavas@users.noreply.github.com> Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> Co-authored-by: Almeida --- .../src/client/actions/MessageCreate.js | 2 +- .../src/client/actions/MessageDelete.js | 2 +- .../src/client/actions/MessageDeleteBulk.js | 2 +- .../src/client/actions/MessageReactionAdd.js | 2 +- .../client/actions/MessageReactionRemove.js | 2 +- .../actions/MessageReactionRemoveAll.js | 2 +- .../actions/MessageReactionRemoveEmoji.js | 2 +- .../src/client/actions/MessageUpdate.js | 2 +- .../src/client/actions/TypingStart.js | 2 +- packages/discord.js/src/structures/Channel.js | 74 +++++++++++++++++-- packages/discord.js/src/util/Sweepers.js | 4 +- packages/discord.js/typings/index.d.ts | 14 +++- 12 files changed, 91 insertions(+), 19 deletions(-) diff --git a/packages/discord.js/src/client/actions/MessageCreate.js b/packages/discord.js/src/client/actions/MessageCreate.js index df81258e0..417cd46ec 100644 --- a/packages/discord.js/src/client/actions/MessageCreate.js +++ b/packages/discord.js/src/client/actions/MessageCreate.js @@ -8,7 +8,7 @@ class MessageCreateAction extends Action { const client = this.client; const channel = this.getChannel(data); if (channel) { - if (!channel.isText()) return {}; + if (!channel.isTextBased()) return {}; const existing = channel.messages.cache.get(data.id); if (existing) return { message: existing }; diff --git a/packages/discord.js/src/client/actions/MessageDelete.js b/packages/discord.js/src/client/actions/MessageDelete.js index ffdb6d391..df4177d80 100644 --- a/packages/discord.js/src/client/actions/MessageDelete.js +++ b/packages/discord.js/src/client/actions/MessageDelete.js @@ -9,7 +9,7 @@ class MessageDeleteAction extends Action { const channel = this.getChannel(data); let message; if (channel) { - if (!channel.isText()) return {}; + if (!channel.isTextBased()) return {}; message = this.getMessage(data, channel); if (message) { diff --git a/packages/discord.js/src/client/actions/MessageDeleteBulk.js b/packages/discord.js/src/client/actions/MessageDeleteBulk.js index b23c370ac..fa95863a3 100644 --- a/packages/discord.js/src/client/actions/MessageDeleteBulk.js +++ b/packages/discord.js/src/client/actions/MessageDeleteBulk.js @@ -10,7 +10,7 @@ class MessageDeleteBulkAction extends Action { const channel = client.channels.cache.get(data.channel_id); if (channel) { - if (!channel.isText()) return {}; + if (!channel.isTextBased()) return {}; const ids = data.ids; const messages = new Collection(); diff --git a/packages/discord.js/src/client/actions/MessageReactionAdd.js b/packages/discord.js/src/client/actions/MessageReactionAdd.js index 736b1e42a..51dc63670 100644 --- a/packages/discord.js/src/client/actions/MessageReactionAdd.js +++ b/packages/discord.js/src/client/actions/MessageReactionAdd.js @@ -23,7 +23,7 @@ class MessageReactionAdd extends Action { // Verify channel const channel = this.getChannel(data); - if (!channel || !channel.isText()) return false; + if (!channel || !channel.isTextBased()) return false; // Verify message const message = this.getMessage(data, channel); diff --git a/packages/discord.js/src/client/actions/MessageReactionRemove.js b/packages/discord.js/src/client/actions/MessageReactionRemove.js index 7a05949a8..267c7a014 100644 --- a/packages/discord.js/src/client/actions/MessageReactionRemove.js +++ b/packages/discord.js/src/client/actions/MessageReactionRemove.js @@ -20,7 +20,7 @@ class MessageReactionRemove extends Action { // Verify channel const channel = this.getChannel(data); - if (!channel || !channel.isText()) return false; + if (!channel || !channel.isTextBased()) return false; // Verify message const message = this.getMessage(data, channel); diff --git a/packages/discord.js/src/client/actions/MessageReactionRemoveAll.js b/packages/discord.js/src/client/actions/MessageReactionRemoveAll.js index e2a392476..a69509d43 100644 --- a/packages/discord.js/src/client/actions/MessageReactionRemoveAll.js +++ b/packages/discord.js/src/client/actions/MessageReactionRemoveAll.js @@ -7,7 +7,7 @@ class MessageReactionRemoveAll extends Action { handle(data) { // Verify channel const channel = this.getChannel(data); - if (!channel || !channel.isText()) return false; + if (!channel || !channel.isTextBased()) return false; // Verify message const message = this.getMessage(data, channel); diff --git a/packages/discord.js/src/client/actions/MessageReactionRemoveEmoji.js b/packages/discord.js/src/client/actions/MessageReactionRemoveEmoji.js index f8f28e87c..e3144d6f2 100644 --- a/packages/discord.js/src/client/actions/MessageReactionRemoveEmoji.js +++ b/packages/discord.js/src/client/actions/MessageReactionRemoveEmoji.js @@ -6,7 +6,7 @@ const { Events } = require('../../util/Constants'); class MessageReactionRemoveEmoji extends Action { handle(data) { const channel = this.getChannel(data); - if (!channel || !channel.isText()) return false; + if (!channel || !channel.isTextBased()) return false; const message = this.getMessage(data, channel); if (!message) return false; diff --git a/packages/discord.js/src/client/actions/MessageUpdate.js b/packages/discord.js/src/client/actions/MessageUpdate.js index 9448ed6cc..fe757c04e 100644 --- a/packages/discord.js/src/client/actions/MessageUpdate.js +++ b/packages/discord.js/src/client/actions/MessageUpdate.js @@ -6,7 +6,7 @@ class MessageUpdateAction extends Action { handle(data) { const channel = this.getChannel(data); if (channel) { - if (!channel.isText()) return {}; + if (!channel.isTextBased()) return {}; const { id, channel_id, guild_id, author, timestamp, type } = data; const message = this.getMessage({ id, channel_id, guild_id, author, timestamp, type }, channel); diff --git a/packages/discord.js/src/client/actions/TypingStart.js b/packages/discord.js/src/client/actions/TypingStart.js index 9d0ae3709..2dd9b14fb 100644 --- a/packages/discord.js/src/client/actions/TypingStart.js +++ b/packages/discord.js/src/client/actions/TypingStart.js @@ -9,7 +9,7 @@ class TypingStart extends Action { const channel = this.getChannel(data); if (!channel) return; - if (!channel.isText()) { + if (!channel.isTextBased()) { this.client.emit(Events.WARN, `Discord sent a typing packet to a ${channel.type} channel ${channel.id}`); return; } diff --git a/packages/discord.js/src/structures/Channel.js b/packages/discord.js/src/structures/Channel.js index 7c57330d7..29b7351ae 100644 --- a/packages/discord.js/src/structures/Channel.js +++ b/packages/discord.js/src/structures/Channel.js @@ -3,6 +3,7 @@ const { DiscordSnowflake } = require('@sapphire/snowflake'); const { ChannelType } = require('discord-api-types/v9'); const Base = require('./Base'); +const { ThreadChannelTypes } = require('../util/Constants'); let CategoryChannel; let DMChannel; let NewsChannel; @@ -11,7 +12,6 @@ let StoreChannel; let TextChannel; let ThreadChannel; let VoiceChannel; -const { ThreadChannelTypes, VoiceBasedChannelTypes } = require('../util/Constants'); /** * Represents any channel on Discord. @@ -103,19 +103,59 @@ class Channel extends Base { } /** - * Indicates whether this channel is {@link TextBasedChannels text-based}. + * Indicates whether this channel is a {@link TextChannel}. * @returns {boolean} */ isText() { - return 'messages' in this; + return this.type === ChannelType[ChannelType.GuildText]; } /** - * Indicates whether this channel is {@link BaseGuildVoiceChannel voice-based}. + * Indicates whether this channel is a {@link DMChannel}. + * @returns {boolean} + */ + isDM() { + return this.type === ChannelType[ChannelType.DM]; + } + + /** + * Indicates whether this channel is a {@link VoiceChannel}. * @returns {boolean} */ isVoice() { - return VoiceBasedChannelTypes.includes(this.type); + return this.type === ChannelType[ChannelType.GuildVoice]; + } + + /** + * Indicates whether this channel is a {@link PartialGroupDMChannel}. + * @returns {boolean} + */ + isGroupDM() { + return this.type === ChannelType[ChannelType.GroupDM]; + } + + /** + * Indicates whether this channel is a {@link CategoryChannel}. + * @returns {boolean} + */ + isCategory() { + return this.type === ChannelType[ChannelType.GuildCategory]; + } + + /** + * Indicates whether this channel is a {@link NewsChannel}. + * @returns {boolean} + */ + isNews() { + return this.type === ChannelType[ChannelType.GuildNews]; + } + + /** + * Indicates whether this channel is a {@link StoreChannel}. + * @returns {boolean} + */ + isStore() { + return this.type === ChannelType[ChannelType.GuildStore]; } /** @@ -126,6 +166,30 @@ class Channel extends Base { return ThreadChannelTypes.includes(this.type); } + /** + * Indicates whether this channel is a {@link StageChannel}. + * @returns {boolean} + */ + isStage() { + return this.type === ChannelType[ChannelType.GuildStageVoice]; + } + + /** + * Indicates whether this channel is {@link TextBasedChannels text-based}. + * @returns {boolean} + */ + isTextBased() { + return 'messages' in this; + } + + /** + * Indicates whether this channel is {@link BaseGuildVoiceChannel voice-based}. + * @returns {boolean} + */ + isVoiceBased() { + return 'bitrate' in this; + } + static create(client, data, guild, { allowUnknownGuild, fromInteraction } = {}) { CategoryChannel ??= require('./CategoryChannel'); DMChannel ??= require('./DMChannel'); diff --git a/packages/discord.js/src/util/Sweepers.js b/packages/discord.js/src/util/Sweepers.js index a826115a3..bccb1450e 100644 --- a/packages/discord.js/src/util/Sweepers.js +++ b/packages/discord.js/src/util/Sweepers.js @@ -136,7 +136,7 @@ class Sweepers { let messages = 0; for (const channel of this.client.channels.cache.values()) { - if (!channel.isText()) continue; + if (!channel.isTextBased()) continue; channels++; messages += channel.messages.cache.sweep(filter); @@ -168,7 +168,7 @@ class Sweepers { let reactions = 0; for (const channel of this.client.channels.cache.values()) { - if (!channel.isText()) continue; + if (!channel.isTextBased()) continue; channels++; for (const message of channel.messages.cache.values()) { diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 5b36524c9..33e116431 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -520,9 +520,17 @@ export abstract class Channel extends Base { public type: keyof typeof ChannelType; public delete(): Promise; public fetch(force?: boolean): Promise; - public isText(): this is TextBasedChannel; - public isVoice(): this is BaseGuildVoiceChannel; + public isText(): this is TextChannel; + public isDM(): this is DMChannel; + public isVoice(): this is VoiceChannel; + public isGroupDM(): this is PartialGroupDMChannel; + public isCategory(): this is CategoryChannel; + public isNews(): this is NewsChannel; + public isStore(): this is StoreChannel; public isThread(): this is ThreadChannel; + public isStage(): this is StageChannel; + public isTextBased(): this is TextBasedChannel; + public isVoiceBased(): this is VoiceBasedChannel; public toString(): ChannelMention; } @@ -1051,7 +1059,7 @@ export abstract class GuildChannel extends Channel { public setName(name: string, reason?: string): Promise; public setParent(channel: CategoryChannelResolvable | null, options?: SetParentOptions): Promise; public setPosition(position: number, options?: SetChannelPositionOptions): Promise; - public isText(): this is TextChannel | NewsChannel; + public isTextBased(): this is GuildBasedChannel & TextBasedChannel; } export class GuildEmoji extends BaseGuildEmoji {