From 407bc77d348f20ea0d5f91c5fb71e47f096a84ff Mon Sep 17 00:00:00 2001 From: SpaceEEC Date: Thu, 7 May 2020 23:39:23 +0200 Subject: [PATCH] fix: in/de-crement max listener for client events (#4168) --- src/client/BaseClient.js | 22 ++++++++++++++++++++++ src/managers/GuildManager.js | 5 ++++- src/managers/GuildMemberManager.js | 12 ++++++++---- src/structures/MessageCollector.js | 4 ++-- src/structures/ReactionCollector.js | 4 ++-- typings/index.d.ts | 2 ++ 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/client/BaseClient.js b/src/client/BaseClient.js index a381e1aa0..29abeca57 100644 --- a/src/client/BaseClient.js +++ b/src/client/BaseClient.js @@ -139,6 +139,28 @@ class BaseClient extends EventEmitter { this._immediates.delete(immediate); } + /** + * Increments max listeners by one, if they are not zero. + * @private + */ + incrementMaxListeners() { + const maxListeners = this.getMaxListeners(); + if (maxListeners !== 0) { + this.setMaxListeners(maxListeners + 1); + } + } + + /** + * Decrements max listeners by one, if they are not zero. + * @private + */ + decrementMaxListeners() { + const maxListeners = this.getMaxListeners(); + if (maxListeners !== 0) { + this.setMaxListeners(maxListeners - 1); + } + } + toJSON(...props) { return Util.flatten(this, { domain: false }, ...props); } diff --git a/src/managers/GuildManager.js b/src/managers/GuildManager.js index 42cbcd499..0454530f5 100644 --- a/src/managers/GuildManager.js +++ b/src/managers/GuildManager.js @@ -196,15 +196,18 @@ class GuildManager extends BaseManager { const handleGuild = guild => { if (guild.id === data.id) { - this.client.removeListener(Events.GUILD_CREATE, handleGuild); this.client.clearTimeout(timeout); + this.client.removeListener(Events.GUILD_CREATE, handleGuild); + this.client.decrementMaxListeners(); resolve(guild); } }; + this.client.incrementMaxListeners(); this.client.on(Events.GUILD_CREATE, handleGuild); const timeout = this.client.setTimeout(() => { this.client.removeListener(Events.GUILD_CREATE, handleGuild); + this.client.decrementMaxListeners(); resolve(this.client.guilds.add(data)); }, 10000); return undefined; diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 85a09e064..0cf6d6945 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -267,17 +267,21 @@ class GuildMemberManager extends BaseManager { (limit && fetchedMembers.size >= limit) || i === chunk.count ) { - this.guild.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler); + this.client.clearTimeout(timeout); + this.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler); + this.client.decrementMaxListeners(); let fetched = option ? fetchedMembers : this.cache; if (user_ids && !Array.isArray(user_ids) && fetched.size) fetched = fetched.first(); resolve(fetched); } }; - const timeout = this.guild.client.setTimeout(() => { - this.guild.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler); + const timeout = this.client.setTimeout(() => { + this.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler); + this.client.decrementMaxListeners(); reject(new Error('GUILD_MEMBERS_TIMEOUT')); }, time); - this.guild.client.on(Events.GUILD_MEMBERS_CHUNK, handler); + this.client.incrementMaxListeners(); + this.client.on(Events.GUILD_MEMBERS_CHUNK, handler); }); } } diff --git a/src/structures/MessageCollector.js b/src/structures/MessageCollector.js index f8f3d5ab8..740928d91 100644 --- a/src/structures/MessageCollector.js +++ b/src/structures/MessageCollector.js @@ -42,7 +42,7 @@ class MessageCollector extends Collector { this._handleChannelDeletion = this._handleChannelDeletion.bind(this); this._handleGuildDeletion = this._handleGuildDeletion.bind(this); - if (this.client.getMaxListeners() !== 0) this.client.setMaxListeners(this.client.getMaxListeners() + 1); + this.client.incrementMaxListeners(); this.client.on(Events.MESSAGE_CREATE, this.handleCollect); this.client.on(Events.MESSAGE_DELETE, this.handleDispose); this.client.on(Events.MESSAGE_BULK_DELETE, bulkDeleteListener); @@ -55,7 +55,7 @@ class MessageCollector extends Collector { this.client.removeListener(Events.MESSAGE_BULK_DELETE, bulkDeleteListener); this.client.removeListener(Events.CHANNEL_DELETE, this._handleChannelDeletion); this.client.removeListener(Events.GUILD_DELETE, this._handleGuildDeletion); - if (this.client.getMaxListeners() !== 0) this.client.setMaxListeners(this.client.getMaxListeners() - 1); + this.client.decrementMaxListeners(); }); } diff --git a/src/structures/ReactionCollector.js b/src/structures/ReactionCollector.js index 6da9d17d1..602ca8d3c 100644 --- a/src/structures/ReactionCollector.js +++ b/src/structures/ReactionCollector.js @@ -49,7 +49,7 @@ class ReactionCollector extends Collector { this._handleGuildDeletion = this._handleGuildDeletion.bind(this); this._handleMessageDeletion = this._handleMessageDeletion.bind(this); - if (this.client.getMaxListeners() !== 0) this.client.setMaxListeners(this.client.getMaxListeners() + 1); + this.client.incrementMaxListeners(); this.client.on(Events.MESSAGE_REACTION_ADD, this.handleCollect); this.client.on(Events.MESSAGE_REACTION_REMOVE, this.handleDispose); this.client.on(Events.MESSAGE_REACTION_REMOVE_ALL, this.empty); @@ -64,7 +64,7 @@ class ReactionCollector extends Collector { this.client.removeListener(Events.MESSAGE_DELETE, this._handleMessageDeletion); this.client.removeListener(Events.CHANNEL_DELETE, this._handleChannelDeletion); this.client.removeListener(Events.GUILD_DELETE, this._handleGuildDeletion); - if (this.client.getMaxListeners() !== 0) this.client.setMaxListeners(this.client.getMaxListeners() - 1); + this.client.decrementMaxListeners(); }); this.on('collect', (reaction, user) => { diff --git a/typings/index.d.ts b/typings/index.d.ts index 971916028..f9b0552a7 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -96,6 +96,8 @@ declare module 'discord.js' { private _immediates: Set; private readonly api: object; private rest: object; + private decrementMaxListeners(): void; + private incrementMaxListeners(): void; public options: ClientOptions; public clearInterval(interval: NodeJS.Timer): void;