mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
* some wip code Co-authored-by: Jacob Nguyen <jacoobes@users.noreply.github.com> * general idea * style * making shrimple truly optional * got optional localizer working * proposing api notation? * prepare for localization map * add localsFor * merge some internals * boss call * add test for init functionality * add documentation * inline and cleanup * feat: logging for experimental json loading * loosen typings * dev workflow and cleaning up comments * cleaning up a bit more * rename Localizer -> Localization * more documentation, change dir for default localizer * some tests * " * move stuff, refactor, deprecate * yarnb * Update index.ts --------- Co-authored-by: Jacob Nguyen <jacoobes@users.noreply.github.com> Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Co-authored-by: jacob <jacoobes@sern.dev>
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { mergeMap, EMPTY } from 'rxjs';
|
|
import type { Message } from 'discord.js';
|
|
import { PayloadType } from '../core';
|
|
import { sharedEventStream, SernError, filterTap, resultPayload } from '../core/_internal';
|
|
import { createMessageHandler, executeModule, makeModuleExecutor } from './_internal';
|
|
import type { DependencyList } from '../types/ioc';
|
|
|
|
/**
|
|
* Ignores messages from any person / bot except itself
|
|
* @param prefix
|
|
*/
|
|
function isNonBot(prefix: string) {
|
|
return (msg: Message): msg is Message => !msg.author.bot && hasPrefix(prefix, msg.content);
|
|
}
|
|
|
|
function hasPrefix(prefix: string, content: string) {
|
|
const prefixInContent = content.slice(0, prefix.length);
|
|
return (
|
|
prefixInContent.localeCompare(prefix, undefined, {
|
|
sensitivity: 'accent',
|
|
}) === 0
|
|
);
|
|
}
|
|
|
|
export function messageHandler(
|
|
[emitter, err, log, modules, client]: DependencyList,
|
|
defaultPrefix: string | undefined,
|
|
) {
|
|
if (!defaultPrefix) {
|
|
log?.debug({
|
|
message: 'No prefix found. message handler shutting down',
|
|
});
|
|
return EMPTY;
|
|
}
|
|
const messageStream$ = sharedEventStream<Message>(client, 'messageCreate');
|
|
const handle = createMessageHandler(messageStream$, defaultPrefix, modules);
|
|
|
|
const msgCommands$ = handle(isNonBot(defaultPrefix));
|
|
|
|
return msgCommands$.pipe(
|
|
filterTap((e) => emitter.emit('warning', resultPayload(PayloadType.Warning, undefined, e))),
|
|
makeModuleExecutor(module => {
|
|
const result = resultPayload(PayloadType.Failure, module, SernError.PluginFailure);
|
|
emitter.emit('module.activate', result);
|
|
}),
|
|
mergeMap(payload => executeModule(emitter, log, err, payload)));
|
|
}
|