Merge pull request #8 from plane000/dev
Merge stable branch dev to master
This commit is contained in:
@@ -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
9
src/guildmanager.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import {Logger} from './logger';
|
||||||
|
|
||||||
|
export class GuildManager {
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
5
src/messagemanager.js
Normal file
5
src/messagemanager.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import {Logger} from './logger';
|
||||||
|
|
||||||
|
export class MessageManager {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user