import { PluginData } from "knub"; import { AutomodContext, AutomodPluginType, TRule } from "../types"; import { availableTriggers } from "../triggers/availableTriggers"; import { availableActions } from "../actions/availableActions"; import { AutomodTriggerMatchResult } from "../helpers"; import { CleanAction } from "../actions/clean"; export async function runAutomod(pluginData: PluginData, context: AutomodContext) { const userId = context.user?.id || context.message?.user_id; const member = userId && pluginData.guild.members.get(userId); const channelId = context.message?.channel_id; const channel = channelId && pluginData.guild.channels.get(channelId); const categoryId = channel?.parentID; const config = pluginData.config.getMatchingConfig({ channelId, categoryId, userId, member, }); for (const [ruleName, rule] of Object.entries(config.rules)) { if (rule.enabled === false) continue; let matchResult: AutomodTriggerMatchResult; let matchSummary: string; let contexts: AutomodContext[]; triggerLoop: for (const triggerItem of rule.triggers) { for (const [triggerName, triggerConfig] of Object.entries(triggerItem)) { const trigger = availableTriggers[triggerName]; matchResult = await trigger.match({ ruleName, pluginData, context, triggerConfig, }); if (matchResult) { contexts = [context, ...(matchResult.extraContexts || [])]; for (const _context of contexts) { _context.actioned = true; } if (matchResult.silentClean) { await CleanAction.apply({ ruleName, pluginData, contexts, actionConfig: true, }); return; } matchSummary = await trigger.renderMatchInformation({ ruleName, pluginData, contexts, matchResult, triggerConfig, }); break triggerLoop; } } } if (matchResult) { for (const [actionName, actionConfig] of Object.entries(rule.actions)) { const action = availableActions[actionName]; action.apply({ ruleName, pluginData, contexts, actionConfig, }); } break; } } }