// Compatibility policy helpers for Qiaoqiao (kept with Qiaoqiao naming for historical bot.ts usage) function normalizeValue(v: unknown): string { return String(v ?? "").trim().toLowerCase(); } function toStringList(input: unknown): string[] { if (!Array.isArray(input)) return []; return input.map((v) => String(v).trim()).filter(Boolean); } function matchAllowFrom(allowFrom: string[], senderId?: string, senderName?: string): boolean { if (allowFrom.length === 0) return true; const id = normalizeValue(senderId); const name = normalizeValue(senderName); const normalizedAllow = allowFrom.map((v) => normalizeValue(v)); return normalizedAllow.includes(id) || (name ? normalizedAllow.includes(name) : false); } // Simple policy for Qiaoqiao group tools export function resolveQiaoqiaoGroupToolPolicy(): any { return {}; } export function resolveQiaoqiaoGroupConfig(params: { cfg?: Record; groupId?: string; }): Record | undefined { const groupId = String(params?.groupId ?? "").trim(); if (!groupId) return undefined; const groups = (params?.cfg as any)?.groups; if (!groups || typeof groups !== "object") return undefined; return groups[groupId] ?? groups[normalizeValue(groupId)] ?? undefined; } export function resolveQiaoqiaoReplyPolicy(params: { isDirectMessage?: boolean; globalConfig?: Record; groupConfig?: Record; }): { requireMention: boolean; allowMentionlessInMultiBotGroup: boolean } { const requireMention = params.isDirectMessage ? false : Boolean(params.groupConfig?.requireMention ?? params.globalConfig?.requireMention ?? false); const allowMentionlessInMultiBotGroup = Boolean( params.groupConfig?.allowMentionlessInMultiBotGroup ?? params.globalConfig?.allowMentionlessInMultiBotGroup ?? false, ); return { requireMention, allowMentionlessInMultiBotGroup }; } export function resolveQiaoqiaoGroupCommandMentionBypass(params: { globalConfig?: Record; groupConfig?: Record; }): "never" | "single_bot" | "always" { const raw = params.groupConfig?.groupCommandMentionBypass ?? params.globalConfig?.groupCommandMentionBypass ?? "never"; return raw === "always" || raw === "single_bot" ? raw : "never"; } export function resolveQiaoqiaoAllowlistMatch(params: { allowFrom?: Array; senderId?: string; senderName?: string; }): { allowed: boolean } { const allowFrom = toStringList(params.allowFrom); return { allowed: matchAllowFrom(allowFrom, params.senderId, params.senderName), }; } export function isQiaoqiaoGroupAllowed(params: { groupPolicy?: "open" | "allowlist" | "disabled" | string; allowFrom?: Array; senderId?: string; senderName?: string; }): boolean { const policy = String(params.groupPolicy ?? "open"); if (policy === "disabled") return false; if (policy !== "allowlist") return true; const allowFrom = toStringList(params.allowFrom); if (allowFrom.length === 0) return false; return matchAllowFrom(allowFrom, params.senderId, params.senderName); }