UNPKG

discord-economy

Version:

Easy discord economy framework. Made with Sequelize.

146 lines (131 loc) 5.21 kB
class Queuing { constructor() { this.queue = []; this.paused = false; } addToQueue(object, firstElementExecute = true, notExecButSkip = false) { return new Promise((resolve, reject) => { let funcType = false; if (object.afterEvent) { if (!object.afterEvent.emitter || !object.afterEvent.event) return reject("Missing emitter or event options in afterEvent"); } if (typeof (object.value) == "function") { object.args = object.args || []; if (!Array.isArray(object.args)) return reject("Args option needs to be an array"); funcType = true; } let newObject = Object.assign(object, { resolve, reject, "functionType": funcType, "eventNeed": object.afterEvent ? true : false }); this.queue.push(newObject); if (notExecButSkip && this.queue.length == 1) return this._queueNextUp(newObject); if (!firstElementExecute && object.afterEvent != null && this.queue.length == 1) return this._queueNextUp(newObject, true); if (firstElementExecute && this.queue.length == 1 && this.paused == false) this._executeQueue(resolve, reject); }); } _executeQueue(resolve, reject) { if (this.queue.length == 0) return; if (this.paused) return; else { let queueF = this.queue[0]; let realResolve = resolve || queueF.resolve; let realReject = reject || queueF.reject; if (queueF.functionType) { //means it's a function try { let result = queueF.value(...queueF.args); if (result && result.then) { //It's a promise if (queueF.eventNeed) this._queueNextUp(queueF); result.then((...promiseRe) => { if (!Array.isArray(promiseRe)) promiseRe = [promiseRe]; realResolve(...promiseRe); if (!queueF.eventNeed) this._queueNextUp(queueF); }); result.catch((...errors) => { if (!Array.isArray(errors)) errors = [errors]; realReject(...errors); if (!queueF.eventNeed) this._queueNextUp(queueF); }); } else { //Not returning a promise if (!Array.isArray(result)) result = [result]; realResolve(...result); this._queueNextUp(queueF); } } catch (e) { realReject(e); this._queueNextUp(queueF); } } else { realResolve(queueF.value); this._queueNextUp(queueF); } } } _queueNextUp(queueF, skip = false) { let $this = this; if (skip) { let emitter = typeof (queueF.afterEvent.emitter) == "function" ? queueF.afterEvent.emitter() : queueF.afterEvent.emitter; if (!emitter) return return emitter.once(queueF.afterEvent.event, waitingToPassSkip.bind(this, queueF)); } if (queueF.eventNeed) { let emitter = typeof (queueF.afterEvent.emitter) == "function" ? queueF.afterEvent.emitter() : queueF.afterEvent.emitter; if (!emitter) return emitter.once(queueF.afterEvent.event, waitingToPass.bind(this, queueF)); } else { setTimeout(() => { // Adding a timeout of 5 ms so if the user pause the queue direclty after one finish it will be paused if (this.paused) return; this.queue.shift(); this._executeQueue(); }, 5); } } pause() { this.paused = true; } resume() { this.paused = false; this._executeQueue(); } unQueue(ind = 0) { return new Promise((resolve, reject) => { if (!this.queue[ind]) return reject("Nothing found with this index"); this.queue.splice(ind, 1); }); } get allQueueArgs() { let array = []; this.queue.forEach(object => { array.push(...object.args); }); return array; } get allQueueValues() { let array = []; this.queue.forEach(object => { array.push(object.value); }); return array; } clearQueue() { this.queue = []; } } function waitingToPass(queueF) { let $this = this; setTimeout(() => { if ($this.paused) return; $this.queue.shift(); $this._executeQueue(); }, 5); } function waitingToPassSkip(queueF) { let $this = this; setTimeout(() => { if ($this.paused) return; $this._executeQueue(); }, 5); } module.exports = Queuing;