2021-09-12 22:41:54 +03:00
|
|
|
import { Mute } from "./entities/Mute";
|
|
|
|
import { ScheduledPost } from "./entities/ScheduledPost";
|
|
|
|
import { Reminder } from "./entities/Reminder";
|
|
|
|
|
|
|
|
interface GuildEventArgs extends Record<string, unknown[]> {
|
|
|
|
expiredMutes: [Mute[]];
|
|
|
|
scheduledPosts: [ScheduledPost[]];
|
|
|
|
reminders: [Reminder[]];
|
|
|
|
}
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
type GuildEvent = keyof GuildEventArgs;
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
type GuildEventListener<K extends GuildEvent> = (...args: GuildEventArgs[K]) => void;
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
type ListenerMap = {
|
|
|
|
[K in GuildEvent]?: Array<GuildEventListener<K>>;
|
|
|
|
};
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
const guildListeners: Map<string, ListenerMap> = new Map();
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
/**
|
|
|
|
* @return - Function to unregister the listener
|
|
|
|
*/
|
|
|
|
export function onGuildEvent<K extends GuildEvent>(
|
|
|
|
guildId: string,
|
|
|
|
eventName: K,
|
|
|
|
listener: GuildEventListener<K>,
|
|
|
|
): () => void {
|
|
|
|
if (!guildListeners.has(guildId)) {
|
|
|
|
guildListeners.set(guildId, {});
|
2018-11-25 17:04:26 +02:00
|
|
|
}
|
2021-09-12 22:41:54 +03:00
|
|
|
const listenerMap = guildListeners.get(guildId)!;
|
|
|
|
if (listenerMap[eventName] == null) {
|
|
|
|
listenerMap[eventName] = [];
|
2018-11-25 17:04:26 +02:00
|
|
|
}
|
2021-09-12 22:41:54 +03:00
|
|
|
listenerMap[eventName]!.push(listener);
|
2018-11-25 17:04:26 +02:00
|
|
|
|
2021-09-12 22:41:54 +03:00
|
|
|
return () => {
|
|
|
|
listenerMap[eventName]!.splice(listenerMap[eventName]!.indexOf(listener), 1);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function emitGuildEvent<K extends GuildEvent>(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);
|
2018-11-25 17:04:26 +02:00
|
|
|
}
|
|
|
|
}
|