From b0937502d35a6519948b7320a0cc361acf1a1755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Rom=C3=A1n?= Date: Wed, 8 Dec 2021 10:47:54 +0100 Subject: [PATCH] refactor: make `Structure#deleted` a getter to a WeakSet (#7074) --- package-lock.json | 14 ++++----- package.json | 2 +- src/client/Client.js | 2 +- src/client/actions/ChannelDelete.js | 6 ++-- src/client/actions/ChannelUpdate.js | 2 +- src/client/actions/GuildDelete.js | 3 +- src/client/actions/GuildEmojiDelete.js | 3 +- src/client/actions/GuildMemberRemove.js | 3 +- src/client/actions/GuildRoleDelete.js | 3 +- src/client/actions/GuildStickerDelete.js | 3 +- src/client/actions/MessageDelete.js | 3 +- src/client/actions/MessageDeleteBulk.js | 3 +- src/client/actions/StageInstanceDelete.js | 3 +- src/client/actions/ThreadDelete.js | 6 ++-- src/index.js | 16 +++++----- src/managers/ChannelManager.js | 2 +- src/managers/GuildBanManager.js | 2 +- src/managers/GuildEmojiRoleManager.js | 2 +- src/managers/GuildManager.js | 6 ++-- src/managers/GuildMemberManager.js | 4 +-- src/managers/GuildMemberRoleManager.js | 2 +- src/managers/GuildStickerManager.js | 2 +- src/managers/MessageManager.js | 2 +- src/managers/PermissionOverwriteManager.js | 2 +- src/managers/RoleManager.js | 2 +- src/managers/StageInstanceManager.js | 2 +- src/managers/UserManager.js | 4 +-- src/structures/BaseGuildEmoji.js | 2 +- src/structures/Channel.js | 29 ++++++++++++----- src/structures/DMChannel.js | 2 +- src/structures/Emoji.js | 27 ++++++++++++---- src/structures/Guild.js | 29 ++++++++++++----- src/structures/GuildAuditLogs.js | 4 +-- src/structures/GuildChannel.js | 2 +- src/structures/GuildMember.js | 29 ++++++++++++----- src/structures/Message.js | 31 ++++++++++++++----- src/structures/MessageMentions.js | 2 +- src/structures/MessagePayload.js | 4 +-- src/structures/PartialGroupDMChannel.js | 2 +- src/structures/PermissionOverwrites.js | 2 +- src/structures/Presence.js | 2 +- src/structures/ReactionEmoji.js | 2 +- src/structures/Role.js | 29 ++++++++++++----- src/structures/StageInstance.js | 31 ++++++++++++++----- src/structures/Sticker.js | 23 +++++++++++++- src/structures/StickerPack.js | 2 +- src/structures/ThreadChannel.js | 2 +- src/structures/WelcomeChannel.js | 2 +- src/structures/interfaces/TextBasedChannel.js | 2 +- typings/index.d.ts | 31 ++++++++++++++----- typings/index.test-d.ts | 22 +++++++++++++ 51 files changed, 297 insertions(+), 120 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9115f163e..ebeda183f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "devDependencies": { "@commitlint/cli": "^15.0.0", "@commitlint/config-angular": "^15.0.0", - "@discordjs/docgen": "^0.10.0", + "@discordjs/docgen": "^0.11.0", "@favware/npm-deprecate": "^1.0.4", "@types/node": "^16.11.10", "conventional-changelog-cli": "^2.1.1", @@ -1015,9 +1015,9 @@ } }, "node_modules/@discordjs/docgen": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@discordjs/docgen/-/docgen-0.10.0.tgz", - "integrity": "sha512-dtZs7wwTCORwjPutC1WrN/i3O29lVDdfVATzD7WCgZbdB+sJ3BprSdjd4TaxLrEIHwlnS0ZVj1iUg+cL4RL+Tw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/docgen/-/docgen-0.11.0.tgz", + "integrity": "sha512-0vcZmJkGUpV4HCvhz6zPECal8fvKeuD7QLal3leFilS1QGVH1hPf/cWPxCLN6T8dFugj8aLtQJF/gN5bNFLUoQ==", "dev": true, "dependencies": { "eslint": "^6.3.0", @@ -13510,9 +13510,9 @@ "integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==" }, "@discordjs/docgen": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@discordjs/docgen/-/docgen-0.10.0.tgz", - "integrity": "sha512-dtZs7wwTCORwjPutC1WrN/i3O29lVDdfVATzD7WCgZbdB+sJ3BprSdjd4TaxLrEIHwlnS0ZVj1iUg+cL4RL+Tw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/docgen/-/docgen-0.11.0.tgz", + "integrity": "sha512-0vcZmJkGUpV4HCvhz6zPECal8fvKeuD7QLal3leFilS1QGVH1hPf/cWPxCLN6T8dFugj8aLtQJF/gN5bNFLUoQ==", "dev": true, "requires": { "eslint": "^6.3.0", diff --git a/package.json b/package.json index 7fff58bb2..06afeac8d 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "devDependencies": { "@commitlint/cli": "^15.0.0", "@commitlint/config-angular": "^15.0.0", - "@discordjs/docgen": "^0.10.0", + "@discordjs/docgen": "^0.11.0", "@favware/npm-deprecate": "^1.0.4", "@types/node": "^16.11.10", "conventional-changelog-cli": "^2.1.1", diff --git a/src/client/Client.js b/src/client/Client.js index c5b38699f..bde16f3ca 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -15,7 +15,7 @@ const ClientPresence = require('../structures/ClientPresence'); const GuildPreview = require('../structures/GuildPreview'); const GuildTemplate = require('../structures/GuildTemplate'); const Invite = require('../structures/Invite'); -const Sticker = require('../structures/Sticker'); +const { Sticker } = require('../structures/Sticker'); const StickerPack = require('../structures/StickerPack'); const VoiceRegion = require('../structures/VoiceRegion'); const Webhook = require('../structures/Webhook'); diff --git a/src/client/actions/ChannelDelete.js b/src/client/actions/ChannelDelete.js index ad5cffd9a..43fdb326a 100644 --- a/src/client/actions/ChannelDelete.js +++ b/src/client/actions/ChannelDelete.js @@ -1,7 +1,9 @@ 'use strict'; const Action = require('./Action'); +const { deletedChannels } = require('../../structures/Channel'); const DMChannel = require('../../structures/DMChannel'); +const { deletedMessages } = require('../../structures/Message'); const { Events } = require('../../util/Constants'); class ChannelDeleteAction extends Action { @@ -16,10 +18,10 @@ class ChannelDeleteAction extends Action { if (channel) { client.channels._remove(channel.id); - channel.deleted = true; + deletedChannels.add(channel); if (channel.messages && !(channel instanceof DMChannel)) { for (const message of channel.messages.cache.values()) { - message.deleted = true; + deletedMessages.add(message); } } /** diff --git a/src/client/actions/ChannelUpdate.js b/src/client/actions/ChannelUpdate.js index 06058dd86..34d1a86a4 100644 --- a/src/client/actions/ChannelUpdate.js +++ b/src/client/actions/ChannelUpdate.js @@ -1,7 +1,7 @@ 'use strict'; const Action = require('./Action'); -const Channel = require('../../structures/Channel'); +const { Channel } = require('../../structures/Channel'); const { ChannelTypes } = require('../../util/Constants'); class ChannelUpdateAction extends Action { diff --git a/src/client/actions/GuildDelete.js b/src/client/actions/GuildDelete.js index b27d90228..1312d4ef4 100644 --- a/src/client/actions/GuildDelete.js +++ b/src/client/actions/GuildDelete.js @@ -1,6 +1,7 @@ 'use strict'; const Action = require('./Action'); +const { deletedGuilds } = require('../../structures/Guild'); const { Events } = require('../../util/Constants'); class GuildDeleteAction extends Action { @@ -37,7 +38,7 @@ class GuildDeleteAction extends Action { // Delete guild client.guilds.cache.delete(guild.id); - guild.deleted = true; + deletedGuilds.add(guild); /** * Emitted whenever a guild kicks the client or the guild is deleted/left. diff --git a/src/client/actions/GuildEmojiDelete.js b/src/client/actions/GuildEmojiDelete.js index 42af70c12..0c202877b 100644 --- a/src/client/actions/GuildEmojiDelete.js +++ b/src/client/actions/GuildEmojiDelete.js @@ -1,12 +1,13 @@ 'use strict'; const Action = require('./Action'); +const { deletedEmojis } = require('../../structures/Emoji'); const { Events } = require('../../util/Constants'); class GuildEmojiDeleteAction extends Action { handle(emoji) { emoji.guild.emojis.cache.delete(emoji.id); - emoji.deleted = true; + deletedEmojis.add(emoji); /** * Emitted whenever a custom emoji is deleted in a guild. * @event Client#emojiDelete diff --git a/src/client/actions/GuildMemberRemove.js b/src/client/actions/GuildMemberRemove.js index b690446aa..5776696a5 100644 --- a/src/client/actions/GuildMemberRemove.js +++ b/src/client/actions/GuildMemberRemove.js @@ -1,6 +1,7 @@ 'use strict'; const Action = require('./Action'); +const { deletedGuildMembers } = require('../../structures/GuildMember'); const { Events, Status } = require('../../util/Constants'); class GuildMemberRemoveAction extends Action { @@ -12,7 +13,7 @@ class GuildMemberRemoveAction extends Action { member = this.getMember({ user: data.user }, guild); guild.memberCount--; if (member) { - member.deleted = true; + deletedGuildMembers.add(member); guild.members.cache.delete(member.id); /** * Emitted whenever a member leaves a guild, or is kicked. diff --git a/src/client/actions/GuildRoleDelete.js b/src/client/actions/GuildRoleDelete.js index 51754b35d..9d156db3b 100644 --- a/src/client/actions/GuildRoleDelete.js +++ b/src/client/actions/GuildRoleDelete.js @@ -1,6 +1,7 @@ 'use strict'; const Action = require('./Action'); +const { deletedRoles } = require('../../structures/Role'); const { Events } = require('../../util/Constants'); class GuildRoleDeleteAction extends Action { @@ -13,7 +14,7 @@ class GuildRoleDeleteAction extends Action { role = guild.roles.cache.get(data.role_id); if (role) { guild.roles.cache.delete(data.role_id); - role.deleted = true; + deletedRoles.add(role); /** * Emitted whenever a guild role is deleted. * @event Client#roleDelete diff --git a/src/client/actions/GuildStickerDelete.js b/src/client/actions/GuildStickerDelete.js index 2d845eb8f..4adfe52fd 100644 --- a/src/client/actions/GuildStickerDelete.js +++ b/src/client/actions/GuildStickerDelete.js @@ -1,12 +1,13 @@ 'use strict'; const Action = require('./Action'); +const { deletedStickers } = require('../../structures/Sticker'); const { Events } = require('../../util/Constants'); class GuildStickerDeleteAction extends Action { handle(sticker) { sticker.guild.stickers.cache.delete(sticker.id); - sticker.deleted = true; + deletedStickers.add(sticker); /** * Emitted whenever a custom sticker is deleted in a guild. * @event Client#stickerDelete diff --git a/src/client/actions/MessageDelete.js b/src/client/actions/MessageDelete.js index 3c5f86aaa..22921d3cc 100644 --- a/src/client/actions/MessageDelete.js +++ b/src/client/actions/MessageDelete.js @@ -1,6 +1,7 @@ 'use strict'; const Action = require('./Action'); +const { deletedMessages } = require('../../structures/Message'); const { Events } = require('../../util/Constants'); class MessageDeleteAction extends Action { @@ -14,7 +15,7 @@ class MessageDeleteAction extends Action { message = this.getMessage(data, channel); if (message) { channel.messages.cache.delete(message.id); - message.deleted = true; + deletedMessages.add(message); /** * Emitted whenever a message is deleted. * @event Client#messageDelete diff --git a/src/client/actions/MessageDeleteBulk.js b/src/client/actions/MessageDeleteBulk.js index e43d0f327..31a371752 100644 --- a/src/client/actions/MessageDeleteBulk.js +++ b/src/client/actions/MessageDeleteBulk.js @@ -2,6 +2,7 @@ const { Collection } = require('@discordjs/collection'); const Action = require('./Action'); +const { deletedMessages } = require('../../structures/Message'); const { Events } = require('../../util/Constants'); class MessageDeleteBulkAction extends Action { @@ -24,7 +25,7 @@ class MessageDeleteBulkAction extends Action { false, ); if (message) { - message.deleted = true; + deletedMessages.add(message); messages.set(message.id, message); channel.messages.cache.delete(id); } diff --git a/src/client/actions/StageInstanceDelete.js b/src/client/actions/StageInstanceDelete.js index 01e948d9c..a227a9cac 100644 --- a/src/client/actions/StageInstanceDelete.js +++ b/src/client/actions/StageInstanceDelete.js @@ -1,6 +1,7 @@ 'use strict'; const Action = require('./Action'); +const { deletedStageInstances } = require('../../structures/StageInstance'); const { Events } = require('../../util/Constants'); class StageInstanceDeleteAction extends Action { @@ -12,7 +13,7 @@ class StageInstanceDeleteAction extends Action { const stageInstance = channel.guild.stageInstances._add(data); if (stageInstance) { channel.guild.stageInstances.cache.delete(stageInstance.id); - stageInstance.deleted = true; + deletedStageInstances.add(stageInstance); /** * Emitted whenever a stage instance is deleted. diff --git a/src/client/actions/ThreadDelete.js b/src/client/actions/ThreadDelete.js index 6a23f8e6d..9307dd2c8 100644 --- a/src/client/actions/ThreadDelete.js +++ b/src/client/actions/ThreadDelete.js @@ -1,6 +1,8 @@ 'use strict'; const Action = require('./Action'); +const { deletedChannels } = require('../../structures/Channel'); +const { deletedMessages } = require('../../structures/Message'); const { Events } = require('../../util/Constants'); class ThreadDeleteAction extends Action { @@ -10,9 +12,9 @@ class ThreadDeleteAction extends Action { if (thread) { client.channels._remove(thread.id); - thread.deleted = true; + deletedChannels.add(thread); for (const message of thread.messages.cache.values()) { - message.deleted = true; + deletedMessages.add(message); } /** diff --git a/src/index.js b/src/index.js index 5561c7aa3..c01f62d8b 100644 --- a/src/index.js +++ b/src/index.js @@ -79,7 +79,7 @@ exports.BaseGuildVoiceChannel = require('./structures/BaseGuildVoiceChannel'); exports.BaseMessageComponent = require('./structures/BaseMessageComponent'); exports.ButtonInteraction = require('./structures/ButtonInteraction'); exports.CategoryChannel = require('./structures/CategoryChannel'); -exports.Channel = require('./structures/Channel'); +exports.Channel = require('./structures/Channel').Channel; exports.ClientApplication = require('./structures/ClientApplication'); exports.ClientPresence = require('./structures/ClientPresence'); exports.ClientUser = require('./structures/ClientUser'); @@ -88,14 +88,14 @@ exports.CommandInteraction = require('./structures/CommandInteraction'); exports.CommandInteractionOptionResolver = require('./structures/CommandInteractionOptionResolver'); exports.ContextMenuInteraction = require('./structures/ContextMenuInteraction'); exports.DMChannel = require('./structures/DMChannel'); -exports.Emoji = require('./structures/Emoji'); -exports.Guild = require('./structures/Guild'); +exports.Emoji = require('./structures/Emoji').Emoji; +exports.Guild = require('./structures/Guild').Guild; exports.GuildAuditLogs = require('./structures/GuildAuditLogs'); exports.GuildAuditLogsEntry = require('./structures/GuildAuditLogs').Entry; exports.GuildBan = require('./structures/GuildBan'); exports.GuildChannel = require('./structures/GuildChannel'); exports.GuildEmoji = require('./structures/GuildEmoji'); -exports.GuildMember = require('./structures/GuildMember'); +exports.GuildMember = require('./structures/GuildMember').GuildMember; exports.GuildPreview = require('./structures/GuildPreview'); exports.GuildPreviewEmoji = require('./structures/GuildPreviewEmoji'); exports.GuildTemplate = require('./structures/GuildTemplate'); @@ -107,7 +107,7 @@ exports.InteractionWebhook = require('./structures/InteractionWebhook'); exports.Invite = require('./structures/Invite'); exports.InviteStageInstance = require('./structures/InviteStageInstance'); exports.InviteGuild = require('./structures/InviteGuild'); -exports.Message = require('./structures/Message'); +exports.Message = require('./structures/Message').Message; exports.MessageActionRow = require('./structures/MessageActionRow'); exports.MessageAttachment = require('./structures/MessageAttachment'); exports.MessageButton = require('./structures/MessageButton'); @@ -127,11 +127,11 @@ exports.Presence = require('./structures/Presence').Presence; exports.ReactionCollector = require('./structures/ReactionCollector'); exports.ReactionEmoji = require('./structures/ReactionEmoji'); exports.RichPresenceAssets = require('./structures/Presence').RichPresenceAssets; -exports.Role = require('./structures/Role'); +exports.Role = require('./structures/Role').Role; exports.SelectMenuInteraction = require('./structures/SelectMenuInteraction'); exports.StageChannel = require('./structures/StageChannel'); -exports.StageInstance = require('./structures/StageInstance'); -exports.Sticker = require('./structures/Sticker'); +exports.StageInstance = require('./structures/StageInstance').StageInstance; +exports.Sticker = require('./structures/Sticker').Sticker; exports.StickerPack = require('./structures/StickerPack'); exports.StoreChannel = require('./structures/StoreChannel'); exports.Team = require('./structures/Team'); diff --git a/src/managers/ChannelManager.js b/src/managers/ChannelManager.js index 9fa408b00..802f765e5 100644 --- a/src/managers/ChannelManager.js +++ b/src/managers/ChannelManager.js @@ -1,7 +1,7 @@ 'use strict'; const CachedManager = require('./CachedManager'); -const Channel = require('../structures/Channel'); +const { Channel } = require('../structures/Channel'); const { Events, ThreadChannelTypes } = require('../util/Constants'); let cacheWarningEmitted = false; diff --git a/src/managers/GuildBanManager.js b/src/managers/GuildBanManager.js index 09c25043f..e7039b33e 100644 --- a/src/managers/GuildBanManager.js +++ b/src/managers/GuildBanManager.js @@ -4,7 +4,7 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { TypeError, Error } = require('../errors'); const GuildBan = require('../structures/GuildBan'); -const GuildMember = require('../structures/GuildMember'); +const { GuildMember } = require('../structures/GuildMember'); /** * Manages API methods for GuildBans and stores their cache. diff --git a/src/managers/GuildEmojiRoleManager.js b/src/managers/GuildEmojiRoleManager.js index c44fb3ec5..f8da58d2b 100644 --- a/src/managers/GuildEmojiRoleManager.js +++ b/src/managers/GuildEmojiRoleManager.js @@ -3,7 +3,7 @@ const { Collection } = require('@discordjs/collection'); const DataManager = require('./DataManager'); const { TypeError } = require('../errors'); -const Role = require('../structures/Role'); +const { Role } = require('../structures/Role'); /** * Manages API methods for roles belonging to emojis and stores their cache. diff --git a/src/managers/GuildManager.js b/src/managers/GuildManager.js index 87c714808..6b8cbf270 100644 --- a/src/managers/GuildManager.js +++ b/src/managers/GuildManager.js @@ -2,13 +2,13 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); -const Guild = require('../structures/Guild'); +const { Guild } = require('../structures/Guild'); const GuildChannel = require('../structures/GuildChannel'); const GuildEmoji = require('../structures/GuildEmoji'); -const GuildMember = require('../structures/GuildMember'); +const { GuildMember } = require('../structures/GuildMember'); const Invite = require('../structures/Invite'); const OAuth2Guild = require('../structures/OAuth2Guild'); -const Role = require('../structures/Role'); +const { Role } = require('../structures/Role'); const { ChannelTypes, Events, diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index d0a4386d5..0a9e7d9ff 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -4,8 +4,8 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { Error, TypeError, RangeError } = require('../errors'); const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel'); -const GuildMember = require('../structures/GuildMember'); -const Role = require('../structures/Role'); +const { GuildMember } = require('../structures/GuildMember'); +const { Role } = require('../structures/Role'); const { Events, Opcodes } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); diff --git a/src/managers/GuildMemberRoleManager.js b/src/managers/GuildMemberRoleManager.js index 74d60d1ba..bdb60ae00 100644 --- a/src/managers/GuildMemberRoleManager.js +++ b/src/managers/GuildMemberRoleManager.js @@ -3,7 +3,7 @@ const { Collection } = require('@discordjs/collection'); const DataManager = require('./DataManager'); const { TypeError } = require('../errors'); -const Role = require('../structures/Role'); +const { Role } = require('../structures/Role'); /** * Manages API methods for roles of a GuildMember and stores their cache. diff --git a/src/managers/GuildStickerManager.js b/src/managers/GuildStickerManager.js index d329f539f..68abfb03b 100644 --- a/src/managers/GuildStickerManager.js +++ b/src/managers/GuildStickerManager.js @@ -4,7 +4,7 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { TypeError } = require('../errors'); const MessagePayload = require('../structures/MessagePayload'); -const Sticker = require('../structures/Sticker'); +const { Sticker } = require('../structures/Sticker'); /** * Manages API methods for Guild Stickers and stores their cache. diff --git a/src/managers/MessageManager.js b/src/managers/MessageManager.js index 4d8a6a7d8..a1e9a8b86 100644 --- a/src/managers/MessageManager.js +++ b/src/managers/MessageManager.js @@ -3,7 +3,7 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { TypeError } = require('../errors'); -const Message = require('../structures/Message'); +const { Message } = require('../structures/Message'); const MessagePayload = require('../structures/MessagePayload'); const Util = require('../util/Util'); diff --git a/src/managers/PermissionOverwriteManager.js b/src/managers/PermissionOverwriteManager.js index 17d5e6cab..e93b1f794 100644 --- a/src/managers/PermissionOverwriteManager.js +++ b/src/managers/PermissionOverwriteManager.js @@ -4,7 +4,7 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { TypeError } = require('../errors'); const PermissionOverwrites = require('../structures/PermissionOverwrites'); -const Role = require('../structures/Role'); +const { Role } = require('../structures/Role'); const { OverwriteTypes } = require('../util/Constants'); let cacheWarningEmitted = false; diff --git a/src/managers/RoleManager.js b/src/managers/RoleManager.js index 390cece21..094bc741e 100644 --- a/src/managers/RoleManager.js +++ b/src/managers/RoleManager.js @@ -3,7 +3,7 @@ const { Collection } = require('@discordjs/collection'); const CachedManager = require('./CachedManager'); const { TypeError } = require('../errors'); -const Role = require('../structures/Role'); +const { Role } = require('../structures/Role'); const DataResolver = require('../util/DataResolver'); const Permissions = require('../util/Permissions'); const { resolveColor, setPosition } = require('../util/Util'); diff --git a/src/managers/StageInstanceManager.js b/src/managers/StageInstanceManager.js index b56e145b1..478f26f5c 100644 --- a/src/managers/StageInstanceManager.js +++ b/src/managers/StageInstanceManager.js @@ -2,7 +2,7 @@ const CachedManager = require('./CachedManager'); const { TypeError, Error } = require('../errors'); -const StageInstance = require('../structures/StageInstance'); +const { StageInstance } = require('../structures/StageInstance'); const { PrivacyLevels } = require('../util/Constants'); /** diff --git a/src/managers/UserManager.js b/src/managers/UserManager.js index 8aa1e4747..816214d07 100644 --- a/src/managers/UserManager.js +++ b/src/managers/UserManager.js @@ -1,8 +1,8 @@ 'use strict'; const CachedManager = require('./CachedManager'); -const GuildMember = require('../structures/GuildMember'); -const Message = require('../structures/Message'); +const { GuildMember } = require('../structures/GuildMember'); +const { Message } = require('../structures/Message'); const ThreadMember = require('../structures/ThreadMember'); const User = require('../structures/User'); diff --git a/src/structures/BaseGuildEmoji.js b/src/structures/BaseGuildEmoji.js index 41dc792c2..5a12bd9da 100644 --- a/src/structures/BaseGuildEmoji.js +++ b/src/structures/BaseGuildEmoji.js @@ -1,6 +1,6 @@ 'use strict'; -const Emoji = require('./Emoji'); +const { Emoji } = require('./Emoji'); /** * Parent class for {@link GuildEmoji} and {@link GuildPreviewEmoji}. diff --git a/src/structures/Channel.js b/src/structures/Channel.js index 519066fa5..ba9a52ebf 100644 --- a/src/structures/Channel.js +++ b/src/structures/Channel.js @@ -12,6 +12,13 @@ let VoiceChannel; const { ChannelTypes, ThreadChannelTypes, VoiceBasedChannelTypes } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedChannels = new WeakSet(); + /** * Represents any channel on Discord. * @extends {Base} @@ -28,12 +35,6 @@ class Channel extends Base { */ this.type = type ?? 'UNKNOWN'; - /** - * Whether the channel has been deleted - * @type {boolean} - */ - this.deleted = false; - if (data && immediatePatch) this._patch(data); } @@ -63,6 +64,19 @@ class Channel extends Base { return new Date(this.createdTimestamp); } + /** + * Whether or not the structure has been deleted + * @type {boolean} + */ + get deleted() { + return deletedChannels.has(this); + } + + set deleted(value) { + if (value) deletedChannels.add(this); + else deletedChannels.delete(this); + } + /** * Whether this Channel is a partial * This is always false outside of DM channels. @@ -197,7 +211,8 @@ class Channel extends Base { } } -module.exports = Channel; +exports.Channel = Channel; +exports.deletedChannels = deletedChannels; /** * @external APIChannel diff --git a/src/structures/DMChannel.js b/src/structures/DMChannel.js index 3eb2f823b..555de4f40 100644 --- a/src/structures/DMChannel.js +++ b/src/structures/DMChannel.js @@ -1,6 +1,6 @@ 'use strict'; -const Channel = require('./Channel'); +const { Channel } = require('./Channel'); const TextBasedChannel = require('./interfaces/TextBasedChannel'); const MessageManager = require('../managers/MessageManager'); diff --git a/src/structures/Emoji.js b/src/structures/Emoji.js index 12f909822..215dd33df 100644 --- a/src/structures/Emoji.js +++ b/src/structures/Emoji.js @@ -3,6 +3,13 @@ const Base = require('./Base'); const SnowflakeUtil = require('../util/SnowflakeUtil'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedEmojis = new WeakSet(); + /** * Represents raw emoji data from the API * @typedef {APIEmoji} RawEmoji @@ -35,12 +42,19 @@ class Emoji extends Base { * @type {?Snowflake} */ this.id = emoji.id; + } - /** - * Whether this emoji has been deleted - * @type {boolean} - */ - this.deleted = false; + /** + * Whether or not the structure has been deleted + * @type {boolean} + */ + get deleted() { + return deletedEmojis.has(this); + } + + set deleted(value) { + if (value) deletedEmojis.add(this); + else deletedEmojis.delete(this); } /** @@ -106,7 +120,8 @@ class Emoji extends Base { } } -module.exports = Emoji; +exports.Emoji = Emoji; +exports.deletedEmojis = deletedEmojis; /** * @external APIEmoji diff --git a/src/structures/Guild.js b/src/structures/Guild.js index d9c789bc4..2bfc381e3 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -37,6 +37,13 @@ const Util = require('../util/Util'); let deprecationEmittedForSetChannelPositions = false; let deprecationEmittedForSetRolePositions = false; +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedGuilds = new WeakSet(); + /** * Represents a guild (or a server) on Discord. * It's recommended to see if a guild is available before performing operations or reading data from it. You can @@ -101,12 +108,6 @@ class Guild extends AnonymousGuild { */ this.invites = new GuildInviteManager(this); - /** - * Whether the bot has been removed from the guild - * @type {boolean} - */ - this.deleted = false; - if (!data) return; if (data.unavailable) { /** @@ -126,6 +127,19 @@ class Guild extends AnonymousGuild { this.shardId = data.shardId; } + /** + * Whether or not the structure has been deleted + * @type {boolean} + */ + get deleted() { + return deletedGuilds.has(this); + } + + set deleted(value) { + if (value) deletedGuilds.add(this); + else deletedGuilds.delete(this); + } + /** * The Shard this Guild belongs to. * @type {WebSocketShard} @@ -1399,7 +1413,8 @@ class Guild extends AnonymousGuild { } } -module.exports = Guild; +exports.Guild = Guild; +exports.deletedGuilds = deletedGuilds; /** * @external APIGuild diff --git a/src/structures/GuildAuditLogs.js b/src/structures/GuildAuditLogs.js index 1faa178ff..b035d422f 100644 --- a/src/structures/GuildAuditLogs.js +++ b/src/structures/GuildAuditLogs.js @@ -2,8 +2,8 @@ const { Collection } = require('@discordjs/collection'); const Integration = require('./Integration'); -const StageInstance = require('./StageInstance'); -const Sticker = require('./Sticker'); +const { StageInstance } = require('./StageInstance'); +const { Sticker } = require('./Sticker'); const Webhook = require('./Webhook'); const { OverwriteTypes, PartialTypes } = require('../util/Constants'); const Permissions = require('../util/Permissions'); diff --git a/src/structures/GuildChannel.js b/src/structures/GuildChannel.js index 14dc77df4..fe1a246fc 100644 --- a/src/structures/GuildChannel.js +++ b/src/structures/GuildChannel.js @@ -1,6 +1,6 @@ 'use strict'; -const Channel = require('./Channel'); +const { Channel } = require('./Channel'); const PermissionOverwrites = require('./PermissionOverwrites'); const { Error } = require('../errors'); const PermissionOverwriteManager = require('../managers/PermissionOverwriteManager'); diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index 53d66a16d..4d9109c0a 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -7,6 +7,13 @@ const { Error } = require('../errors'); const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager'); const Permissions = require('../util/Permissions'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedGuildMembers = new WeakSet(); + /** * Represents a member of a guild on Discord. * @implements {TextBasedChannel} @@ -34,12 +41,6 @@ class GuildMember extends Base { */ this.premiumSinceTimestamp = null; - /** - * Whether the member has been removed from the guild - * @type {boolean} - */ - this.deleted = false; - /** * The nickname of this member, if they have one * @type {?string} @@ -89,6 +90,19 @@ class GuildMember extends Base { return clone; } + /** + * Whether or not the structure has been deleted + * @type {boolean} + */ + get deleted() { + return deletedGuildMembers.has(this); + } + + set deleted(value) { + if (value) deletedGuildMembers.add(this); + else deletedGuildMembers.delete(this); + } + /** * Whether this GuildMember is a partial * @type {boolean} @@ -384,7 +398,8 @@ class GuildMember extends Base { TextBasedChannel.applyToClass(GuildMember); -module.exports = GuildMember; +exports.GuildMember = GuildMember; +exports.deletedGuildMembers = deletedGuildMembers; /** * @external APIGuildMember diff --git a/src/structures/Message.js b/src/structures/Message.js index cb9a89f65..622bf10fc 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -10,7 +10,7 @@ const Embed = require('./MessageEmbed'); const Mentions = require('./MessageMentions'); const MessagePayload = require('./MessagePayload'); const ReactionCollector = require('./ReactionCollector'); -const Sticker = require('./Sticker'); +const { Sticker } = require('./Sticker'); const { Error } = require('../errors'); const ReactionManager = require('../managers/ReactionManager'); const { InteractionTypes, MessageTypes, SystemMessageTypes } = require('../util/Constants'); @@ -19,6 +19,13 @@ const Permissions = require('../util/Permissions'); const SnowflakeUtil = require('../util/SnowflakeUtil'); const Util = require('../util/Util'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedMessages = new WeakSet(); + /** * Represents a message on Discord. * @extends {Base} @@ -39,12 +46,6 @@ class Message extends Base { */ this.guildId = data.guild_id ?? this.channel?.guild?.id ?? null; - /** - * Whether this message has been deleted - * @type {boolean} - */ - this.deleted = false; - this._patch(data); } @@ -348,6 +349,19 @@ class Message extends Base { } } + /** + * Whether or not the structure has been deleted + * @type {boolean} + */ + get deleted() { + return deletedMessages.has(this); + } + + set deleted(value) { + if (value) deletedMessages.add(this); + else deletedMessages.delete(this); + } + /** * The channel that the message was sent in * @type {TextChannel|DMChannel|NewsChannel|ThreadChannel} @@ -942,4 +956,5 @@ class Message extends Base { } } -module.exports = Message; +exports.Message = Message; +exports.deletedMessages = deletedMessages; diff --git a/src/structures/MessageMentions.js b/src/structures/MessageMentions.js index eb98dcfe3..9b935f940 100644 --- a/src/structures/MessageMentions.js +++ b/src/structures/MessageMentions.js @@ -185,7 +185,7 @@ class MessageMentions { */ has(data, { ignoreDirect = false, ignoreRoles = false, ignoreEveryone = false } = {}) { if (!ignoreEveryone && this.everyone) return true; - const GuildMember = require('./GuildMember'); + const { GuildMember } = require('./GuildMember'); if (!ignoreRoles && data instanceof GuildMember) { for (const role of this.roles.values()) if (data.roles.cache.has(role.id)) return true; } diff --git a/src/structures/MessagePayload.js b/src/structures/MessagePayload.js index 8b309ba52..e0742a36d 100644 --- a/src/structures/MessagePayload.js +++ b/src/structures/MessagePayload.js @@ -66,7 +66,7 @@ class MessagePayload { */ get isUser() { const User = require('./User'); - const GuildMember = require('./GuildMember'); + const { GuildMember } = require('./GuildMember'); return this.target instanceof User || this.target instanceof GuildMember; } @@ -76,7 +76,7 @@ class MessagePayload { * @readonly */ get isMessage() { - const Message = require('./Message'); + const { Message } = require('./Message'); return this.target instanceof Message; } diff --git a/src/structures/PartialGroupDMChannel.js b/src/structures/PartialGroupDMChannel.js index 6d7f1e0d3..715d0b67d 100644 --- a/src/structures/PartialGroupDMChannel.js +++ b/src/structures/PartialGroupDMChannel.js @@ -1,6 +1,6 @@ 'use strict'; -const Channel = require('./Channel'); +const { Channel } = require('./Channel'); const { Error } = require('../errors'); /** diff --git a/src/structures/PermissionOverwrites.js b/src/structures/PermissionOverwrites.js index f9351a8e6..017bf26bc 100644 --- a/src/structures/PermissionOverwrites.js +++ b/src/structures/PermissionOverwrites.js @@ -1,7 +1,7 @@ 'use strict'; const Base = require('./Base'); -const Role = require('./Role'); +const { Role } = require('./Role'); const { TypeError } = require('../errors'); const { OverwriteTypes } = require('../util/Constants'); const Permissions = require('../util/Permissions'); diff --git a/src/structures/Presence.js b/src/structures/Presence.js index ee1f2fc7e..ce7620b46 100644 --- a/src/structures/Presence.js +++ b/src/structures/Presence.js @@ -1,7 +1,7 @@ 'use strict'; const Base = require('./Base'); -const Emoji = require('./Emoji'); +const { Emoji } = require('./Emoji'); const ActivityFlags = require('../util/ActivityFlags'); const { ActivityTypes } = require('../util/Constants'); const Util = require('../util/Util'); diff --git a/src/structures/ReactionEmoji.js b/src/structures/ReactionEmoji.js index 5c4bc1345..bcd247055 100644 --- a/src/structures/ReactionEmoji.js +++ b/src/structures/ReactionEmoji.js @@ -1,6 +1,6 @@ 'use strict'; -const Emoji = require('./Emoji'); +const { Emoji } = require('./Emoji'); const Util = require('../util/Util'); /** diff --git a/src/structures/Role.js b/src/structures/Role.js index 5712edc53..a8e7ea888 100644 --- a/src/structures/Role.js +++ b/src/structures/Role.js @@ -6,6 +6,13 @@ const Permissions = require('../util/Permissions'); const SnowflakeUtil = require('../util/SnowflakeUtil'); const Util = require('../util/Util'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedRoles = new WeakSet(); + /** * Represents a role on Discord. * @extends {Base} @@ -32,12 +39,6 @@ class Role extends Base { */ this.unicodeEmoji = null; - /** - * Whether the role has been deleted - * @type {boolean} - */ - this.deleted = false; - if (data) this._patch(data); } @@ -146,6 +147,19 @@ class Role extends Base { return new Date(this.createdTimestamp); } + /** + * Whether or not the role has been deleted + * @type {boolean} + */ + get deleted() { + return deletedRoles.has(this); + } + + set deleted(value) { + if (value) deletedRoles.add(this); + else deletedRoles.delete(this); + } + /** * The hexadecimal version of the role color, with a leading hashtag * @type {string} @@ -462,7 +476,8 @@ class Role extends Base { } } -module.exports = Role; +exports.Role = Role; +exports.deletedRoles = deletedRoles; /** * @external APIRole diff --git a/src/structures/StageInstance.js b/src/structures/StageInstance.js index 9f8bcfd72..e695841a3 100644 --- a/src/structures/StageInstance.js +++ b/src/structures/StageInstance.js @@ -4,6 +4,13 @@ const Base = require('./Base'); const { PrivacyLevels } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedStageInstances = new WeakSet(); + /** * Represents a stage instance. * @extends {Base} @@ -18,12 +25,6 @@ class StageInstance extends Base { */ this.id = data.id; - /** - * Whether the stage instance has been deleted - * @type {boolean} - */ - this.deleted = false; - this._patch(data); } @@ -80,6 +81,19 @@ class StageInstance extends Base { return this.client.channels.resolve(this.channelId); } + /** + * Whether or not the stage instance has been deleted + * @type {boolean} + */ + get deleted() { + return deletedStageInstances.has(this); + } + + set deleted(value) { + if (value) deletedStageInstances.add(this); + else deletedStageInstances.delete(this); + } + /** * The guild this stage instance belongs to * @type {?Guild} @@ -115,7 +129,7 @@ class StageInstance extends Base { async delete() { await this.guild.stageInstances.delete(this.channelId); const clone = this._clone(); - clone.deleted = true; + deletedStageInstances.add(clone); return clone; } @@ -152,4 +166,5 @@ class StageInstance extends Base { } } -module.exports = StageInstance; +exports.StageInstance = StageInstance; +exports.deletedStageInstances = deletedStageInstances; diff --git a/src/structures/Sticker.js b/src/structures/Sticker.js index 1035a4d96..e2e0095a0 100644 --- a/src/structures/Sticker.js +++ b/src/structures/Sticker.js @@ -4,6 +4,13 @@ const Base = require('./Base'); const { StickerFormatTypes, StickerTypes } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); +/** + * @type {WeakSet} + * @private + * @internal + */ +const deletedStickers = new WeakSet(); + /** * Represents a Sticker. * @extends {Base} @@ -137,6 +144,19 @@ class Sticker extends Base { return new Date(this.createdTimestamp); } + /** + * Whether or not the stage instance has been deleted + * @type {boolean} + */ + get deleted() { + return deletedStickers.has(this); + } + + set deleted(value) { + if (value) deletedStickers.add(this); + else deletedStickers.delete(this); + } + /** * Whether this sticker is partial * @type {boolean} @@ -264,7 +284,8 @@ class Sticker extends Base { } } -module.exports = Sticker; +exports.Sticker = Sticker; +exports.deletedStickers = deletedStickers; /** * @external APISticker diff --git a/src/structures/StickerPack.js b/src/structures/StickerPack.js index c09af40cb..62f7f1aaf 100644 --- a/src/structures/StickerPack.js +++ b/src/structures/StickerPack.js @@ -2,7 +2,7 @@ const { Collection } = require('@discordjs/collection'); const Base = require('./Base'); -const Sticker = require('./Sticker'); +const { Sticker } = require('./Sticker'); const SnowflakeUtil = require('../util/SnowflakeUtil'); /** diff --git a/src/structures/ThreadChannel.js b/src/structures/ThreadChannel.js index 4726dbbd8..9a0f5c634 100644 --- a/src/structures/ThreadChannel.js +++ b/src/structures/ThreadChannel.js @@ -1,6 +1,6 @@ 'use strict'; -const Channel = require('./Channel'); +const { Channel } = require('./Channel'); const TextBasedChannel = require('./interfaces/TextBasedChannel'); const { RangeError } = require('../errors'); const MessageManager = require('../managers/MessageManager'); diff --git a/src/structures/WelcomeChannel.js b/src/structures/WelcomeChannel.js index 283659aa2..0741ab7cb 100644 --- a/src/structures/WelcomeChannel.js +++ b/src/structures/WelcomeChannel.js @@ -1,7 +1,7 @@ 'use strict'; const Base = require('./Base'); -const Emoji = require('./Emoji'); +const { Emoji } = require('./Emoji'); /** * Represents a channel link in a guild's welcome screen. diff --git a/src/structures/interfaces/TextBasedChannel.js b/src/structures/interfaces/TextBasedChannel.js index 24948ce7e..5d2daaaf9 100644 --- a/src/structures/interfaces/TextBasedChannel.js +++ b/src/structures/interfaces/TextBasedChannel.js @@ -156,7 +156,7 @@ class TextBasedChannel { */ async send(options) { const User = require('../User'); - const GuildMember = require('../GuildMember'); + const { GuildMember } = require('../GuildMember'); if (this instanceof User || this instanceof GuildMember) { const dm = await this.createDM(); diff --git a/typings/index.d.ts b/typings/index.d.ts index 6a7191d1f..b432fcb6b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -490,7 +490,9 @@ export abstract class Channel extends Base { public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean); public readonly createdAt: Date; public readonly createdTimestamp: number; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public id: Snowflake; public readonly partial: false; public type: keyof typeof ChannelTypes; @@ -825,7 +827,9 @@ export class Emoji extends Base { public animated: boolean | null; public readonly createdAt: Date | null; public readonly createdTimestamp: number | null; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public id: Snowflake | null; public name: string | null; public readonly identifier: string; @@ -850,7 +854,9 @@ export class Guild extends AnonymousGuild { public channels: GuildChannelManager; public commands: GuildApplicationCommandManager; public defaultMessageNotifications: DefaultMessageNotificationLevel | number; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public discoverySplash: string | null; public emojis: GuildEmojiManager; public explicitContentFilter: ExplicitContentFilterLevel; @@ -1054,7 +1060,9 @@ export class GuildMember extends PartialTextBasedChannel(Base) { private constructor(client: Client, data: RawGuildMemberData, guild: Guild); public avatar: string | null; public readonly bannable: boolean; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public readonly displayColor: number; public readonly displayHexColor: HexColorString; public readonly displayName: string; @@ -1392,7 +1400,9 @@ export class Message extends Base { public createdTimestamp: number; public readonly crosspostable: boolean; public readonly deletable: boolean; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public readonly editable: boolean; public readonly editedAt: Date | null; public editedTimestamp: number | null; @@ -1821,7 +1831,9 @@ export class Role extends Base { public color: number; public readonly createdAt: Date; public readonly createdTimestamp: number; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public readonly editable: boolean; public guild: Guild; public readonly hexColor: HexColorString; @@ -1999,7 +2011,9 @@ export class StageChannel extends BaseGuildVoiceChannel { export class StageInstance extends Base { private constructor(client: Client, data: RawStageInstanceData, channel: StageChannel); public id: Snowflake; - public deleted: boolean; + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public guildId: Snowflake; public channelId: Snowflake; public topic: string; @@ -2016,6 +2030,9 @@ export class StageInstance extends Base { export class Sticker extends Base { private constructor(client: Client, data: RawStickerData); + public get deleted(): boolean; + /** @deprecated Will be removed in v14 */ + public set deleted(value: boolean); public readonly createdTimestamp: number; public readonly createdAt: Date; public available: boolean | null; diff --git a/typings/index.test-d.ts b/typings/index.test-d.ts index 68ac0092b..36c0891e8 100644 --- a/typings/index.test-d.ts +++ b/typings/index.test-d.ts @@ -83,6 +83,8 @@ import { GuildAuditLogsEntry, GuildAuditLogs, StageInstance, + Sticker, + Emoji, } from '.'; import type { ApplicationCommandOptionTypes } from './enums'; import { expectAssignable, expectDeprecated, expectNotAssignable, expectNotType, expectType } from 'tsd'; @@ -749,6 +751,7 @@ declare const newsChannel: NewsChannel; declare const textChannel: TextChannel; declare const storeChannel: StoreChannel; declare const categoryChannel: CategoryChannel; +declare const voiceChannel: VoiceChannel; declare const guild: Guild; declare const user: User; declare const guildMember: GuildMember; @@ -896,6 +899,25 @@ client.on('messageReactionAdd', async reaction => { expectType(reaction.message.content); }); +// Test .deleted deprecations +declare const emoji: Emoji; +declare const message: Message; +declare const role: Role; +declare const stageInstance: StageInstance; +declare const sticker: Sticker; +expectDeprecated((dmChannel.deleted = true)); +expectDeprecated((textChannel.deleted = true)); +expectDeprecated((voiceChannel.deleted = true)); +expectDeprecated((newsChannel.deleted = true)); +expectDeprecated((threadChannel.deleted = true)); +expectDeprecated((emoji.deleted = true)); +expectDeprecated((guildMember.deleted = true)); +expectDeprecated((guild.deleted = true)); +expectDeprecated((message.deleted = true)); +expectDeprecated((role.deleted = true)); +expectDeprecated((stageInstance.deleted = true)); +expectDeprecated((sticker.deleted = true)); + // Test interactions declare const interaction: Interaction; declare const booleanValue: boolean;