refactor: make Structure#deleted a getter to a WeakSet (#7074)

This commit is contained in:
Antonio Román
2021-12-08 10:47:54 +01:00
committed by GitHub
parent f410536c51
commit b0937502d3
51 changed files with 297 additions and 120 deletions

14
package-lock.json generated
View File

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

View File

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

View File

@@ -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');

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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');

View File

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

View File

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

View File

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

View File

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

View File

@@ -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');

View File

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

View File

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

View File

@@ -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');

View File

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

View File

@@ -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');

View File

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

View File

@@ -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');

View File

@@ -1,6 +1,6 @@
'use strict';
const Emoji = require('./Emoji');
const { Emoji } = require('./Emoji');
/**
* Parent class for {@link GuildEmoji} and {@link GuildPreviewEmoji}.

View File

@@ -12,6 +12,13 @@ let VoiceChannel;
const { ChannelTypes, ThreadChannelTypes, VoiceBasedChannelTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil');
/**
* @type {WeakSet<Channel>}
* @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
* <info>This is always false outside of DM channels.</info>
@@ -197,7 +211,8 @@ class Channel extends Base {
}
}
module.exports = Channel;
exports.Channel = Channel;
exports.deletedChannels = deletedChannels;
/**
* @external APIChannel

View File

@@ -1,6 +1,6 @@
'use strict';
const Channel = require('./Channel');
const { Channel } = require('./Channel');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const MessageManager = require('../managers/MessageManager');

View File

@@ -3,6 +3,13 @@
const Base = require('./Base');
const SnowflakeUtil = require('../util/SnowflakeUtil');
/**
* @type {WeakSet<Emoji>}
* @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

View File

@@ -37,6 +37,13 @@ const Util = require('../util/Util');
let deprecationEmittedForSetChannelPositions = false;
let deprecationEmittedForSetRolePositions = false;
/**
* @type {WeakSet<Guild>}
* @private
* @internal
*/
const deletedGuilds = new WeakSet();
/**
* Represents a guild (or a server) on Discord.
* <info>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

View File

@@ -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');

View File

@@ -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');

View File

@@ -7,6 +7,13 @@ const { Error } = require('../errors');
const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager');
const Permissions = require('../util/Permissions');
/**
* @type {WeakSet<GuildMember>}
* @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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
'use strict';
const Channel = require('./Channel');
const { Channel } = require('./Channel');
const { Error } = require('../errors');
/**

View File

@@ -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');

View File

@@ -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');

View File

@@ -1,6 +1,6 @@
'use strict';
const Emoji = require('./Emoji');
const { Emoji } = require('./Emoji');
const Util = require('../util/Util');
/**

View File

@@ -6,6 +6,13 @@ const Permissions = require('../util/Permissions');
const SnowflakeUtil = require('../util/SnowflakeUtil');
const Util = require('../util/Util');
/**
* @type {WeakSet<Role>}
* @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

View File

@@ -4,6 +4,13 @@ const Base = require('./Base');
const { PrivacyLevels } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil');
/**
* @type {WeakSet<StageInstance>}
* @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;

View File

@@ -4,6 +4,13 @@ const Base = require('./Base');
const { StickerFormatTypes, StickerTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil');
/**
* @type {WeakSet<StageInstance>}
* @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

View File

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

View File

@@ -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');

View File

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

View File

@@ -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();

31
typings/index.d.ts vendored
View File

@@ -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<Cached extends boolean = boolean> 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;

View File

@@ -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<string>(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;