From 1100e20f78dd2662c2c56e82af9dcdb941c2685b Mon Sep 17 00:00:00 2001 From: plane000 Date: Mon, 29 Oct 2018 15:44:30 +0000 Subject: [PATCH 1/2] Fixed broken ratelimit middleware --- src/ratelimits.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ratelimits.js b/src/ratelimits.js index 505e10b..5eec4d1 100644 --- a/src/ratelimits.js +++ b/src/ratelimits.js @@ -1,22 +1,23 @@ import {Logger} from './logger'; let buckets = { }; +let requestsPerSecond = 0.2; export class RateLimits { constructor() { Logger.info('Initialized ratelimiting middleware'); - this.requestsPerSecond = 1; - setInterval(this.tick, 1000 / this.requestsPerSecond); + setInterval(this.tick, 1000 / requestsPerSecond); } async request(obj, client, next) { let id = obj.author.id; + if (id == client.user.id) { return; } 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++) { + for (let i = 0; i < requestsPerSecond; i++) { buckets[id].tokens.push(1); } @@ -25,25 +26,24 @@ export class RateLimits { } buckets[id].lastUsed = new Date().getTime(); - + + Logger.debug(buckets[id].tokens.length); 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; + if (buckets[bucket].tokens.length > requestsPerSecond) { + continue; + } buckets[bucket].tokens.push(1); } } From 80101f349b81e7844b72d772dac9e66007a14732 Mon Sep 17 00:00:00 2001 From: plane000 Date: Tue, 30 Oct 2018 18:23:38 +0000 Subject: [PATCH 2/2] Error handling and Guild and Message Manager classes to come with a command manager and module hot reloader --- src/events.js | 23 +++++++++++++++++++---- src/guildmanager.js | 9 +++++++++ src/messagemanager.js | 5 +++++ src/ratelimits.js | 5 ++--- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 src/guildmanager.js create mode 100644 src/messagemanager.js diff --git a/src/events.js b/src/events.js index c00da4c..704a695 100644 --- a/src/events.js +++ b/src/events.js @@ -4,7 +4,7 @@ import {RateLimits} from './ratelimits' export class Events extends RateLimits { // extends rate limits constructor() { - super() + super(); } 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.handle(message, [super.request, this.handleMessage], @@ -30,6 +37,9 @@ export class Events extends RateLimits { // extends rate limits }); } + + + async handle(obj = [null], callbacks = [undefined], client) { let doNext = false; if (callbacks.length == 0) { @@ -56,9 +66,14 @@ export class Events extends RateLimits { // extends rate limits next(); } - async handleMessage(obj, client, next) { - if (client.user.id == obj.author.id) return; - if (obj.limiting) obj.channel.send(`${obj.author} You are being rate limited`); + async handleError(err, client, next) { + Logger.error(`An error occured with the Discord API: ${err}`); + 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(); } } diff --git a/src/guildmanager.js b/src/guildmanager.js new file mode 100644 index 0000000..26f7846 --- /dev/null +++ b/src/guildmanager.js @@ -0,0 +1,9 @@ +import {Logger} from './logger'; + +export class GuildManager { + constructor() { + + } + + +} diff --git a/src/messagemanager.js b/src/messagemanager.js new file mode 100644 index 0000000..a5ae72f --- /dev/null +++ b/src/messagemanager.js @@ -0,0 +1,5 @@ +import {Logger} from './logger'; + +export class MessageManager { + +} diff --git a/src/ratelimits.js b/src/ratelimits.js index 5eec4d1..024706e 100644 --- a/src/ratelimits.js +++ b/src/ratelimits.js @@ -11,10 +11,10 @@ export class RateLimits { async request(obj, client, next) { let id = obj.author.id; - if (id == client.user.id) { return; } + if (id == client.user.id) return; 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()}; for (let i = 0; i < requestsPerSecond; i++) { @@ -27,7 +27,6 @@ export class RateLimits { buckets[id].lastUsed = new Date().getTime(); - Logger.debug(buckets[id].tokens.length); if (buckets[id].tokens.length <= 0) { Logger.middleware(`${id} is being rate limited`); obj.limiting = true;