// // Plugins can be inserted on all commands and are emitted // // 1.) on ready event, where all commands are loaded. // 2.) on corresponding observable (command triggers) // // The goal of plugins is to organize commands and // provide extensions to repetitive patterns // examples include refreshing modules, // categorizing commands, cooldowns, permissions, etc. // Plugins are reminiscent of middleware in express. // import type { Awaitable, Client } from 'discord.js'; import type { Err, Ok, Result } from 'ts-results'; import type { Module, Override } from '../..'; import type { BaseModule, ModuleDefs } from '../structures/module'; import type { PluginType } from '../structures/enums'; import type { ValueOf } from 'ts-pattern/dist/types/helpers'; export interface Controller { next: () => Ok; stop: () => Err; } type BasePlugin = Override; export type CommandPlugin = Override Awaitable>; }>; //TODO: rn adding the modType check a little hackish. Find better way to determine the // module type of the event plugin export type EventPlugin = Override, controller: Controller) => Awaitable>; }>; export function plugins(...plug: CommandPlugin[]): CommandPlugin[]; export function plugins(...plug: EventPlugin[]): EventPlugin[]; export function plugins(...plug: EventPlugin[] | CommandPlugin[]) { return plug; } type ModuleNoPlugins = ValueOf<{ [T in keyof ModuleDefs]: Omit }> //TODO: I WANT BETTER TYPINGS AHHHHHHHHHHHHHHH export function sernModule( plugins: (CommandPlugin)[], mod: ModuleNoPlugins, ): Module { return { plugins, ...mod, }; }