import { Mute } from "./entities/Mute.js"; import { Reminder } from "./entities/Reminder.js"; import { ScheduledPost } from "./entities/ScheduledPost.js"; import { Tempban } from "./entities/Tempban.js"; import { VCAlert } from "./entities/VCAlert.js"; interface GuildEventArgs extends Record { expiredMute: [Mute]; timeoutMuteToRenew: [Mute]; scheduledPost: [ScheduledPost]; reminder: [Reminder]; expiredTempban: [Tempban]; expiredVCAlert: [VCAlert]; } 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, {}); } const listenerMap = guildListeners.get(guildId)!; if (listenerMap[eventName] == null) { listenerMap[eventName] = []; } listenerMap[eventName]!.push(listener); 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; } const listenerMap = guildListeners.get(guildId)!; if (listenerMap[eventName] == null) { return; } for (const listener of listenerMap[eventName]!) { listener(...args); } } export function hasGuildEventListener(guildId: string, eventName: K): boolean { if (!guildListeners.has(guildId)) { return false; } const listenerMap = guildListeners.get(guildId)!; if (listenerMap[eventName] == null || listenerMap[eventName]!.length === 0) { return false; } return true; }