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 505e10b..024706e 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`); + Logger.debug(`New rate limiting bucket for ${id}`); 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,23 @@ export class RateLimits { } 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; + if (buckets[bucket].tokens.length > requestsPerSecond) { + continue; + } buckets[bucket].tokens.push(1); } }