feat: add sern events natively register in sern.init

This commit is contained in:
Jacob Nguyen
2022-06-06 00:51:09 -05:00
parent df2a92cac2
commit 5fbd3a6d68
4 changed files with 25 additions and 9 deletions

View File

@@ -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();
}

View File

@@ -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];

View File

@@ -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<T extends keyof ModuleDefs>(
plug: Module | undefined,
@@ -49,6 +49,11 @@ export function isPromise<T>(promiseLike: Awaitable<T>): 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);
}

View File

@@ -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> = 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<void>;
}>;
export type SernEvent = ParseType<{
[K in keyof SernEventsMapping]: (...args: SernEventsMapping[K]) => Awaitable<void>;
}>;
export type EventEmitterRegister = [
emitter: EventEmitter,
k: string,