@zaofan/dsh-qqbot 0.6.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/LICENSE +21 -0
- package/README.md +308 -0
- package/README_EN.md +273 -0
- package/client/qqbot-settings.js +1463 -0
- package/cordis.patch.yml +36 -0
- package/dist/api/group-admin.d.ts +112 -0
- package/dist/api/group-admin.d.ts.map +1 -0
- package/dist/api/group-admin.js +179 -0
- package/dist/api/group-admin.js.map +1 -0
- package/dist/channel-tools.d.ts +14 -0
- package/dist/channel-tools.d.ts.map +1 -0
- package/dist/channel-tools.js +880 -0
- package/dist/channel-tools.js.map +1 -0
- package/dist/commands/help.d.ts +11 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +21 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +29 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/misc.d.ts +14 -0
- package/dist/commands/misc.d.ts.map +1 -0
- package/dist/commands/misc.js +39 -0
- package/dist/commands/misc.js.map +1 -0
- package/dist/commands/model.d.ts +7 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +58 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/session.d.ts +10 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +26 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +24 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +12 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config.d.ts +205 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +203 -0
- package/dist/config.js.map +1 -0
- package/dist/features/chat-ledger.d.ts +53 -0
- package/dist/features/chat-ledger.d.ts.map +1 -0
- package/dist/features/chat-ledger.js +185 -0
- package/dist/features/chat-ledger.js.map +1 -0
- package/dist/features/face-tags.d.ts +17 -0
- package/dist/features/face-tags.d.ts.map +1 -0
- package/dist/features/face-tags.js +79 -0
- package/dist/features/face-tags.js.map +1 -0
- package/dist/features/group-join-request.d.ts +65 -0
- package/dist/features/group-join-request.d.ts.map +1 -0
- package/dist/features/group-join-request.js +190 -0
- package/dist/features/group-join-request.js.map +1 -0
- package/dist/features/history-store.d.ts +8 -0
- package/dist/features/history-store.d.ts.map +1 -0
- package/dist/features/history-store.js +24 -0
- package/dist/features/history-store.js.map +1 -0
- package/dist/features/qq-approval.d.ts +78 -0
- package/dist/features/qq-approval.d.ts.map +1 -0
- package/dist/features/qq-approval.js +165 -0
- package/dist/features/qq-approval.js.map +1 -0
- package/dist/features/schedule-store.d.ts +62 -0
- package/dist/features/schedule-store.d.ts.map +1 -0
- package/dist/features/schedule-store.js +253 -0
- package/dist/features/schedule-store.js.map +1 -0
- package/dist/features/scheduler.d.ts +9 -0
- package/dist/features/scheduler.d.ts.map +1 -0
- package/dist/features/scheduler.js +146 -0
- package/dist/features/scheduler.js.map +1 -0
- package/dist/features/sticker-gate.d.ts +90 -0
- package/dist/features/sticker-gate.d.ts.map +1 -0
- package/dist/features/sticker-gate.js +391 -0
- package/dist/features/sticker-gate.js.map +1 -0
- package/dist/features/sticker-store.d.ts +158 -0
- package/dist/features/sticker-store.d.ts.map +1 -0
- package/dist/features/sticker-store.js +676 -0
- package/dist/features/sticker-store.js.map +1 -0
- package/dist/features/sticker-tagger.d.ts +10 -0
- package/dist/features/sticker-tagger.d.ts.map +1 -0
- package/dist/features/sticker-tagger.js +139 -0
- package/dist/features/sticker-tagger.js.map +1 -0
- package/dist/gateway/bootstrap.d.ts +12 -0
- package/dist/gateway/bootstrap.d.ts.map +1 -0
- package/dist/gateway/bootstrap.js +346 -0
- package/dist/gateway/bootstrap.js.map +1 -0
- package/dist/gateway/debounce.d.ts +40 -0
- package/dist/gateway/debounce.d.ts.map +1 -0
- package/dist/gateway/debounce.js +262 -0
- package/dist/gateway/debounce.js.map +1 -0
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +3 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/middleware-setup.d.ts +12 -0
- package/dist/gateway/middleware-setup.d.ts.map +1 -0
- package/dist/gateway/middleware-setup.js +156 -0
- package/dist/gateway/middleware-setup.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +187 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/attachment.d.ts +11 -0
- package/dist/middleware/attachment.d.ts.map +1 -0
- package/dist/middleware/attachment.js +17 -0
- package/dist/middleware/attachment.js.map +1 -0
- package/dist/middleware/media-history.d.ts +30 -0
- package/dist/middleware/media-history.d.ts.map +1 -0
- package/dist/middleware/media-history.js +54 -0
- package/dist/middleware/media-history.js.map +1 -0
- package/dist/middleware/sticker-capture.d.ts +17 -0
- package/dist/middleware/sticker-capture.d.ts.map +1 -0
- package/dist/middleware/sticker-capture.js +97 -0
- package/dist/middleware/sticker-capture.js.map +1 -0
- package/dist/model/index.d.ts +10 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +9 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/model-resolver.d.ts +88 -0
- package/dist/model/model-resolver.d.ts.map +1 -0
- package/dist/model/model-resolver.js +151 -0
- package/dist/model/model-resolver.js.map +1 -0
- package/dist/model/prefs-store.d.ts +24 -0
- package/dist/model/prefs-store.d.ts.map +1 -0
- package/dist/model/prefs-store.js +126 -0
- package/dist/model/prefs-store.js.map +1 -0
- package/dist/model/settings-reader.d.ts +19 -0
- package/dist/model/settings-reader.d.ts.map +1 -0
- package/dist/model/settings-reader.js +76 -0
- package/dist/model/settings-reader.js.map +1 -0
- package/dist/model/types.d.ts +15 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +5 -0
- package/dist/model/types.js.map +1 -0
- package/dist/session/idle-evictor.d.ts +18 -0
- package/dist/session/idle-evictor.d.ts.map +1 -0
- package/dist/session/idle-evictor.js +31 -0
- package/dist/session/idle-evictor.js.map +1 -0
- package/dist/session/index.d.ts +9 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +8 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/session-manager.d.ts +97 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +624 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/types.d.ts +130 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session/workspace-attach.d.ts +22 -0
- package/dist/session/workspace-attach.d.ts.map +1 -0
- package/dist/session/workspace-attach.js +21 -0
- package/dist/session/workspace-attach.js.map +1 -0
- package/dist/setup.d.ts +25 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +198 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/scope.d.ts +14 -0
- package/dist/shared/scope.d.ts.map +1 -0
- package/dist/shared/scope.js +12 -0
- package/dist/shared/scope.js.map +1 -0
- package/dist/shared/send-helper.d.ts +11 -0
- package/dist/shared/send-helper.d.ts.map +1 -0
- package/dist/shared/send-helper.js +13 -0
- package/dist/shared/send-helper.js.map +1 -0
- package/dist/shared/utils.d.ts +28 -0
- package/dist/shared/utils.d.ts.map +1 -0
- package/dist/shared/utils.js +143 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/transport/attachment.d.ts +18 -0
- package/dist/transport/attachment.d.ts.map +1 -0
- package/dist/transport/attachment.js +106 -0
- package/dist/transport/attachment.js.map +1 -0
- package/dist/transport/chunker.d.ts +14 -0
- package/dist/transport/chunker.d.ts.map +1 -0
- package/dist/transport/chunker.js +78 -0
- package/dist/transport/chunker.js.map +1 -0
- package/dist/transport/events.d.ts +80 -0
- package/dist/transport/events.d.ts.map +1 -0
- package/dist/transport/events.js +62 -0
- package/dist/transport/events.js.map +1 -0
- package/dist/transport/inbound.d.ts +8 -0
- package/dist/transport/inbound.d.ts.map +1 -0
- package/dist/transport/inbound.js +292 -0
- package/dist/transport/inbound.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +10 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/inject-rules.d.ts +24 -0
- package/dist/transport/inject-rules.d.ts.map +1 -0
- package/dist/transport/inject-rules.js +72 -0
- package/dist/transport/inject-rules.js.map +1 -0
- package/dist/transport/outbound-buffer.d.ts +56 -0
- package/dist/transport/outbound-buffer.d.ts.map +1 -0
- package/dist/transport/outbound-buffer.js +131 -0
- package/dist/transport/outbound-buffer.js.map +1 -0
- package/dist/transport/outbound.d.ts +30 -0
- package/dist/transport/outbound.d.ts.map +1 -0
- package/dist/transport/outbound.js +139 -0
- package/dist/transport/outbound.js.map +1 -0
- package/dist/transport/rich-media.d.ts +41 -0
- package/dist/transport/rich-media.d.ts.map +1 -0
- package/dist/transport/rich-media.js +104 -0
- package/dist/transport/rich-media.js.map +1 -0
- package/dist/transport/streaming-writer.d.ts +47 -0
- package/dist/transport/streaming-writer.d.ts.map +1 -0
- package/dist/transport/streaming-writer.js +110 -0
- package/dist/transport/streaming-writer.js.map +1 -0
- package/dist/transport/tool-presenter.d.ts +38 -0
- package/dist/transport/tool-presenter.d.ts.map +1 -0
- package/dist/transport/tool-presenter.js +121 -0
- package/dist/transport/tool-presenter.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +106 -0
- package/settings-host.js +927 -0
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# dsh-im-qqbot bundle patch
|
|
2
|
+
#
|
|
3
|
+
# 当本包通过 `dsh plugin --profile <name> add @tencent-connect/dsh-qqbot` 安装后,
|
|
4
|
+
# dsh 启动时自动加载此 patch。
|
|
5
|
+
#
|
|
6
|
+
# 环境变量:
|
|
7
|
+
# QQBOT_APPID - QQ Bot AppID(必填)
|
|
8
|
+
# QQBOT_SECRET - QQ Bot AppSecret(必填)
|
|
9
|
+
#
|
|
10
|
+
# 叠加顺序:dsh-base → 本 bundle patch → profile cordis.patch.yml → --patch
|
|
11
|
+
|
|
12
|
+
# ── 插入 im-qqbot 插件行 ──
|
|
13
|
+
- insert:
|
|
14
|
+
- id: im-qqbot
|
|
15
|
+
name: '@zaofan/dsh-qqbot'
|
|
16
|
+
config:
|
|
17
|
+
appId: __FROM_ENV__
|
|
18
|
+
appSecret: __FROM_ENV__
|
|
19
|
+
# provider/model 留空:从宿主默认模型路由继承
|
|
20
|
+
# 用户可通过 /model 命令在聊天中切换
|
|
21
|
+
requireMention: true
|
|
22
|
+
textChunkLimit: 4500
|
|
23
|
+
sessionIdleTimeout: 1800000
|
|
24
|
+
maxQueue: 20
|
|
25
|
+
processingTimeoutMs: 120000
|
|
26
|
+
historyLimit: 10
|
|
27
|
+
access:
|
|
28
|
+
c2cMode: open
|
|
29
|
+
c2cAllow: []
|
|
30
|
+
groupMode: open
|
|
31
|
+
groupAllow: []
|
|
32
|
+
debug: false
|
|
33
|
+
|
|
34
|
+
# ── 设置面板(单包自含): host 桥由 im-qqbot 插件 apply 内动态装载(settings-host.js,
|
|
35
|
+
# 仅 web profile 有 settings/webServer 服务时生效); 设置页 client 经 dsh.client
|
|
36
|
+
# (exports ./client) 自动出现在 dsh Web 设置里 —— 无需再单独安装 dsh-qqbot-settings。
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/** 已知官方未开放(内邀中)的能力门控元数据 —— UI 据此渲染红条/灰态; 开放后删除对应项即可点亮 */
|
|
2
|
+
export declare const FEATURE_GATES: Record<string, {
|
|
3
|
+
open: boolean;
|
|
4
|
+
human: string;
|
|
5
|
+
}>;
|
|
6
|
+
export interface MemberInfo {
|
|
7
|
+
member_openid: string;
|
|
8
|
+
username?: string;
|
|
9
|
+
member_role?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface JoinRequest {
|
|
12
|
+
join_request_id: string;
|
|
13
|
+
risk_tips?: string;
|
|
14
|
+
union_openid?: string;
|
|
15
|
+
member_openid: string;
|
|
16
|
+
username?: string;
|
|
17
|
+
apply_at?: string;
|
|
18
|
+
apply_source?: 'self_apply' | 'invited';
|
|
19
|
+
invited_by?: string;
|
|
20
|
+
bot?: boolean;
|
|
21
|
+
verify_info?: {
|
|
22
|
+
method?: string;
|
|
23
|
+
verify_message?: string;
|
|
24
|
+
review_qa_list?: Array<{
|
|
25
|
+
question: string;
|
|
26
|
+
answer: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface MuteState {
|
|
31
|
+
global_rule?: {
|
|
32
|
+
mode?: 'none' | 'always' | 'schedule';
|
|
33
|
+
schedule_rules?: unknown[];
|
|
34
|
+
recurring_rules?: unknown[];
|
|
35
|
+
};
|
|
36
|
+
members?: Array<{
|
|
37
|
+
member_openid: string;
|
|
38
|
+
mute_expire_at?: string;
|
|
39
|
+
username?: string;
|
|
40
|
+
union_openid?: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export type ApiResult<T> = {
|
|
44
|
+
ok: true;
|
|
45
|
+
data: T;
|
|
46
|
+
} | {
|
|
47
|
+
ok: false;
|
|
48
|
+
err: {
|
|
49
|
+
code: string;
|
|
50
|
+
human: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
/** 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案) */
|
|
54
|
+
export declare function mapErrHuman(code: string | number, gateHuman?: string): string;
|
|
55
|
+
export interface GroupAdminOptions {
|
|
56
|
+
appId: string;
|
|
57
|
+
appSecret: string;
|
|
58
|
+
/** 非官方能力门控覆盖(测试/开放后置 true), 默认读 FEATURE_GATES */
|
|
59
|
+
featureOverrides?: Record<string, boolean>;
|
|
60
|
+
logDir?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare class GroupAdminClient {
|
|
63
|
+
private readonly opts;
|
|
64
|
+
private readonly tokens;
|
|
65
|
+
private readonly gates;
|
|
66
|
+
constructor(opts: GroupAdminOptions);
|
|
67
|
+
private gate;
|
|
68
|
+
private call;
|
|
69
|
+
/** 获取群成员列表(🔴 未开放, 完整实现保留, 开放即用) */
|
|
70
|
+
listMembers(gid: string, cursor?: string): Promise<ApiResult<{
|
|
71
|
+
members: MemberInfo[];
|
|
72
|
+
next_cursor: string;
|
|
73
|
+
}>>;
|
|
74
|
+
/** 批量移除成员(踢人, 🔴 未开放) */
|
|
75
|
+
removeMembers(gid: string, memberOpenids: string[], addToBlacklist?: boolean): Promise<ApiResult<{
|
|
76
|
+
remove_members_result: string;
|
|
77
|
+
add_to_member_blacklist_fail_openids: string[];
|
|
78
|
+
}>>;
|
|
79
|
+
/** 入群申请列表(🟡 群管理员) */
|
|
80
|
+
listJoinRequests(gid: string, cursor?: string, limit?: number): Promise<ApiResult<{
|
|
81
|
+
list: JoinRequest[];
|
|
82
|
+
next_cursor: string;
|
|
83
|
+
}>>;
|
|
84
|
+
/** 审批入群申请(🟡 群管理员; op: approve | decline) */
|
|
85
|
+
approveJoinRequest(gid: string, memberOpenid: string, op: 'approve' | 'decline', opts?: {
|
|
86
|
+
join_request_id?: string;
|
|
87
|
+
reject_reason?: string;
|
|
88
|
+
add_to_blacklist?: boolean;
|
|
89
|
+
}): Promise<ApiResult<Record<string, never>>>;
|
|
90
|
+
/** 查询群禁言状态(🟡 群管理员) */
|
|
91
|
+
getMuteState(gid: string): Promise<ApiResult<MuteState>>;
|
|
92
|
+
/** 获取群基本信息(群名/人数等; 11255=群不存在或已注销, 用于注册表有效性校验与显示群名) */
|
|
93
|
+
getGroupInfo(gid: string): Promise<ApiResult<{
|
|
94
|
+
group_openid?: string;
|
|
95
|
+
group_name?: string;
|
|
96
|
+
group_finger_memo?: string;
|
|
97
|
+
group_class_text?: string;
|
|
98
|
+
group_tags?: string[];
|
|
99
|
+
group_member_num?: number;
|
|
100
|
+
}>>;
|
|
101
|
+
/**
|
|
102
|
+
* 设置群成员禁言(🟡 群管理员; 单次≤20 人; 只能操作普通成员, 不能禁群主/管理员/机器人; 最长 30 天)
|
|
103
|
+
* @param memberOpenid 目标成员
|
|
104
|
+
* @param muteExpireAt RFC3339 到期时间(如 '2026-08-05T11:23:05+08:00'); 传 null = 立即解除禁言(del)
|
|
105
|
+
*/
|
|
106
|
+
setMemberMute(gid: string, memberOpenid: string, muteExpireAt: string | null): Promise<ApiResult<Record<string, never>>>;
|
|
107
|
+
}
|
|
108
|
+
/** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
|
|
109
|
+
export declare function createGroupAdmin(opts: GroupAdminOptions): GroupAdminClient;
|
|
110
|
+
/** 取本 bot 的群注册表路径(事件累积+绑群, UI 选群用) */
|
|
111
|
+
export declare function groupRegistryPath(cwd: string | undefined): string;
|
|
112
|
+
//# sourceMappingURL=group-admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-admin.d.ts","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* group-admin.ts — QQ 普通群管理 API 客户端(2026-09-05, 设计见 参考文档/群管理实现设计.md)
|
|
3
|
+
*
|
|
4
|
+
* 背景: QQ 官方 api-v2 已发布"群聊管理"接口, 但开放度分档(2026-09-05 官方社区核实):
|
|
5
|
+
* 🔴 未开放(内邀中): 成员列表 / 批量移除(踢人) —— 调用会得到 11253(仅白名单/未开放);
|
|
6
|
+
* 🟡 门槛=机器人是群管理员(文档未标内邀): 入群申请列表/审批、群禁言查询/设置 —— 先行实现。
|
|
7
|
+
* SDK(@tencent-connect/qqbot-nodejs) 未封装这些接口 → 本文件自建 REST 层;
|
|
8
|
+
* token 走官方 https://bots.qq.com/app/getAppAccessToken, 内置 per-appId 缓存+并发单飞(不依赖 SDK)。
|
|
9
|
+
*
|
|
10
|
+
* 统一返回: { ok:true, data } | { ok:false, err:{ code, human } }
|
|
11
|
+
* code = 官方错误码或 FEATURE_NOT_OPEN; human = 面向用户的一句话(人话), UI/工具直接展示。
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ 本地手改功能: 同步纪律同 middleware-setup(改完保持 src 与部署 dist 一致)。
|
|
14
|
+
*/
|
|
15
|
+
import { appendFileSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
/** 官方 access_token 端点(与 SDK token.ts 同源) */
|
|
18
|
+
const TOKEN_URL = 'https://bots.qq.com/app/getAppAccessToken';
|
|
19
|
+
const API_BASE = 'https://api.bot.qq.com';
|
|
20
|
+
/** 已知官方未开放(内邀中)的能力门控元数据 —— UI 据此渲染红条/灰态; 开放后删除对应项即可点亮 */
|
|
21
|
+
export const FEATURE_GATES = {
|
|
22
|
+
listMembers: { open: false, human: '获取群成员列表: 官方尚未开放(内邀中), 等待公测后自动可用' },
|
|
23
|
+
removeMembers: { open: false, human: '踢人: 官方尚未开放(社区 2026-09-05 确认"暂时未开放权限"), 开放后自动可用' },
|
|
24
|
+
listJoinRequests: { open: true, human: '入群申请列表: 机器人需为群管理员' },
|
|
25
|
+
approveJoinRequest: { open: true, human: '入群申请审批: 机器人需为群管理员' },
|
|
26
|
+
getMuteState: { open: true, human: '群禁言状态查询: 机器人需为群管理员' },
|
|
27
|
+
setMute: { open: true, human: '设置禁言: 机器人需为群管理员' },
|
|
28
|
+
};
|
|
29
|
+
/** 官方错误码 → 人话(可扩充; code 映射不到时回落通用文案) */
|
|
30
|
+
export function mapErrHuman(code, gateHuman) {
|
|
31
|
+
const c = String(code);
|
|
32
|
+
const table = {
|
|
33
|
+
'11253': gateHuman || '该能力官方尚未开放/未授权(内邀中或需白名单), 请联系平台运营',
|
|
34
|
+
'11703': gateHuman || '机器人无该接口权限: 需为该群管理员, 或该能力尚未对应用开放(探针实测 2026-09-05)',
|
|
35
|
+
'40103004': '不能操作该成员: 群主/管理员/机器人不可被禁言(只能禁普通成员)',
|
|
36
|
+
'11202': '接口调用异常, 请稍后重试',
|
|
37
|
+
'11201': '机器人不在该群或参数错误',
|
|
38
|
+
'40101': '频控: 请求太快, 稍等再试',
|
|
39
|
+
'403': '机器人缺少群管理员身份或未授权',
|
|
40
|
+
'401': '访问凭证无效, 请刷新后重试',
|
|
41
|
+
};
|
|
42
|
+
return table[c] ?? table[String(Number(c))] ?? `调用失败(错误码 ${c}), 请稍后重试`;
|
|
43
|
+
}
|
|
44
|
+
/** per-appId token 缓存(带过期提前刷新与并发单飞) */
|
|
45
|
+
class TokenCache {
|
|
46
|
+
cache = new Map();
|
|
47
|
+
inflight = new Map();
|
|
48
|
+
async get(appId, appSecret) {
|
|
49
|
+
const hit = this.cache.get(appId);
|
|
50
|
+
if (hit && Date.now() < hit.expireAt - 30_000)
|
|
51
|
+
return hit.token;
|
|
52
|
+
let p = this.inflight.get(appId);
|
|
53
|
+
if (!p) {
|
|
54
|
+
p = (async () => {
|
|
55
|
+
const res = await fetch(TOKEN_URL, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'content-type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ appId, clientSecret: appSecret }),
|
|
59
|
+
});
|
|
60
|
+
const j = (await res.json());
|
|
61
|
+
if (!j.access_token) {
|
|
62
|
+
throw new Error(`getAppAccessToken 失败: ${j.code ?? res.status} ${j.message ?? ''}`);
|
|
63
|
+
}
|
|
64
|
+
this.cache.set(appId, { token: j.access_token, expireAt: Date.now() + (j.expires_in ?? 7200) * 1000 });
|
|
65
|
+
return j.access_token;
|
|
66
|
+
})().finally(() => this.inflight.delete(appId));
|
|
67
|
+
this.inflight.set(appId, p);
|
|
68
|
+
}
|
|
69
|
+
return p;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** 本实例诊断日志(与 channel-tools 同款: 设 QQBOT_DIAG_FILE 才写) */
|
|
73
|
+
const DIAG = process.env.QQBOT_DIAG_FILE || '';
|
|
74
|
+
function diag(line) {
|
|
75
|
+
if (!DIAG)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
appendFileSync(DIAG, `${new Date().toISOString()} ${line}\n`);
|
|
79
|
+
}
|
|
80
|
+
catch { /* ignore */ }
|
|
81
|
+
}
|
|
82
|
+
export class GroupAdminClient {
|
|
83
|
+
opts;
|
|
84
|
+
tokens = new TokenCache();
|
|
85
|
+
gates;
|
|
86
|
+
constructor(opts) {
|
|
87
|
+
this.opts = opts;
|
|
88
|
+
this.gates = Object.fromEntries(Object.entries(FEATURE_GATES).map(([k, v]) => [k, opts.featureOverrides?.[k] ?? v.open]));
|
|
89
|
+
}
|
|
90
|
+
gate(name) {
|
|
91
|
+
if (this.gates[name] !== false)
|
|
92
|
+
return null;
|
|
93
|
+
const g = FEATURE_GATES[name];
|
|
94
|
+
return { ok: false, err: { code: 'FEATURE_NOT_OPEN', human: g?.human ?? '该能力官方尚未开放, 等待公测' } };
|
|
95
|
+
}
|
|
96
|
+
async call(method, path, body) {
|
|
97
|
+
const token = await this.tokens.get(this.opts.appId, this.opts.appSecret);
|
|
98
|
+
const res = await fetch(`${API_BASE}${path}`, {
|
|
99
|
+
method,
|
|
100
|
+
headers: {
|
|
101
|
+
authorization: `QQBot ${token}`,
|
|
102
|
+
'content-type': 'application/json',
|
|
103
|
+
},
|
|
104
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
105
|
+
});
|
|
106
|
+
const j = (await res.json().catch(() => ({})));
|
|
107
|
+
diag(`[group-admin] ${method} ${path} → ${res.status} code=${j.code ?? '-'} ${res.ok ? 'ok' : j.message ?? ''}`);
|
|
108
|
+
if (res.ok && (j.code === undefined || j.code === 0)) {
|
|
109
|
+
return { ok: true, data: (j.data ?? j) };
|
|
110
|
+
}
|
|
111
|
+
const code = String(j.code ?? res.status);
|
|
112
|
+
return { ok: false, err: { code, human: mapErrHuman(code) } };
|
|
113
|
+
}
|
|
114
|
+
/** 获取群成员列表(🔴 未开放, 完整实现保留, 开放即用) */
|
|
115
|
+
async listMembers(gid, cursor = '') {
|
|
116
|
+
const blocked = this.gate('listMembers');
|
|
117
|
+
if (blocked)
|
|
118
|
+
return blocked;
|
|
119
|
+
const q = cursor ? `?cursor=${encodeURIComponent(cursor)}` : '';
|
|
120
|
+
return this.call('GET', `/v2/groups/${encodeURIComponent(gid)}/members${q}`);
|
|
121
|
+
}
|
|
122
|
+
/** 批量移除成员(踢人, 🔴 未开放) */
|
|
123
|
+
async removeMembers(gid, memberOpenids, addToBlacklist = false) {
|
|
124
|
+
const blocked = this.gate('removeMembers');
|
|
125
|
+
if (blocked)
|
|
126
|
+
return blocked;
|
|
127
|
+
return this.call('POST', `/v2/groups/${encodeURIComponent(gid)}/batch_remove_members`, {
|
|
128
|
+
member_openids: memberOpenids,
|
|
129
|
+
add_to_member_blacklist: addToBlacklist,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/** 入群申请列表(🟡 群管理员) */
|
|
133
|
+
async listJoinRequests(gid, cursor = '', limit = 20) {
|
|
134
|
+
const q = new URLSearchParams();
|
|
135
|
+
if (cursor)
|
|
136
|
+
q.set('cursor', cursor);
|
|
137
|
+
if (limit && limit !== 20)
|
|
138
|
+
q.set('limit', String(limit));
|
|
139
|
+
const qs = q.toString() ? `?${q}` : '';
|
|
140
|
+
return this.call('GET', `/v2/groups/${encodeURIComponent(gid)}/join_request_list${qs}`);
|
|
141
|
+
}
|
|
142
|
+
/** 审批入群申请(🟡 群管理员; op: approve | decline) */
|
|
143
|
+
async approveJoinRequest(gid, memberOpenid, op, opts) {
|
|
144
|
+
return this.call('POST', `/v2/groups/${encodeURIComponent(gid)}/approval_join_request/${encodeURIComponent(memberOpenid)}`, {
|
|
145
|
+
op,
|
|
146
|
+
...(opts?.join_request_id ? { join_request_id: opts.join_request_id } : {}),
|
|
147
|
+
...(op === 'decline' && opts?.reject_reason ? { reject_reason: opts.reject_reason } : {}),
|
|
148
|
+
...(opts?.add_to_blacklist ? { add_to_member_blacklist: true } : {}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** 查询群禁言状态(🟡 群管理员) */
|
|
152
|
+
async getMuteState(gid) {
|
|
153
|
+
return this.call('GET', `/v2/groups/${encodeURIComponent(gid)}/restrict_chat_setting`);
|
|
154
|
+
}
|
|
155
|
+
/** 获取群基本信息(群名/人数等; 11255=群不存在或已注销, 用于注册表有效性校验与显示群名) */
|
|
156
|
+
async getGroupInfo(gid) {
|
|
157
|
+
return this.call('GET', `/v2/groups/${encodeURIComponent(gid)}/info`);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 设置群成员禁言(🟡 群管理员; 单次≤20 人; 只能操作普通成员, 不能禁群主/管理员/机器人; 最长 30 天)
|
|
161
|
+
* @param memberOpenid 目标成员
|
|
162
|
+
* @param muteExpireAt RFC3339 到期时间(如 '2026-08-05T11:23:05+08:00'); 传 null = 立即解除禁言(del)
|
|
163
|
+
*/
|
|
164
|
+
async setMemberMute(gid, memberOpenid, muteExpireAt) {
|
|
165
|
+
const members = muteExpireAt
|
|
166
|
+
? [{ op: 'add', member_openid: memberOpenid, mute_expire_at: muteExpireAt }]
|
|
167
|
+
: [{ op: 'del', member_openid: memberOpenid, mute_expire_at: '' }];
|
|
168
|
+
return this.call('POST', `/v2/groups/${encodeURIComponent(gid)}/restrict_chat_setting`, { members });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** 工厂: 每实例一个 client(配置来自各 bot config.appId/appSecret) */
|
|
172
|
+
export function createGroupAdmin(opts) {
|
|
173
|
+
return new GroupAdminClient(opts);
|
|
174
|
+
}
|
|
175
|
+
/** 取本 bot 的群注册表路径(事件累积+绑群, UI 选群用) */
|
|
176
|
+
export function groupRegistryPath(cwd) {
|
|
177
|
+
return join(cwd || process.cwd(), '.qqbot', 'groups.json');
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=group-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-admin.js","sourceRoot":"","sources":["../../src/api/group-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { SessionManager } from './session/session-manager.js';
|
|
3
|
+
import type { QQBotSender } from './transport/outbound-buffer.js';
|
|
4
|
+
/** qqChannel service 形状:由 dsh-qqbot 在 QQ 会话 ctx 上 provide */
|
|
5
|
+
export interface QQChannel {
|
|
6
|
+
manager: SessionManager;
|
|
7
|
+
sender: QQBotSender;
|
|
8
|
+
}
|
|
9
|
+
export declare const name = "qqbot-channel-tools";
|
|
10
|
+
export declare const inject: string[];
|
|
11
|
+
export declare function setChannelBridge(b: QQChannel | undefined): void;
|
|
12
|
+
/** 装载本插件时把 qqChannel 一并注入(由 dsh-qqbot setup 提供) */
|
|
13
|
+
export declare function apply(ctx: Context): void;
|
|
14
|
+
//# sourceMappingURL=channel-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-tools.d.ts","sourceRoot":"","sources":["../src/channel-tools.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAalE,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAC1C,eAAO,MAAM,MAAM,UAAY,CAAC;AAShC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAI/D;AAqED,mDAAmD;AACnD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAstBxC"}
|