All files / dingtalk-openclaw-connector/src directory.ts

0% Statements 0/54
0% Branches 0/1
0% Functions 0/1
0% Lines 0/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                                                                                                                                                                               
import type { ClawdbotConfig } from "openclaw/plugin-sdk";
import { resolveDingtalkAccount } from "./config/accounts.ts";
import { normalizeDingtalkTarget } from "./targets.ts";
 
export type DingtalkDirectoryPeer = {
  kind: "user";
  id: string;
  name?: string;
};
 
export type DingtalkDirectoryGroup = {
  kind: "group";
  id: string;
  name?: string;
};
 
export async function listDingtalkDirectoryPeers(params: {
  cfg: ClawdbotConfig;
  query?: string;
  limit?: number;
  accountId?: string;
}): Promise<DingtalkDirectoryPeer[]> {
  const account = resolveDingtalkAccount({ cfg: params.cfg, accountId: params.accountId });
  const dingtalkCfg = account.config;
  const q = params.query?.trim().toLowerCase() || "";
  const ids = new Set<string>();
 
  for (const entry of dingtalkCfg?.allowFrom ?? []) {
    const trimmed = String(entry).trim();
    if (trimmed && trimmed !== "*") {
      ids.add(trimmed);
    }
  }
 
  return Array.from(ids)
    .map((raw) => raw.trim())
    .filter(Boolean)
    .map((raw) => normalizeDingtalkTarget(raw) ?? raw)
    .filter((id) => (q ? id.toLowerCase().includes(q) : true))
    .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
    .map((id) => ({ kind: "user" as const, id }));
}
 
export async function listDingtalkDirectoryGroups(params: {
  cfg: ClawdbotConfig;
  query?: string;
  limit?: number;
  accountId?: string;
}): Promise<DingtalkDirectoryGroup[]> {
  const account = resolveDingtalkAccount({ cfg: params.cfg, accountId: params.accountId });
  const dingtalkCfg = account.config;
  const q = params.query?.trim().toLowerCase() || "";
  const ids = new Set<string>();
 
  for (const groupId of Object.keys(dingtalkCfg?.groups ?? {})) {
    const trimmed = groupId.trim();
    if (trimmed && trimmed !== "*") {
      ids.add(trimmed);
    }
  }
 
  for (const entry of dingtalkCfg?.groupAllowFrom ?? []) {
    const trimmed = String(entry).trim();
    if (trimmed && trimmed !== "*") {
      ids.add(trimmed);
    }
  }
 
  return Array.from(ids)
    .map((raw) => raw.trim())
    .filter(Boolean)
    .filter((id) => (q ? id.toLowerCase().includes(q) : true))
    .slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
    .map((id) => ({ kind: "group" as const, id }));
}
 
export async function listDingtalkDirectoryPeersLive(params: {
  cfg: ClawdbotConfig;
  query?: string;
  limit?: number;
  accountId?: string;
}): Promise<DingtalkDirectoryPeer[]> {
  // DingTalk doesn't have a public API to list users, so we fall back to static list
  return listDingtalkDirectoryPeers(params);
}
 
export async function listDingtalkDirectoryGroupsLive(params: {
  cfg: ClawdbotConfig;
  query?: string;
  limit?: number;
  accountId?: string;
}): Promise<DingtalkDirectoryGroup[]> {
  // DingTalk doesn't have a public API to list groups, so we fall back to static list
  return listDingtalkDirectoryGroups(params);
}