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:
parent
01d73565b6
commit
effaff5dc8
3 changed files with 77 additions and 3 deletions
36
src/Queue.ts
Normal file
36
src/Queue.ts
Normal 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
38
src/QueuedEventEmitter.ts
Normal 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));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
import { Brackets, getRepository, Repository } from "typeorm";
|
import { Brackets, getRepository, Repository } from "typeorm";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository";
|
||||||
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
|
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
|
||||||
import EventEmitter from "events";
|
import { QueuedEventEmitter } from "../QueuedEventEmitter";
|
||||||
import { GuildChannel, Message } from "eris";
|
import { GuildChannel, Message } from "eris";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
|
|
||||||
|
@ -11,12 +11,12 @@ const RETENTION_PERIOD = 7 * 24 * 60 * 60 * 1000; // 1 week
|
||||||
|
|
||||||
export class GuildSavedMessages extends BaseRepository {
|
export class GuildSavedMessages extends BaseRepository {
|
||||||
private messages: Repository<SavedMessage>;
|
private messages: Repository<SavedMessage>;
|
||||||
public events: EventEmitter;
|
public events: QueuedEventEmitter;
|
||||||
|
|
||||||
constructor(guildId) {
|
constructor(guildId) {
|
||||||
super(guildId);
|
super(guildId);
|
||||||
this.messages = getRepository(SavedMessage);
|
this.messages = getRepository(SavedMessage);
|
||||||
this.events = new EventEmitter();
|
this.events = new QueuedEventEmitter();
|
||||||
|
|
||||||
this.cleanup();
|
this.cleanup();
|
||||||
setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
|
setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
|
||||||
|
|
Loading…
Add table
Reference in a new issue