diff --git a/backend/src/data/GuildEvents.ts b/backend/src/data/GuildEvents.ts index ead809ab..72c6177c 100644 --- a/backend/src/data/GuildEvents.ts +++ b/backend/src/data/GuildEvents.ts @@ -1,42 +1,54 @@ -import { QueuedEventEmitter } from "../QueuedEventEmitter"; -import { BaseGuildRepository } from "./BaseGuildRepository"; +import { Mute } from "./entities/Mute"; +import { ScheduledPost } from "./entities/ScheduledPost"; +import { Reminder } from "./entities/Reminder"; -export class GuildEvents extends BaseGuildRepository { - private queuedEventEmitter: QueuedEventEmitter; - private pluginListeners: Map>; +interface GuildEventArgs extends Record { + expiredMutes: [Mute[]]; + scheduledPosts: [ScheduledPost[]]; + reminders: [Reminder[]]; +} - constructor(guildId) { - super(guildId); - this.queuedEventEmitter = new QueuedEventEmitter(); +type GuildEvent = keyof GuildEventArgs; + +type GuildEventListener = (...args: GuildEventArgs[K]) => void; + +type ListenerMap = { + [K in GuildEvent]?: Array>; +}; + +const guildListeners: Map = new Map(); + +/** + * @return - Function to unregister the listener + */ +export function onGuildEvent( + guildId: string, + eventName: K, + listener: GuildEventListener, +): () => void { + if (!guildListeners.has(guildId)) { + guildListeners.set(guildId, {}); } - - public on(pluginName: string, eventName: string, fn) { - this.queuedEventEmitter.on(eventName, fn); - - if (!this.pluginListeners.has(pluginName)) { - this.pluginListeners.set(pluginName, new Map()); - } - - const pluginListeners = this.pluginListeners.get(pluginName)!; - if (!pluginListeners.has(eventName)) { - pluginListeners.set(eventName, []); - } - - const pluginEventListeners = pluginListeners.get(eventName)!; - pluginEventListeners.push(fn); + const listenerMap = guildListeners.get(guildId)!; + if (listenerMap[eventName] == null) { + listenerMap[eventName] = []; } + listenerMap[eventName]!.push(listener); - public offPlugin(pluginName: string) { - const pluginListeners = this.pluginListeners.get(pluginName) || new Map(); - for (const [eventName, listeners] of Array.from(pluginListeners.entries())) { - for (const listener of listeners) { - this.queuedEventEmitter.off(eventName, listener); - } - } - this.pluginListeners.delete(pluginName); + return () => { + listenerMap[eventName]!.splice(listenerMap[eventName]!.indexOf(listener), 1); + }; +} + +export function emitGuildEvent(guildId: string, eventName: K, args: GuildEventArgs[K]): void { + if (!guildListeners.has(guildId)) { + return; } - - public emit(eventName: string, args: any[] = []) { - return this.queuedEventEmitter.emit(eventName, args); + const listenerMap = guildListeners.get(guildId)!; + if (listenerMap[eventName] == null) { + return; + } + for (const listener of listenerMap[eventName]!) { + listener(...args); } }