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

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