mirror of
https://github.com/danbulant/discord.js
synced 2026-06-15 04:31:15 +00:00
40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
"use strict";
|
|
|
|
export default class Bucket { // Adapted from Eris
|
|
constructor(tokenLimit, interval) {
|
|
this.tokenLimit = tokenLimit;
|
|
this.interval = interval;
|
|
this.extraTime = 500;
|
|
this.lastReset = this.tokens = this.lastSend = 0;
|
|
this._queue = [];
|
|
}
|
|
|
|
queue(func) {
|
|
this._queue.push(func);
|
|
this.check();
|
|
}
|
|
|
|
check() {
|
|
if(this.timeout || this._queue.length === 0) {
|
|
return;
|
|
}
|
|
if(this.lastReset + this.interval + this.extraTime < Date.now()) {
|
|
this.lastReset = Date.now();
|
|
this.tokens = Math.max(0, this.tokens - this.tokenLimit);
|
|
}
|
|
|
|
var val;
|
|
while(this._queue.length > 0 && this.tokens < this.tokenLimit) {
|
|
this.tokens++;
|
|
this._queue.shift()();
|
|
this.lastSend = Date.now();
|
|
}
|
|
|
|
if(this._queue.length > 0 && !this.timeout) {
|
|
this.timeout = setTimeout(() => {
|
|
this.timeout = null;
|
|
this.check();
|
|
}, this.tokens < this.tokenLimit ? 1 : Math.max(0, this.lastReset + this.interval + this.extraTime - Date.now()));
|
|
}
|
|
}
|
|
}
|