93 lines
3.0 KiB
TypeScript
93 lines
3.0 KiB
TypeScript
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<string, ChannelGroupConfig>;
|
|
|
|
function resolveChannelGroups(
|
|
cfg: ClawdbotConfig,
|
|
channel: GroupPolicyChannel,
|
|
accountId?: string | null,
|
|
): ChannelGroups | undefined {
|
|
const normalizedAccountId = normalizeAccountId(accountId);
|
|
const channelConfig = cfg.channels?.[channel] as
|
|
| {
|
|
accounts?: Record<string, { groups?: ChannelGroups }>;
|
|
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;
|
|
}
|