- Sync latest changes from clawdbot-feishu including multi-account support - Add eslint-disable comments for SDK-related any types - Remove unused imports - Fix no-floating-promises in monitor.ts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
105 lines
2.7 KiB
TypeScript
105 lines
2.7 KiB
TypeScript
import type { ChannelGroupContext, GroupToolPolicyConfig } from "openclaw/plugin-sdk";
|
|
import type { FeishuConfig, FeishuGroupConfig } from "./types.js";
|
|
|
|
export type FeishuAllowlistMatch = {
|
|
allowed: boolean;
|
|
matchKey?: string;
|
|
matchSource?: "wildcard" | "id" | "name";
|
|
};
|
|
|
|
export function resolveFeishuAllowlistMatch(params: {
|
|
allowFrom: Array<string | number>;
|
|
senderId: string;
|
|
senderName?: string | null;
|
|
}): FeishuAllowlistMatch {
|
|
const allowFrom = params.allowFrom
|
|
.map((entry) => String(entry).trim().toLowerCase())
|
|
.filter(Boolean);
|
|
|
|
if (allowFrom.length === 0) {
|
|
return { allowed: false };
|
|
}
|
|
if (allowFrom.includes("*")) {
|
|
return { allowed: true, matchKey: "*", matchSource: "wildcard" };
|
|
}
|
|
|
|
const senderId = params.senderId.toLowerCase();
|
|
if (allowFrom.includes(senderId)) {
|
|
return { allowed: true, matchKey: senderId, matchSource: "id" };
|
|
}
|
|
|
|
const senderName = params.senderName?.toLowerCase();
|
|
if (senderName && allowFrom.includes(senderName)) {
|
|
return { allowed: true, matchKey: senderName, matchSource: "name" };
|
|
}
|
|
|
|
return { allowed: false };
|
|
}
|
|
|
|
export function resolveFeishuGroupConfig(params: {
|
|
cfg?: FeishuConfig;
|
|
groupId?: string | null;
|
|
}): FeishuGroupConfig | undefined {
|
|
const groups = params.cfg?.groups ?? {};
|
|
const groupId = params.groupId?.trim();
|
|
if (!groupId) {
|
|
return undefined;
|
|
}
|
|
|
|
const direct = groups[groupId];
|
|
if (direct) {
|
|
return direct;
|
|
}
|
|
|
|
const lowered = groupId.toLowerCase();
|
|
const matchKey = Object.keys(groups).find((key) => key.toLowerCase() === lowered);
|
|
return matchKey ? groups[matchKey] : undefined;
|
|
}
|
|
|
|
export function resolveFeishuGroupToolPolicy(
|
|
params: ChannelGroupContext,
|
|
): GroupToolPolicyConfig | undefined {
|
|
const cfg = params.cfg.channels?.feishu as FeishuConfig | undefined;
|
|
if (!cfg) {
|
|
return undefined;
|
|
}
|
|
|
|
const groupConfig = resolveFeishuGroupConfig({
|
|
cfg,
|
|
groupId: params.groupId,
|
|
});
|
|
|
|
return groupConfig?.tools;
|
|
}
|
|
|
|
export function isFeishuGroupAllowed(params: {
|
|
groupPolicy: "open" | "allowlist" | "disabled";
|
|
allowFrom: Array<string | number>;
|
|
senderId: string;
|
|
senderName?: string | null;
|
|
}): boolean {
|
|
const { groupPolicy } = params;
|
|
if (groupPolicy === "disabled") {
|
|
return false;
|
|
}
|
|
if (groupPolicy === "open") {
|
|
return true;
|
|
}
|
|
return resolveFeishuAllowlistMatch(params).allowed;
|
|
}
|
|
|
|
export function resolveFeishuReplyPolicy(params: {
|
|
isDirectMessage: boolean;
|
|
globalConfig?: FeishuConfig;
|
|
groupConfig?: FeishuGroupConfig;
|
|
}): { requireMention: boolean } {
|
|
if (params.isDirectMessage) {
|
|
return { requireMention: false };
|
|
}
|
|
|
|
const requireMention =
|
|
params.groupConfig?.requireMention ?? params.globalConfig?.requireMention ?? true;
|
|
|
|
return { requireMention };
|
|
}
|