diff --git a/src/handler/sern.ts b/src/handler/sern.ts index dbe0af9..909330b 100644 --- a/src/handler/sern.ts +++ b/src/handler/sern.ts @@ -1,28 +1,34 @@ -import type { DiscordEvent, EventEmitterRegister } from '../types/handler'; +import type { DiscordEvent, EventEmitterRegister, SernEvent } from '../types/handler'; import type Wrapper from './structures/wrapper'; -import { fromEvent } from 'rxjs'; +import { from, fromEvent } from 'rxjs'; import { onReady } from './events/readyEvent'; import { onMessageCreate } from './events/messageEvent'; import { onInteractionCreate } from './events/interactionCreate'; import { Err, Ok } from 'ts-results'; -import { isDiscordEvent } from './utilities/predicates'; +import { isDiscordEvent, isSernEvent } from './utilities/predicates'; import type { Client } from 'discord.js'; +import wrapper from './structures/wrapper'; export function init(wrapper: Wrapper) { const { events, client } = wrapper; if (events !== undefined) { - eventObserver(client, events); + eventObserver(wrapper, events); } onReady(wrapper); onMessageCreate(wrapper); onInteractionCreate(wrapper); } -function eventObserver(client: Client, events: (DiscordEvent | EventEmitterRegister)[]) { +function eventObserver( + { client, sernEmitter }: Wrapper, + events: (DiscordEvent | EventEmitterRegister | SernEvent)[], +) { events.forEach(event => { if (isDiscordEvent(event)) { fromEvent(client, event[0], event[1]).subscribe(); + } else if (isSernEvent(event)) { + sernEmitter && fromEvent(sernEmitter, event[0], event[1]).subscribe(); } else { fromEvent(event[0], event[1], event[2]).subscribe(); } diff --git a/src/handler/sernEmitter.ts b/src/handler/sernEmitter.ts index a628241..c3e4fa3 100644 --- a/src/handler/sernEmitter.ts +++ b/src/handler/sernEmitter.ts @@ -5,7 +5,7 @@ type Payload = | { success: true; module: Module } | { success: false; module: Module | undefined; reason: string | Error }; -type SernEventsMapping = { +export type SernEventsMapping = { ['module.register']: [Payload]; ['module.activate']: [Payload]; ['error']: [Error | string]; diff --git a/src/handler/utilities/predicates.ts b/src/handler/utilities/predicates.ts index 20d12d3..c6b5347 100644 --- a/src/handler/utilities/predicates.ts +++ b/src/handler/utilities/predicates.ts @@ -9,7 +9,7 @@ import type { SelectMenuInteraction, UserContextMenuCommandInteraction, } from 'discord.js'; -import type { DiscordEvent, EventEmitterRegister } from '../..'; +import type { DiscordEvent, EventEmitterRegister, SernEvent } from '../..'; export function correctModuleType( plug: Module | undefined, @@ -49,6 +49,11 @@ export function isPromise(promiseLike: Awaitable): promiseLike is Promise< return keys.has('then') && keys.has('catch'); } -export function isDiscordEvent(el: DiscordEvent | EventEmitterRegister): el is DiscordEvent { - return el.length === 2; +export function isDiscordEvent( + el: DiscordEvent | EventEmitterRegister | SernEvent, +): el is DiscordEvent { + return el.length === 2 && !['module.register', 'module.activates'].includes(el[0]); +} +export function isSernEvent(el: DiscordEvent | EventEmitterRegister | SernEvent): el is SernEvent { + return !isDiscordEvent(el); } diff --git a/src/types/handler.ts b/src/types/handler.ts index 7791c38..2c40816 100644 --- a/src/types/handler.ts +++ b/src/types/handler.ts @@ -1,5 +1,6 @@ import type { Awaitable, ClientEvents, CommandInteractionOptionResolver } from 'discord.js'; import type { EventEmitter } from 'events'; +import type { SernEventsMapping } from '../handler/sernEmitter'; export type Nullish = T | undefined | null; // Thanks to @kelsny @@ -12,6 +13,10 @@ export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; export type DiscordEvent = ParseType<{ [K in keyof ClientEvents]: (...args: ClientEvents[K]) => Awaitable; }>; + +export type SernEvent = ParseType<{ + [K in keyof SernEventsMapping]: (...args: SernEventsMapping[K]) => Awaitable; +}>; export type EventEmitterRegister = [ emitter: EventEmitter, k: string,