diff --git a/src/structures/interfaces/Collector.js b/src/structures/interfaces/Collector.js index 3b324495926b..629ae2a9411f 100644 --- a/src/structures/interfaces/Collector.js +++ b/src/structures/interfaces/Collector.js @@ -13,6 +13,7 @@ const EventEmitter = require('events').EventEmitter; * Options to be applied to the collector. * @typedef {Object} CollectorOptions * @property {number} [time] How long to run the collector for + * @property {number} [idle] How long to stop the collector after inactivity in milliseconds */ /** @@ -62,6 +63,13 @@ class Collector extends EventEmitter { */ this._timeout = null; + /** + * Timeout for cleanup due to inactivity + * @type {?Timeout} + * @private + */ + this._idletimeout = null; + /** * Call this to handle an event as a collectable element * Accepts any event data as parameters @@ -70,6 +78,7 @@ class Collector extends EventEmitter { */ this.listener = this._handle.bind(this); if (options.time) this._timeout = this.client.setTimeout(() => this.stop('time'), options.time); + if (options.idle) this._idletimeout = this.client.setTimeout(() => this.stop('idle'), options.idle); } /** @@ -89,6 +98,11 @@ class Collector extends EventEmitter { * @param {Collector} collector The collector */ this.emit('collect', collect.value, this); + + if (this._idletimeout) { + this.client.clearTimeout(this._idletimeout); + this._idletimeout = this.client.setTimeout(() => this.stop('idle'), this.options.idle); + } } const post = this.postCheck(...args); @@ -136,7 +150,14 @@ class Collector extends EventEmitter { stop(reason = 'user') { if (this.ended) return; - if (this._timeout) this.client.clearTimeout(this._timeout); + if (this._timeout) { + this.client.clearTimeout(this._timeout); + this._timeout = null; + } + if (this._idletimeout) { + this.client.clearTimeout(this._idletimeout); + this._idletimeout = null; + } this.ended = true; this.cleanup(); diff --git a/typings/index.d.ts b/typings/index.d.ts index 91050e022eca..1c7c1cc2ea9f 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -362,7 +362,8 @@ declare module 'discord.js' { abstract class Collector extends EventEmitter { constructor(client: Client, filter: CollectorFilter, options?: CollectorOptions); - private _timeout: NodeJS.Timer; + private _timeout: NodeJS.Timer | null; + private _idletimeout: NodeJS.Timer | null; private _handle(...args: any[]): void; public readonly client: Client; @@ -1762,7 +1763,10 @@ declare module 'discord.js' { type CollectorHandler = { key: K, value: V }; type CollectorFilter = (...args: any[]) => boolean; - type CollectorOptions = { time?: number }; + type CollectorOptions = { + time?: number; + idle?: number; + }; type ColorResolvable = ('DEFAULT' | 'WHITE'