mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
* refactor: rm deprecations, clean up, rm indirection * fix: singleton init not being fired when inserting function * refactor and generic internal add * deprecate a few things that i impusively added lol
63 lines
2.5 KiB
TypeScript
63 lines
2.5 KiB
TypeScript
import { handleCrash } from './handlers/_internal';
|
|
import callsites from 'callsites';
|
|
import { Files } from './core/_internal';
|
|
import { merge } from 'rxjs';
|
|
import { Services } from './core/ioc';
|
|
import { Wrapper } from './types/core';
|
|
import { eventsHandler } from './handlers/user-defined-events';
|
|
import { readyHandler } from './handlers/ready-event';
|
|
import { messageHandler } from './handlers/message-event';
|
|
import { interactionHandler } from './handlers/interaction-event';
|
|
import { presenceHandler } from './handlers/presence';
|
|
import { Client } from 'discord.js';
|
|
|
|
/**
|
|
* @since 1.0.0
|
|
* @param wrapper Options to pass into sern.
|
|
* Function to start the handler up
|
|
* @example
|
|
* ```ts title="src/index.ts"
|
|
* Sern.init({
|
|
* commands: 'dist/commands',
|
|
* events: 'dist/events',
|
|
* })
|
|
* ```
|
|
*/
|
|
export function init(maybeWrapper: Wrapper | 'file') {
|
|
const startTime = performance.now();
|
|
const dependencies = Services('@sern/emitter',
|
|
'@sern/errors',
|
|
'@sern/logger',
|
|
'@sern/modules',
|
|
'@sern/client');
|
|
const logger = dependencies[2],
|
|
errorHandler = dependencies[1];
|
|
|
|
const wrapper = Files.loadConfig(maybeWrapper, logger);
|
|
if (wrapper.events !== undefined) {
|
|
eventsHandler(dependencies, Files.getFullPathTree(wrapper.events));
|
|
}
|
|
|
|
const initCallsite = callsites()[1].getFileName();
|
|
const presencePath = Files.shouldHandle(initCallsite!, "presence");
|
|
//Ready event: load all modules and when finished, time should be taken and logged
|
|
readyHandler(dependencies, Files.getFullPathTree(wrapper.commands))
|
|
.add(() => {
|
|
logger?.info({ message: "Client signaled ready, registering modules" });
|
|
const time = ((performance.now() - startTime) / 1000).toFixed(2);
|
|
dependencies[0].emit('modulesLoaded');
|
|
logger?.info({ message: `sern: registered in ${time} s`, });
|
|
if(presencePath.exists) {
|
|
const setPresence = async (p: any) => {
|
|
return (dependencies[4] as Client).user?.setPresence(p);
|
|
}
|
|
presenceHandler(presencePath.path, setPresence).subscribe();
|
|
}
|
|
});
|
|
|
|
const messages$ = messageHandler(dependencies, wrapper.defaultPrefix);
|
|
const interactions$ = interactionHandler(dependencies);
|
|
// listening to the message stream and interaction stream
|
|
merge(messages$, interactions$).pipe(handleCrash(errorHandler, logger)).subscribe();
|
|
}
|