import * as t from "io-ts"; import { GuildPluginData } from "knub"; import { Awaitable } from "knub/dist/utils"; import { AutomodContext, AutomodPluginType } from "./types"; interface BaseAutomodTriggerMatchResult { extraContexts?: AutomodContext[]; silentClean?: boolean; // TODO: Maybe generalize to a "silent" value in general, which mutes alert/log summary?: string; fullSummary?: string; } export type AutomodTriggerMatchResult = unknown extends TExtra ? BaseAutomodTriggerMatchResult : BaseAutomodTriggerMatchResult & { extra: TExtra }; type AutomodTriggerMatchFn = (meta: { ruleName: string; pluginData: GuildPluginData; context: AutomodContext; triggerConfig: TConfigType; }) => Awaitable>; type AutomodTriggerRenderMatchInformationFn = (meta: { ruleName: string; pluginData: GuildPluginData; contexts: AutomodContext[]; triggerConfig: TConfigType; matchResult: AutomodTriggerMatchResult; }) => Awaitable; export interface AutomodTriggerBlueprint { configType: TConfigType; defaultConfig: Partial>; match: AutomodTriggerMatchFn, TMatchResultExtra>; renderMatchInformation: AutomodTriggerRenderMatchInformationFn, TMatchResultExtra>; } export function automodTrigger(): ( blueprint: AutomodTriggerBlueprint, ) => AutomodTriggerBlueprint; export function automodTrigger( blueprint: AutomodTriggerBlueprint, ): AutomodTriggerBlueprint; export function automodTrigger(...args) { if (args.length) { return args[0]; } else { return automodTrigger; } } type AutomodActionApplyFn = (meta: { ruleName: string; pluginData: GuildPluginData; contexts: AutomodContext[]; actionConfig: TConfigType; matchResult: AutomodTriggerMatchResult; }) => Awaitable; export interface AutomodActionBlueprint { configType: TConfigType; defaultConfig: Partial>; apply: AutomodActionApplyFn>; } export function automodAction( blueprint: AutomodActionBlueprint, ): AutomodActionBlueprint { return blueprint; }