Merge pull request #8 from plane000/dev

Merge stable branch dev to master
This commit is contained in:
Benjamin Kyd
2018-10-30 18:24:04 +00:00
committed by GitHub
4 changed files with 43 additions and 15 deletions

View File

@@ -4,7 +4,7 @@ import {RateLimits} from './ratelimits'
export class Events extends RateLimits { // extends rate limits export class Events extends RateLimits { // extends rate limits
constructor() { constructor() {
super() super();
} }
async init(client) { async init(client) {
@@ -22,6 +22,13 @@ export class Events extends RateLimits { // extends rate limits
); );
}); });
this.client.on('error', async (err) => {
this.handle(err,
[this.handleError],
this.client
);
});
this.client.on('message', async (message) => { this.client.on('message', async (message) => {
this.handle(message, this.handle(message,
[super.request, this.handleMessage], [super.request, this.handleMessage],
@@ -30,6 +37,9 @@ export class Events extends RateLimits { // extends rate limits
}); });
} }
async handle(obj = [null], callbacks = [undefined], client) { async handle(obj = [null], callbacks = [undefined], client) {
let doNext = false; let doNext = false;
if (callbacks.length == 0) { if (callbacks.length == 0) {
@@ -56,9 +66,14 @@ export class Events extends RateLimits { // extends rate limits
next(); next();
} }
async handleMessage(obj, client, next) { async handleError(err, client, next) {
if (client.user.id == obj.author.id) return; Logger.error(`An error occured with the Discord API: ${err}`);
if (obj.limiting) obj.channel.send(`${obj.author} You are being rate limited`); next();
}
async handleMessage(message, client, next) {
if (client.user.id == message.author.id) return;
if (message.limiting) message.channel.send(`${message.author} You are being rate limited`);
next(); next();
} }
} }

9
src/guildmanager.js Normal file
View File

@@ -0,0 +1,9 @@
import {Logger} from './logger';
export class GuildManager {
constructor() {
}
}

5
src/messagemanager.js Normal file
View File

@@ -0,0 +1,5 @@
import {Logger} from './logger';
export class MessageManager {
}

View File

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