From bd2004b452044dc4ba0d935e5b7a175b667b2394 Mon Sep 17 00:00:00 2001 From: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Date: Tue, 29 Mar 2022 14:11:59 -0500 Subject: [PATCH] fix(messageEvent) made messageEvent more linear and make more complex observables --- src/handler/events/interactionCreate.ts | 13 ++----- src/handler/events/messageEvent.ts | 39 +++++++------------ ...ctionHandling.ts => observableHandling.ts} | 34 +++++++++++++--- 3 files changed, 47 insertions(+), 39 deletions(-) rename src/handler/events/{interactionHandling.ts => observableHandling.ts} (53%) diff --git a/src/handler/events/interactionCreate.ts b/src/handler/events/interactionCreate.ts index d9f4b2d..5d6e218 100644 --- a/src/handler/events/interactionCreate.ts +++ b/src/handler/events/interactionCreate.ts @@ -1,14 +1,11 @@ import type { Interaction } from 'discord.js'; -import { filter, fromEvent, Observable, of, tap, concatMap} from 'rxjs'; -import { None, Some } from 'ts-results'; -import type { SlashCommand } from '../..'; +import { fromEvent, Observable, of, concatMap} from 'rxjs'; import { CommandType } from '../sern'; -import type { ContextMenuMsg, ContextMenuUser } from '../structures/commands/module'; import Context from '../structures/context'; import type Wrapper from '../structures/wrapper'; import * as Files from '../utilities/readFile'; -import { filterTap, is } from './interactionHandling'; +import { filterTap } from './observableHandling'; export const onInteractionCreate = ( wrapper : Wrapper ) => { @@ -45,7 +42,7 @@ export const onInteractionCreate = ( wrapper : Wrapper ) => { }), ) } - else { return of(); } + else { return of() } }) ).subscribe({ error(e) { @@ -55,8 +52,6 @@ export const onInteractionCreate = ( wrapper : Wrapper ) => { //log on each command emitted console.log(command); }, - - - }); + }); }; diff --git a/src/handler/events/messageEvent.ts b/src/handler/events/messageEvent.ts index 313b090..731b3f0 100644 --- a/src/handler/events/messageEvent.ts +++ b/src/handler/events/messageEvent.ts @@ -1,41 +1,32 @@ import type { Message } from 'discord.js'; -import { map, filter, fromEvent, Observable, of, concatMap, tap } from 'rxjs'; -import { None, Some } from 'ts-results'; +import { fromEvent, Observable, of, concatMap, filter} from 'rxjs'; import { CommandType } from '../sern'; -import type { TextCommand } from '../structures/commands/module'; import Context from '../structures/context'; import type Wrapper from '../structures/wrapper'; import { isNotFromDM, isNotFromBot, hasPrefix, fmt } from '../utilities/messageHelpers'; import * as Files from '../utilities/readFile'; -import { is } from './interactionHandling'; +import { filterTap, ignoreNonBot } from './observableHandling'; export const onMessageCreate = (wrapper : Wrapper) => { const { client, defaultPrefix } = wrapper; (fromEvent( client, 'messageCreate') as Observable) .pipe ( - filter( isNotFromBot ), - filter( isNotFromDM ), - filter( m => hasPrefix(m, defaultPrefix)), - concatMap ( m => of( fmt(m, defaultPrefix) ) - .pipe ( - map(([prefix, ...args ]) => - [ - Files.Commands.get(prefix) ?? Files.Alias.get(prefix), - new Context(Some(m), None), - args - ] as const - ), - filter( ([mod]) => is( mod, CommandType.TEXT) ), - tap ( ([ mod, ctx, args ]) => { - (mod as TextCommand)!.execute(ctx, ['text', args]); - }), - ) - ) - + ignoreNonBot(defaultPrefix), + concatMap ( m => { + const [ prefix, ...data ] = fmt(m, defaultPrefix); + const posMod = Files.Commands.get(prefix) ?? Files.Alias.get(prefix); + const ctx = Context.wrap(m); + + return of( posMod ) + .pipe ( + filterTap(CommandType.TEXT, mod => { + mod.execute(ctx, ['text', data]); + }) + ) + }) ).subscribe ({ error(e) { //log things - console.log('Failed to finished message subscription!'); throw e; }, next(command) { diff --git a/src/handler/events/interactionHandling.ts b/src/handler/events/observableHandling.ts similarity index 53% rename from src/handler/events/interactionHandling.ts rename to src/handler/events/observableHandling.ts index 9b4b711..2253318 100644 --- a/src/handler/events/interactionHandling.ts +++ b/src/handler/events/observableHandling.ts @@ -1,9 +1,10 @@ -import type { Awaitable } from "discord.js"; +import type { Awaitable, Message } from "discord.js"; import type { CommandType } from "../sern"; import type { Module } from "../structures/structxports"; -import { ignoreElements, Observable, throwError } from 'rxjs'; +import { Observable, throwError } from 'rxjs'; import type { ModuleDefs } from "../structures/commands/moduleHandler"; import { SernError } from "../structures/errors"; +import { isNotFromBot, isNotFromDM } from "../utilities/messageHelpers"; export function match(mod: Module | undefined, type : CommandType) : boolean { return mod !== undefined && (mod.type & type) != 0; @@ -13,9 +14,8 @@ export function filterTap( tap: (mod : ModuleDefs[T]) => Awaitable ) { return (src : Observable) => - new Observable( subscriber => { - return src.subscribe({ - next(modul) { + new Observable( subscriber => { + return src.subscribe({ next(modul) { if(match(modul, cmdType)) { tap(modul as ModuleDefs[T]); } else { @@ -30,5 +30,27 @@ export function filterTap( }) }) - } + } +export function ignoreNonBot(prefix : string) { + return (src : Observable) => + new Observable(subscriber => { + return src.subscribe({ + next(m) { + const passAll = [ + isNotFromDM, + isNotFromBot, + (m : Message) => m.content.startsWith(prefix) + ].every( fn => fn(m)); + + if (passAll) { + subscriber.next(m); + } + }, + error: (e) => subscriber.error(e), + complete: () => subscriber.complete() + + }) + }) +} +