mirror of
https://github.com/sern-handler/handler
synced 2026-06-26 09:42:15 +00:00
45 lines
1.9 KiB
TypeScript
45 lines
1.9 KiB
TypeScript
import { EMPTY, mergeMap, concatMap } from 'rxjs';
|
|
import type { Message } from 'discord.js';
|
|
import { createMessageHandler, executeModule, makeModuleExecutor } from './event-utils';
|
|
import { PayloadType, SernError } from '../core/structures/enums'
|
|
import { resultPayload } from '../core/functions'
|
|
import { filterTap, sharedEventStream } from '../core/operators'
|
|
import { UnpackedDependencies } from '../types/utility';
|
|
import { Emitter } from '..';
|
|
|
|
/**
|
|
* 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 default function message(
|
|
{"@sern/emitter": emitter, '@sern/errors':err,
|
|
'@sern/logger': log, '@sern/client': client,
|
|
'@sern/modules': commands}: UnpackedDependencies,
|
|
defaultPrefix: string | undefined) {
|
|
if (!defaultPrefix) {
|
|
log?.debug({ message: 'No prefix found. message handler shutting down' });
|
|
return EMPTY;
|
|
}
|
|
const messageStream$ = sharedEventStream<Message>(client as unknown as Emitter, 'messageCreate');
|
|
const handle = createMessageHandler(messageStream$, defaultPrefix, commands);
|
|
|
|
const msgCommands$ = handle(isNonBot(defaultPrefix));
|
|
|
|
return msgCommands$.pipe(
|
|
filterTap((e) => emitter.emit('warning', resultPayload(PayloadType.Warning, undefined, e))),
|
|
concatMap(makeModuleExecutor(module => {
|
|
const result = resultPayload(PayloadType.Failure, module, SernError.PluginFailure);
|
|
emitter.emit('module.activate', result);
|
|
})),
|
|
mergeMap(payload => executeModule(emitter, log, err, payload)));
|
|
}
|