From b8cda351e1f549422692c633255ac1d6c7d78a9b Mon Sep 17 00:00:00 2001 From: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Date: Thu, 19 May 2022 12:57:14 -0500 Subject: [PATCH] feat: should be able to register other nodejs event emitters --- src/handler/sern.ts | 19 ++++++++++++------- src/handler/structures/wrapper.ts | 4 ++-- src/handler/utilities/predicates.ts | 8 +++++++- src/types/handler.ts | 5 ++++- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/handler/sern.ts b/src/handler/sern.ts index 67e02fd..cf581ea 100644 --- a/src/handler/sern.ts +++ b/src/handler/sern.ts @@ -1,4 +1,4 @@ -import type { DiscordEvent } from '../types/handler'; +import type { DiscordEvent, EventEmitterRegister } from '../types/handler'; import { ApplicationCommandType, Client } from 'discord.js'; @@ -11,20 +11,25 @@ import { onInteractionCreate } from './events/interactionCreate'; import { match, P } from 'ts-pattern'; import { Err, Ok } from 'ts-results'; import { CommandType } from './structures/enums'; +import { isDiscordEvent } from './utilities/predicates'; export function init(wrapper: Wrapper) { const { events, client } = wrapper; - if (events !== undefined) eventObserver(client, events); + if (events !== undefined) { + eventObserver(client, events); + } onReady(wrapper); onMessageCreate(wrapper); onInteractionCreate(wrapper); } -//TODO : Add event listener for any other generic node js event emitter -function eventObserver(client: Client, events: DiscordEvent[]) { - events.forEach(([event, cb]) => { - if (event === 'ready') throw Error(SernError.ReservedEvent); - fromEvent(client, event, cb).subscribe(); +function eventObserver(client: Client, events: (DiscordEvent | EventEmitterRegister)[]) { + events.forEach((event) => { + if(isDiscordEvent(event)) { + fromEvent(client, event[0], event[1]).subscribe(); + } else { + fromEvent(event[0], event[1], event[2]).subscribe(); + } }); } diff --git a/src/handler/structures/wrapper.ts b/src/handler/structures/wrapper.ts index 4bfc76c..bdbf2ed 100644 --- a/src/handler/structures/wrapper.ts +++ b/src/handler/structures/wrapper.ts @@ -1,5 +1,5 @@ import type { Client } from 'discord.js'; -import type { DiscordEvent } from '../../types/handler'; +import type { DiscordEvent, EventEmitterRegister } from '../../types/handler'; /** * An object to be passed into Sern.Handler constructor. @@ -14,7 +14,7 @@ interface Wrapper { readonly client: Client; readonly defaultPrefix?: string; readonly commands: string; - readonly events?: DiscordEvent[]; + readonly events?: (DiscordEvent | EventEmitterRegister)[]; } export default Wrapper; diff --git a/src/handler/utilities/predicates.ts b/src/handler/utilities/predicates.ts index 704aa57..4ba76e5 100644 --- a/src/handler/utilities/predicates.ts +++ b/src/handler/utilities/predicates.ts @@ -9,6 +9,7 @@ import type { SelectMenuInteraction, UserContextMenuCommandInteraction, } from 'discord.js'; +import type { DiscordEvent, EventEmitterRegister } from '../..'; @@ -40,4 +41,9 @@ export function isUserContextMenuCmd(i : CommandInteraction) : i is UserContextM export function isPromise(promiseLike : Awaitable) : promiseLike is Promise { const keys = new Set(Object.keys(promiseLike)); return keys.has('then') && keys.has('catch'); -} \ No newline at end of file +} + +export function isDiscordEvent(el : DiscordEvent | EventEmitterRegister) : el is DiscordEvent { + return el.length === 2; +} + diff --git a/src/types/handler.ts b/src/types/handler.ts index 58d5079..87cc4b5 100644 --- a/src/types/handler.ts +++ b/src/types/handler.ts @@ -5,7 +5,7 @@ import type { MessageOptions, MessagePayload, } from 'discord.js'; - +import type { EventEmitter } from 'events'; // Anything that can be sent in a `#send` or `#reply` export type possibleOutput = T | (MessagePayload & MessageOptions); export type Nullish = T | undefined | null; @@ -17,6 +17,9 @@ export type ParseType = { export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; export type DiscordEvent = ParseType<{ [K in keyof ClientEvents]: (...args: ClientEvents[K]) => Awaitable }>; +export type EventEmitterRegister = [ emitter: EventEmitter, k : string, cb : (...args: unknown[]) => Awaitable]; + + export type SlashOptions = Omit;