import { normalizeAccountId } from "../routing/session-key.js"; import type { ClawdbotConfig } from "./config.js"; export type GroupPolicyChannel = "whatsapp" | "telegram" | "imessage"; export type ChannelGroupConfig = { requireMention?: boolean; }; export type ChannelGroupPolicy = { allowlistEnabled: boolean; allowed: boolean; groupConfig?: ChannelGroupConfig; defaultConfig?: ChannelGroupConfig; }; type ChannelGroups = Record; function resolveChannelGroups( cfg: ClawdbotConfig, channel: GroupPolicyChannel, accountId?: string | null, ): ChannelGroups | undefined { const normalizedAccountId = normalizeAccountId(accountId); const channelConfig = cfg.channels?.[channel] as | { accounts?: Record; groups?: ChannelGroups; } | undefined; if (!channelConfig) return undefined; const accountGroups = channelConfig.accounts?.[normalizedAccountId]?.groups ?? channelConfig.accounts?.[ Object.keys(channelConfig.accounts ?? {}).find( (key) => key.toLowerCase() === normalizedAccountId.toLowerCase(), ) ?? "" ]?.groups; return accountGroups ?? channelConfig.groups; } export function resolveChannelGroupPolicy(params: { cfg: ClawdbotConfig; channel: GroupPolicyChannel; groupId?: string | null; accountId?: string | null; }): ChannelGroupPolicy { const { cfg, channel } = params; const groups = resolveChannelGroups(cfg, channel, params.accountId); const allowlistEnabled = Boolean(groups && Object.keys(groups).length > 0); const normalizedId = params.groupId?.trim(); const groupConfig = normalizedId && groups ? groups[normalizedId] : undefined; const defaultConfig = groups?.["*"]; const allowAll = allowlistEnabled && Boolean(groups && Object.hasOwn(groups, "*")); const allowed = !allowlistEnabled || allowAll || (normalizedId ? Boolean(groups && Object.hasOwn(groups, normalizedId)) : false); return { allowlistEnabled, allowed, groupConfig, defaultConfig, }; } export function resolveChannelGroupRequireMention(params: { cfg: ClawdbotConfig; channel: GroupPolicyChannel; groupId?: string | null; accountId?: string | null; requireMentionOverride?: boolean; overrideOrder?: "before-config" | "after-config"; }): boolean { const { requireMentionOverride, overrideOrder = "after-config" } = params; const { groupConfig, defaultConfig } = resolveChannelGroupPolicy(params); const configMention = typeof groupConfig?.requireMention === "boolean" ? groupConfig.requireMention : typeof defaultConfig?.requireMention === "boolean" ? defaultConfig.requireMention : undefined; if (overrideOrder === "before-config" && typeof requireMentionOverride === "boolean") { return requireMentionOverride; } if (typeof configMention === "boolean") return configMention; if (overrideOrder !== "before-config" && typeof requireMentionOverride === "boolean") { return requireMentionOverride; } return true; }