Ratelimits working on client and in general

This commit is contained in:
plane000
2018-10-29 09:44:39 +00:00
parent 049405cce8
commit bf7e375f14
3 changed files with 75 additions and 22 deletions

View File

@@ -0,0 +1,50 @@
import {Logger} from './logger';
let buckets = { };
export class RateLimits {
constructor() {
Logger.info('Initialized ratelimiting middleware');
this.requestsPerSecond = 1;
setInterval(this.tick, 1000 / this.requestsPerSecond);
}
async request(obj, client, next) {
let id = obj.author.id;
if (!buckets[id]) {
Logger.debug(`New rate limiting bucket`);
buckets[id] = {id: id, tokens: [], lastUsed: new Date().getTime()};
for (let i = 0; i < this.requestsPerSecond; i++) {
buckets[id].tokens.push(1);
}
next();
return;
}
buckets[id].lastUsed = new Date().getTime();
if (buckets[id].tokens.length <= 0) {
Logger.middleware(`${id} is being rate limited`);
obj.limiting = true;
next();
return;
}
buckets[id].tokens.pop();
next();
}
tick() {
for (let bucket in buckets) {
// if (buckets[bucket].lastUsed += disposeTime >= new Date().getTime()) {
// delete buckets[bucket]; // remove element here, don't redefine
// continue;
// }
if (buckets[bucket].tokens.length > this.requestsPerSecond) continue;
buckets[bucket].tokens.push(1);
}
}
}