mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
feat: add sern events natively register in sern.init
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user