Initial work on custom guild-specific events

This commit is contained in:
Dragory 2021-09-12 22:41:54 +03:00
parent aea3f4d657
commit 5fe403ba8c
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1

View file

@ -1,42 +1,54 @@
import { QueuedEventEmitter } from "../QueuedEventEmitter"; import { Mute } from "./entities/Mute";
import { BaseGuildRepository } from "./BaseGuildRepository"; import { ScheduledPost } from "./entities/ScheduledPost";
import { Reminder } from "./entities/Reminder";
export class GuildEvents extends BaseGuildRepository { interface GuildEventArgs extends Record<string, unknown[]> {
private queuedEventEmitter: QueuedEventEmitter; expiredMutes: [Mute[]];
private pluginListeners: Map<string, Map<string, any[]>>; scheduledPosts: [ScheduledPost[]];
reminders: [Reminder[]];
}
constructor(guildId) { type GuildEvent = keyof GuildEventArgs;
super(guildId);
this.queuedEventEmitter = new QueuedEventEmitter(); type GuildEventListener<K extends GuildEvent> = (...args: GuildEventArgs[K]) => void;
type ListenerMap = {
[K in GuildEvent]?: Array<GuildEventListener<K>>;
};
const guildListeners: Map<string, ListenerMap> = new Map();
/**
* @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, {});
} }
const listenerMap = guildListeners.get(guildId)!;
public on(pluginName: string, eventName: string, fn) { if (listenerMap[eventName] == null) {
this.queuedEventEmitter.on(eventName, fn); listenerMap[eventName] = [];
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);
} }
listenerMap[eventName]!.push(listener);
public offPlugin(pluginName: string) { return () => {
const pluginListeners = this.pluginListeners.get(pluginName) || new Map(); listenerMap[eventName]!.splice(listenerMap[eventName]!.indexOf(listener), 1);
for (const [eventName, listeners] of Array.from(pluginListeners.entries())) { };
for (const listener of listeners) { }
this.queuedEventEmitter.off(eventName, listener);
} export function emitGuildEvent<K extends GuildEvent>(guildId: string, eventName: K, args: GuildEventArgs[K]): void {
} if (!guildListeners.has(guildId)) {
this.pluginListeners.delete(pluginName); return;
} }
const listenerMap = guildListeners.get(guildId)!;
public emit(eventName: string, args: any[] = []) { if (listenerMap[eventName] == null) {
return this.queuedEventEmitter.emit(eventName, args); return;
}
for (const listener of listenerMap[eventName]!) {
listener(...args);
} }
} }