3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-15 05:41:51 +00:00

Add QueuedEventEmitter, use it for GuildSavedMessages events

This commit is contained in:
Dragory 2018-11-24 14:58:54 +02:00
parent 01d73565b6
commit effaff5dc8
3 changed files with 77 additions and 3 deletions

36
src/Queue.ts Normal file
View file

@ -0,0 +1,36 @@
type QueueFn = (...args: any[]) => Promise<any>;
export class Queue {
protected running: boolean = false;
protected queue: QueueFn[] = [];
protected timeout: number = 10 * 1000;
public add(fn) {
const promise = new Promise(resolve => {
this.queue.push(async () => {
await fn();
resolve();
});
if (!this.running) this.next();
});
return promise;
}
public next() {
this.running = true;
if (this.queue.length === 0) {
this.running = false;
return;
}
const fn = this.queue.shift();
new Promise(resolve => {
// Either fn() completes or the timeout is reached
fn().then(resolve);
setTimeout(resolve, this.timeout);
}).then(() => this.next());
}
}

38
src/QueuedEventEmitter.ts Normal file
View file

@ -0,0 +1,38 @@
import { Queue } from "./Queue";
type Listener = (...args: any[]) => void;
export class QueuedEventEmitter {
protected listeners: Map<string, Listener[]>;
protected queue: Queue;
constructor() {
this.listeners = new Map();
this.queue = new Queue();
}
on(eventName: string, listener: Listener) {
if (!this.listeners.has(eventName)) {
this.listeners.set(eventName, []);
}
this.listeners.get(eventName).push(listener);
}
off(eventName: string, listener: Listener) {
if (!this.listeners.has(eventName)) {
return;
}
const listeners = this.listeners.get(eventName);
listeners.splice(listeners.indexOf(listener), 1);
}
emit(eventName: string, args: any[] = []) {
const listeners = [...(this.listeners.get(eventName) || []), ...(this.listeners.get("*") || [])];
listeners.forEach(listener => {
this.queue.add(listener.bind(null, args));
});
}
}

View file

@ -1,7 +1,7 @@
import { Brackets, getRepository, Repository } from "typeorm";
import { BaseRepository } from "./BaseRepository";
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
import EventEmitter from "events";
import { QueuedEventEmitter } from "../QueuedEventEmitter";
import { GuildChannel, Message } from "eris";
import moment from "moment-timezone";
@ -11,12 +11,12 @@ const RETENTION_PERIOD = 7 * 24 * 60 * 60 * 1000; // 1 week
export class GuildSavedMessages extends BaseRepository {
private messages: Repository<SavedMessage>;
public events: EventEmitter;
public events: QueuedEventEmitter;
constructor(guildId) {
super(guildId);
this.messages = getRepository(SavedMessage);
this.events = new EventEmitter();
this.events = new QueuedEventEmitter();
this.cleanup();
setInterval(() => this.cleanup(), CLEANUP_INTERVAL);