Initial work on custom guild-specific events
This commit is contained in:
parent
aea3f4d657
commit
5fe403ba8c
1 changed files with 46 additions and 34 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue