@zhin.js/adapter-dingtalk 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +9 -9
- package/lib/adapter.d.ts +8 -7
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +19 -18
- package/lib/adapter.js.map +1 -1
- package/lib/{bot.d.ts → endpoint.d.ts} +7 -7
- package/lib/endpoint.d.ts.map +1 -0
- package/lib/{bot.js → endpoint.js} +12 -8
- package/lib/endpoint.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +57 -52
- package/lib/index.js.map +1 -1
- package/lib/platform-permit.d.ts +16 -0
- package/lib/platform-permit.d.ts.map +1 -0
- package/lib/platform-permit.js +39 -0
- package/lib/platform-permit.js.map +1 -0
- package/lib/types.d.ts +1 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/skills/dingtalk/PERMITS.md +19 -0
- package/src/adapter.ts +19 -17
- package/src/{bot.ts → endpoint.ts} +14 -10
- package/src/index.ts +53 -43
- package/src/platform-permit.ts +53 -0
- package/src/types.ts +1 -1
- package/lib/bot.d.ts.map +0 -1
- package/lib/bot.js.map +0 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAsC,0BAA0B,EAAoB,MAAM,SAAS,CAAC;AACtH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 钉钉 DingTalk platform permit
|
|
3
|
+
*/
|
|
4
|
+
import type { Message } from 'zhin.js';
|
|
5
|
+
export declare function platformPermit(perm: string): string;
|
|
6
|
+
export declare function dingtalkGroupPermitResolver(logicalPerm: string): string;
|
|
7
|
+
export declare function normalizeDingtalkSenderForPermit(input: {
|
|
8
|
+
isOwner?: boolean;
|
|
9
|
+
isAdmin?: boolean;
|
|
10
|
+
}): {
|
|
11
|
+
role?: string;
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare function checkDingtalkPlatformPermit(perm: string, message: Message<any>): boolean;
|
|
15
|
+
export declare function registerDingtalkPlatformPermitChecker(): () => void;
|
|
16
|
+
//# sourceMappingURL=platform-permit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-permit.d.ts","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAOD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAQ5C;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAcxF;AAED,wBAAgB,qCAAqC,IAAI,MAAM,IAAI,CAElE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { registerPlatformPermitChecker } from 'zhin.js';
|
|
2
|
+
const ADAPTER = 'dingtalk';
|
|
3
|
+
export function platformPermit(perm) {
|
|
4
|
+
return `platform(${ADAPTER},${perm})`;
|
|
5
|
+
}
|
|
6
|
+
const FACTORY_PERM_MAP = {
|
|
7
|
+
group_admin: 'chat_admin',
|
|
8
|
+
group_owner: 'chat_owner',
|
|
9
|
+
};
|
|
10
|
+
export function dingtalkGroupPermitResolver(logicalPerm) {
|
|
11
|
+
return platformPermit(FACTORY_PERM_MAP[logicalPerm] ?? logicalPerm);
|
|
12
|
+
}
|
|
13
|
+
export function normalizeDingtalkSenderForPermit(input) {
|
|
14
|
+
if (input.isOwner) {
|
|
15
|
+
return { role: 'owner', permissions: ['chat_owner', 'chat_admin'] };
|
|
16
|
+
}
|
|
17
|
+
if (input.isAdmin) {
|
|
18
|
+
return { role: 'admin', permissions: ['chat_admin'] };
|
|
19
|
+
}
|
|
20
|
+
return { role: 'member', permissions: [] };
|
|
21
|
+
}
|
|
22
|
+
export function checkDingtalkPlatformPermit(perm, message) {
|
|
23
|
+
const sender = message.$sender;
|
|
24
|
+
const permissions = sender.permissions ?? [];
|
|
25
|
+
const role = sender.role;
|
|
26
|
+
const has = (t) => permissions.includes(t);
|
|
27
|
+
switch (perm) {
|
|
28
|
+
case 'chat_owner':
|
|
29
|
+
return role === 'owner' || has('chat_owner');
|
|
30
|
+
case 'chat_admin':
|
|
31
|
+
return role === 'owner' || role === 'admin' || has('chat_admin') || has('chat_owner');
|
|
32
|
+
default:
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function registerDingtalkPlatformPermitChecker() {
|
|
37
|
+
return registerPlatformPermitChecker(ADAPTER, checkDingtalkPlatformPermit);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=platform-permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-permit.js","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,GAAG,UAAU,CAAC;AAE3B,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,OAAO,IAAI,IAAI,GAAG,CAAC;AACxC,CAAC;AAED,MAAM,gBAAgB,GAA2B;IAC/C,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,YAAY;CAC1B,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAC7D,OAAO,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAGhD;IACC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAE,OAAqB;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAoD,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,KAAK,YAAY;YACf,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACxF;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qCAAqC;IACnD,OAAO,6BAA6B,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC"}
|
package/lib/types.d.ts
CHANGED
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/adapter-dingtalk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Zhin.js adapter for DingTalk (钉钉)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -34,13 +34,14 @@
|
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/koa": "^3.0.3",
|
|
37
|
-
"@types/node": "^25.9.
|
|
37
|
+
"@types/node": "^25.9.2",
|
|
38
38
|
"typescript": "^6.0.3",
|
|
39
|
-
"zhin.js": "2.0.0"
|
|
39
|
+
"@zhin.js/host-router": "2.0.0",
|
|
40
|
+
"zhin.js": "3.0.0"
|
|
40
41
|
},
|
|
41
42
|
"peerDependencies": {
|
|
42
|
-
"@zhin.js/host-router": "
|
|
43
|
-
"zhin.js": "
|
|
43
|
+
"@zhin.js/host-router": "2.0.0",
|
|
44
|
+
"zhin.js": "3.0.0"
|
|
44
45
|
},
|
|
45
46
|
"peerDependenciesMeta": {
|
|
46
47
|
"@zhin.js/host-router": {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 钉钉 DingTalk Platform Permits
|
|
2
|
+
|
|
3
|
+
## 入站字段
|
|
4
|
+
|
|
5
|
+
| 字段 | 来源 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| `$sender.role` | `isAdmin` → `admin`;`owner` 需业务侧创建群时指定 |
|
|
8
|
+
| `$sender.permissions` | `chat_owner` · `chat_admin` |
|
|
9
|
+
|
|
10
|
+
## Permit 词汇表
|
|
11
|
+
|
|
12
|
+
| `platform(dingtalk,…)` | 含义 |
|
|
13
|
+
|------------------------|------|
|
|
14
|
+
| `chat_owner` | 群主(创建群等) |
|
|
15
|
+
| `chat_admin` | 群管理员 |
|
|
16
|
+
|
|
17
|
+
## 工厂映射
|
|
18
|
+
|
|
19
|
+
`group_admin` → `chat_admin` · `group_owner` → `chat_owner`
|
package/src/adapter.ts
CHANGED
|
@@ -5,10 +5,12 @@ import {
|
|
|
5
5
|
Adapter,
|
|
6
6
|
Plugin,
|
|
7
7
|
} from "zhin.js";
|
|
8
|
-
import {
|
|
9
|
-
import type {
|
|
8
|
+
import { DingTalkEndpoint } from "./endpoint.js";
|
|
9
|
+
import type { DingTalkEndpointConfig } from "./types.js";
|
|
10
|
+
|
|
11
|
+
export class DingTalkAdapter extends Adapter<DingTalkEndpoint> {
|
|
12
|
+
static override readonly capabilities = ['inbound', 'outbound'] as const;
|
|
10
13
|
|
|
11
|
-
export class DingTalkAdapter extends Adapter<DingTalkBot> {
|
|
12
14
|
#router: any;
|
|
13
15
|
|
|
14
16
|
constructor(plugin: Plugin, router: any) {
|
|
@@ -16,26 +18,26 @@ export class DingTalkAdapter extends Adapter<DingTalkBot> {
|
|
|
16
18
|
this.#router = router;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
return new
|
|
21
|
+
createEndpoint(config: DingTalkEndpointConfig): DingTalkEndpoint {
|
|
22
|
+
return new DingTalkEndpoint(this, this.#router, config);
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
async kickMember(
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
26
|
-
return
|
|
25
|
+
async kickMember(endpointId: string, sceneId: string, userId: string) {
|
|
26
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
27
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
28
|
+
return endpoint.updateChat(sceneId, { del_useridlist: [userId] });
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
async setGroupName(
|
|
30
|
-
const
|
|
31
|
-
if (!
|
|
32
|
-
return
|
|
31
|
+
async setGroupName(endpointId: string, sceneId: string, name: string) {
|
|
32
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
33
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
34
|
+
return endpoint.updateChat(sceneId, { name });
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
async getGroupInfo(
|
|
36
|
-
const
|
|
37
|
-
if (!
|
|
38
|
-
return
|
|
37
|
+
async getGroupInfo(endpointId: string, sceneId: string) {
|
|
38
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
39
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
40
|
+
return endpoint.getChatInfo(sceneId);
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
async start(): Promise<void> {
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 钉钉
|
|
2
|
+
* 钉钉 Endpoint 实现
|
|
3
3
|
*/
|
|
4
|
-
import { formatCompact,
|
|
4
|
+
import { formatCompact, Endpoint, Message, MessageSegment, segment, SendContent, SendOptions } from 'zhin.js';
|
|
5
5
|
import { registerFetchRoute, type Router, type RouterContext } from "@zhin.js/host-router/router";
|
|
6
6
|
import { createHmac } from "crypto";
|
|
7
7
|
import type {
|
|
8
|
-
|
|
8
|
+
DingTalkEndpointConfig,
|
|
9
9
|
DingTalkMessage,
|
|
10
10
|
DingTalkEvent,
|
|
11
11
|
AccessToken,
|
|
12
12
|
} from "./types.js";
|
|
13
13
|
import type { DingTalkAdapter } from "./adapter.js";
|
|
14
|
+
import { normalizeDingtalkSenderForPermit } from "./platform-permit.js";
|
|
14
15
|
|
|
15
|
-
export class
|
|
16
|
+
export class DingTalkEndpoint implements Endpoint<DingTalkEndpointConfig, DingTalkMessage> {
|
|
16
17
|
$connected: boolean;
|
|
17
18
|
private router: any;
|
|
18
19
|
private accessToken: AccessToken;
|
|
@@ -30,7 +31,7 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
30
31
|
constructor(
|
|
31
32
|
public adapter: DingTalkAdapter,
|
|
32
33
|
router: any,
|
|
33
|
-
public $config:
|
|
34
|
+
public $config: DingTalkEndpointConfig
|
|
34
35
|
) {
|
|
35
36
|
this.router = router;
|
|
36
37
|
this.$connected = false;
|
|
@@ -120,7 +121,7 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
120
121
|
this.adapter.emit("message.receive", message);
|
|
121
122
|
this.logger.debug(formatCompact( {
|
|
122
123
|
op: "recv",
|
|
123
|
-
|
|
124
|
+
endpoint: this.$config.name,
|
|
124
125
|
channel: message.$channel.type,
|
|
125
126
|
id: message.$channel.id,
|
|
126
127
|
len: segment.raw(message.$content).length,
|
|
@@ -170,13 +171,16 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
170
171
|
$formatMessage(msg: DingTalkMessage): Message<DingTalkMessage> {
|
|
171
172
|
const content = this.parseMessageContent(msg);
|
|
172
173
|
const chatType = msg.conversationType === "2" ? "group" : "private";
|
|
174
|
+
const permit = normalizeDingtalkSenderForPermit({ isAdmin: msg.isAdmin === true });
|
|
173
175
|
return Message.from(msg, {
|
|
174
176
|
$id: msg.msgId || Date.now().toString(),
|
|
175
177
|
$adapter: "dingtalk",
|
|
176
|
-
$
|
|
178
|
+
$endpoint: this.$config.name,
|
|
177
179
|
$sender: {
|
|
178
180
|
id: msg.senderId || msg.senderStaffId || "unknown",
|
|
179
181
|
name: msg.senderNick || msg.senderId || "Unknown User",
|
|
182
|
+
role: permit.role,
|
|
183
|
+
permissions: permit.permissions,
|
|
180
184
|
},
|
|
181
185
|
$channel: {
|
|
182
186
|
id: msg.conversationId || "unknown",
|
|
@@ -191,7 +195,7 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
191
195
|
$reply: async (content: SendContent): Promise<string> => {
|
|
192
196
|
return await this.adapter.sendMessage({
|
|
193
197
|
context: "dingtalk",
|
|
194
|
-
|
|
198
|
+
endpoint: this.$config.name,
|
|
195
199
|
id: msg.conversationId || msg.senderId || "unknown",
|
|
196
200
|
type: chatType,
|
|
197
201
|
content: content,
|
|
@@ -426,7 +430,7 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
426
430
|
try {
|
|
427
431
|
await this.refreshAccessToken();
|
|
428
432
|
this.$connected = true;
|
|
429
|
-
this.logger.info(formatCompact({
|
|
433
|
+
this.logger.info(formatCompact({ endpoint: this.$config.name }));
|
|
430
434
|
this.logger.info(formatCompact( { op: "webhook", path: this.$config.webhookPath }));
|
|
431
435
|
} catch (error) {
|
|
432
436
|
this.logger.error("Failed to connect DingTalk bot:", error);
|
|
@@ -438,7 +442,7 @@ export class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
|
438
442
|
try {
|
|
439
443
|
this.sessionWebhooks.clear();
|
|
440
444
|
this.$connected = false;
|
|
441
|
-
this.logger.info(formatCompact( { op: "disconnect",
|
|
445
|
+
this.logger.info(formatCompact( { op: "disconnect", endpoint: this.$config.name }));
|
|
442
446
|
} catch (error) {
|
|
443
447
|
this.logger.error("Error disconnecting DingTalk bot:", error);
|
|
444
448
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { usePlugin, type Plugin, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
|
|
5
5
|
import { DingTalkAdapter } from "./adapter.js";
|
|
6
|
+
import {
|
|
7
|
+
dingtalkGroupPermitResolver,
|
|
8
|
+
platformPermit,
|
|
9
|
+
registerDingtalkPlatformPermitChecker,
|
|
10
|
+
} from "./platform-permit.js";
|
|
6
11
|
|
|
7
12
|
declare module "zhin.js" {
|
|
8
13
|
namespace Plugin {
|
|
@@ -16,7 +21,7 @@ declare module "zhin.js" {
|
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
export * from "./types.js";
|
|
19
|
-
export {
|
|
24
|
+
export { DingTalkEndpoint } from "./endpoint.js";
|
|
20
25
|
export { DingTalkAdapter } from "./adapter.js";
|
|
21
26
|
|
|
22
27
|
const plugin = usePlugin();
|
|
@@ -25,7 +30,7 @@ const { provide, useContext } = plugin;
|
|
|
25
30
|
useContext("router", (router: any) => {
|
|
26
31
|
provide({
|
|
27
32
|
name: "dingtalk",
|
|
28
|
-
description: "DingTalk
|
|
33
|
+
description: "DingTalk Endpoint Adapter",
|
|
29
34
|
mounted: async (p: Plugin) => {
|
|
30
35
|
const adapter = new DingTalkAdapter(p, router);
|
|
31
36
|
await adapter.start();
|
|
@@ -38,11 +43,14 @@ useContext("router", (router: any) => {
|
|
|
38
43
|
});
|
|
39
44
|
|
|
40
45
|
useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdapter) => {
|
|
46
|
+
const disposers: (() => void)[] = [];
|
|
47
|
+
disposers.push(registerDingtalkPlatformPermitChecker());
|
|
41
48
|
const groupTools = createGroupManagementTools(
|
|
42
49
|
dingtalk as unknown as IGroupManagement,
|
|
43
50
|
'dingtalk',
|
|
51
|
+
{ permitResolver: dingtalkGroupPermitResolver, registerChecker: false },
|
|
44
52
|
);
|
|
45
|
-
|
|
53
|
+
disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
|
|
46
54
|
|
|
47
55
|
disposers.push(toolService.addTool({
|
|
48
56
|
name: 'dingtalk_get_user',
|
|
@@ -50,17 +58,17 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
50
58
|
parameters: {
|
|
51
59
|
type: 'object',
|
|
52
60
|
properties: {
|
|
53
|
-
|
|
61
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
54
62
|
user_id: { type: 'string', description: '用户 ID' },
|
|
55
63
|
},
|
|
56
|
-
required: ['
|
|
64
|
+
required: ['endpoint_id', 'user_id'],
|
|
57
65
|
},
|
|
58
66
|
platforms: ['dingtalk'],
|
|
59
67
|
tags: ['dingtalk'],
|
|
60
68
|
execute: async (args: Record<string, any>) => {
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
63
|
-
return await
|
|
69
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
70
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
71
|
+
return await endpoint.getUserInfo(args.user_id);
|
|
64
72
|
},
|
|
65
73
|
}, plugin.name));
|
|
66
74
|
|
|
@@ -70,17 +78,17 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
70
78
|
parameters: {
|
|
71
79
|
type: 'object',
|
|
72
80
|
properties: {
|
|
73
|
-
|
|
81
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
74
82
|
dept_id: { type: 'string', description: '部门 ID' },
|
|
75
83
|
},
|
|
76
|
-
required: ['
|
|
84
|
+
required: ['endpoint_id', 'dept_id'],
|
|
77
85
|
},
|
|
78
86
|
platforms: ['dingtalk'],
|
|
79
87
|
tags: ['dingtalk'],
|
|
80
88
|
execute: async (args: Record<string, any>) => {
|
|
81
|
-
const
|
|
82
|
-
if (!
|
|
83
|
-
const users = await
|
|
89
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
90
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
91
|
+
const users = await endpoint.getDepartmentUsers(args.dept_id);
|
|
84
92
|
return { users, count: users.length };
|
|
85
93
|
},
|
|
86
94
|
}, plugin.name));
|
|
@@ -91,17 +99,17 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
91
99
|
parameters: {
|
|
92
100
|
type: 'object',
|
|
93
101
|
properties: {
|
|
94
|
-
|
|
102
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
95
103
|
dept_id: { type: 'string', description: '父部门 ID,默认 1(根部门)' },
|
|
96
104
|
},
|
|
97
|
-
required: ['
|
|
105
|
+
required: ['endpoint_id'],
|
|
98
106
|
},
|
|
99
107
|
platforms: ['dingtalk'],
|
|
100
108
|
tags: ['dingtalk'],
|
|
101
109
|
execute: async (args: Record<string, any>) => {
|
|
102
|
-
const
|
|
103
|
-
if (!
|
|
104
|
-
const departments = await
|
|
110
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
111
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
112
|
+
const departments = await endpoint.getDepartmentList(args.dept_id || '1');
|
|
105
113
|
return { departments, count: departments.length };
|
|
106
114
|
},
|
|
107
115
|
}, plugin.name));
|
|
@@ -112,19 +120,19 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
112
120
|
parameters: {
|
|
113
121
|
type: 'object',
|
|
114
122
|
properties: {
|
|
115
|
-
|
|
123
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
116
124
|
user_ids: { type: 'string', description: '用户 ID 列表,逗号分隔' },
|
|
117
125
|
content: { type: 'string', description: '通知内容' },
|
|
118
126
|
},
|
|
119
|
-
required: ['
|
|
127
|
+
required: ['endpoint_id', 'user_ids', 'content'],
|
|
120
128
|
},
|
|
121
129
|
platforms: ['dingtalk'],
|
|
122
130
|
tags: ['dingtalk'],
|
|
123
131
|
execute: async (args: Record<string, any>) => {
|
|
124
|
-
const
|
|
125
|
-
if (!
|
|
132
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
133
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
126
134
|
const msgContent = { msgtype: 'text', text: { content: args.content } };
|
|
127
|
-
const success = await
|
|
135
|
+
const success = await endpoint.sendWorkNotice(args.user_ids.split(','), msgContent);
|
|
128
136
|
return { success, message: success ? '工作通知已发送' : '发送失败' };
|
|
129
137
|
},
|
|
130
138
|
}, plugin.name));
|
|
@@ -135,19 +143,20 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
135
143
|
parameters: {
|
|
136
144
|
type: 'object',
|
|
137
145
|
properties: {
|
|
138
|
-
|
|
146
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
139
147
|
name: { type: 'string', description: '群名' },
|
|
140
148
|
owner: { type: 'string', description: '群主用户 ID' },
|
|
141
149
|
members: { type: 'string', description: '成员用户 ID 列表,逗号分隔' },
|
|
142
150
|
},
|
|
143
|
-
required: ['
|
|
151
|
+
required: ['endpoint_id', 'name', 'owner', 'members'],
|
|
144
152
|
},
|
|
145
153
|
platforms: ['dingtalk'],
|
|
146
154
|
tags: ['dingtalk'],
|
|
155
|
+
permissions: [platformPermit('chat_owner')],
|
|
147
156
|
execute: async (args: Record<string, any>) => {
|
|
148
|
-
const
|
|
149
|
-
if (!
|
|
150
|
-
const chatId = await
|
|
157
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
158
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
159
|
+
const chatId = await endpoint.createChat(args.name, args.owner, args.members.split(','));
|
|
151
160
|
return { success: !!chatId, chat_id: chatId, message: chatId ? `群聊创建成功: ${chatId}` : '创建失败' };
|
|
152
161
|
},
|
|
153
162
|
}, plugin.name));
|
|
@@ -158,18 +167,19 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
158
167
|
parameters: {
|
|
159
168
|
type: 'object',
|
|
160
169
|
properties: {
|
|
161
|
-
|
|
170
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
162
171
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
163
172
|
user_ids: { type: 'string', description: '要添加的用户 ID 列表,逗号分隔' },
|
|
164
173
|
},
|
|
165
|
-
required: ['
|
|
174
|
+
required: ['endpoint_id', 'chat_id', 'user_ids'],
|
|
166
175
|
},
|
|
167
176
|
platforms: ['dingtalk'],
|
|
168
177
|
tags: ['dingtalk'],
|
|
178
|
+
permissions: [platformPermit('chat_admin')],
|
|
169
179
|
execute: async (args: Record<string, any>) => {
|
|
170
|
-
const
|
|
171
|
-
if (!
|
|
172
|
-
const success = await
|
|
180
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
181
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
182
|
+
const success = await endpoint.updateChat(args.chat_id, { add_useridlist: args.user_ids.split(',') });
|
|
173
183
|
return { success, message: success ? '成员添加成功' : '添加失败' };
|
|
174
184
|
},
|
|
175
185
|
}, plugin.name));
|
|
@@ -180,17 +190,17 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
180
190
|
parameters: {
|
|
181
191
|
type: 'object',
|
|
182
192
|
properties: {
|
|
183
|
-
|
|
193
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
184
194
|
dept_id: { type: 'string', description: '部门 ID' },
|
|
185
195
|
},
|
|
186
|
-
required: ['
|
|
196
|
+
required: ['endpoint_id', 'dept_id'],
|
|
187
197
|
},
|
|
188
198
|
platforms: ['dingtalk'],
|
|
189
199
|
tags: ['dingtalk'],
|
|
190
200
|
execute: async (args: Record<string, any>) => {
|
|
191
|
-
const
|
|
192
|
-
if (!
|
|
193
|
-
return await
|
|
201
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
202
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
203
|
+
return await endpoint.getDepartmentInfo(Number(args.dept_id));
|
|
194
204
|
},
|
|
195
205
|
}, plugin.name));
|
|
196
206
|
|
|
@@ -200,26 +210,26 @@ useContext('tool', 'dingtalk', (toolService: ToolFeature, dingtalk: DingTalkAdap
|
|
|
200
210
|
parameters: {
|
|
201
211
|
type: 'object',
|
|
202
212
|
properties: {
|
|
203
|
-
|
|
213
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
204
214
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
205
215
|
name: { type: 'string', description: '新群名(可选)' },
|
|
206
216
|
owner: { type: 'string', description: '新群主 userId(可选)' },
|
|
207
217
|
add_members: { type: 'string', description: '要添加的成员 userId,逗号分隔(可选)' },
|
|
208
218
|
remove_members: { type: 'string', description: '要移除的成员 userId,逗号分隔(可选)' },
|
|
209
219
|
},
|
|
210
|
-
required: ['
|
|
220
|
+
required: ['endpoint_id', 'chat_id'],
|
|
211
221
|
},
|
|
212
222
|
platforms: ['dingtalk'],
|
|
213
223
|
tags: ['dingtalk'],
|
|
214
224
|
execute: async (args: Record<string, any>) => {
|
|
215
|
-
const
|
|
216
|
-
if (!
|
|
225
|
+
const endpoint = dingtalk.endpoints.get(args.endpoint_id);
|
|
226
|
+
if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
|
|
217
227
|
const options: any = {};
|
|
218
228
|
if (args.name) options.name = args.name;
|
|
219
229
|
if (args.owner) options.owner = args.owner;
|
|
220
230
|
if (args.add_members) options.add_useridlist = args.add_members.split(',').map((s: string) => s.trim());
|
|
221
231
|
if (args.remove_members) options.del_useridlist = args.remove_members.split(',').map((s: string) => s.trim());
|
|
222
|
-
await
|
|
232
|
+
await endpoint.updateChat(args.chat_id, options);
|
|
223
233
|
return { success: true, message: '群聊设置已更新' };
|
|
224
234
|
},
|
|
225
235
|
}, plugin.name));
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 钉钉 DingTalk platform permit
|
|
3
|
+
*/
|
|
4
|
+
import type { Message } from 'zhin.js';
|
|
5
|
+
import { registerPlatformPermitChecker } from 'zhin.js';
|
|
6
|
+
|
|
7
|
+
const ADAPTER = 'dingtalk';
|
|
8
|
+
|
|
9
|
+
export function platformPermit(perm: string): string {
|
|
10
|
+
return `platform(${ADAPTER},${perm})`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const FACTORY_PERM_MAP: Record<string, string> = {
|
|
14
|
+
group_admin: 'chat_admin',
|
|
15
|
+
group_owner: 'chat_owner',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function dingtalkGroupPermitResolver(logicalPerm: string): string {
|
|
19
|
+
return platformPermit(FACTORY_PERM_MAP[logicalPerm] ?? logicalPerm);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function normalizeDingtalkSenderForPermit(input: {
|
|
23
|
+
isOwner?: boolean;
|
|
24
|
+
isAdmin?: boolean;
|
|
25
|
+
}): { role?: string; permissions?: string[] } {
|
|
26
|
+
if (input.isOwner) {
|
|
27
|
+
return { role: 'owner', permissions: ['chat_owner', 'chat_admin'] };
|
|
28
|
+
}
|
|
29
|
+
if (input.isAdmin) {
|
|
30
|
+
return { role: 'admin', permissions: ['chat_admin'] };
|
|
31
|
+
}
|
|
32
|
+
return { role: 'member', permissions: [] };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function checkDingtalkPlatformPermit(perm: string, message: Message<any>): boolean {
|
|
36
|
+
const sender = message.$sender as { role?: string; permissions?: string[] };
|
|
37
|
+
const permissions = sender.permissions ?? [];
|
|
38
|
+
const role = sender.role;
|
|
39
|
+
const has = (t: string) => permissions.includes(t);
|
|
40
|
+
|
|
41
|
+
switch (perm) {
|
|
42
|
+
case 'chat_owner':
|
|
43
|
+
return role === 'owner' || has('chat_owner');
|
|
44
|
+
case 'chat_admin':
|
|
45
|
+
return role === 'owner' || role === 'admin' || has('chat_admin') || has('chat_owner');
|
|
46
|
+
default:
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function registerDingtalkPlatformPermitChecker(): () => void {
|
|
52
|
+
return registerPlatformPermitChecker(ADAPTER, checkDingtalkPlatformPermit);
|
|
53
|
+
}
|
package/src/types.ts
CHANGED
package/lib/bot.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAwC,WAAW,EAAE,MAAM,SAAS,CAAC;AAGzG,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,qBAAa,WAAY,YAAW,GAAG,CAAC,iBAAiB,EAAE,eAAe,CAAC;IAgBhE,OAAO,EAAE,eAAe;IAExB,OAAO,EAAE,iBAAiB;IAjBnC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAkC;IAEzD,IAAI,GAAG,WAEN;IAED,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,eAAe,EAC/B,MAAM,EAAE,GAAG,EACJ,OAAO,EAAE,iBAAiB;YASrB,OAAO;IA4BrB,OAAO,CAAC,iBAAiB;YAMX,aAAa;IA0B3B,OAAO,CAAC,eAAe;YAaT,WAAW;YAeX,iBAAiB;YAajB,kBAAkB;IA2BhC,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAiC9D,OAAO,CAAC,mBAAmB;IAoGrB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAwCnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,iBAAiB;IA8EnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAczC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAclD,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpE,iBAAiB,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAcrD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAc/C,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBnB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAczC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,OAAO,CAAC;CAgBpB"}
|