@zhin.js/plugin-group-daily-analysis 0.0.2

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/lib/index.js ADDED
@@ -0,0 +1,368 @@
1
+ /**
2
+ * @zhin.js/plugin-group-daily-analysis
3
+ *
4
+ * 群日常分析插件:基于 zhin 内置收件箱(unified_inbox_message)做群聊统计与可选 LLM 分析。
5
+ * 功能灵感与参考:https://github.com/SXP-Simon/astrbot_plugin_qq_group_daily_analysis
6
+ * 另见:https://github.com/LSTM-Kirigaya/openmcp-tutorial/tree/main/qq-group-summary
7
+ *
8
+ * 依赖:主配置中启用 inbox.enabled 与 database。
9
+ * 命令:/群分析 [天数]、/分析设置 enable|disable|status
10
+ */
11
+ import { usePlugin, MessageCommand, Schema, Cron, segment } from "zhin.js";
12
+ import { computeBasicStats, formatTextReport, appendLLMReport, parseLLMResponse, extractText, } from "./analysis.js";
13
+ const plugin = usePlugin();
14
+ const { logger, root, addCommand, useContext, addCron, onDispose, declareConfig, } = plugin;
15
+ const INBOX_TABLE = "unified_inbox_message";
16
+ const SETTINGS_TABLE = "group_daily_analysis_settings";
17
+ // ─── 配置 ─────────────────────────────────────────────────────────────────────
18
+ const config = declareConfig("group-daily-analysis", Schema.object({
19
+ analysisDays: Schema.number()
20
+ .default(1)
21
+ .min(1)
22
+ .max(30)
23
+ .description("默认分析最近天数"),
24
+ autoAnalysisEnabled: Schema.boolean()
25
+ .default(false)
26
+ .description("是否启用定时自动分析"),
27
+ autoAnalysisCron: Schema.string()
28
+ .default("0 9 * * *")
29
+ .description("每日分析 Cron(默认每天 9 点)"),
30
+ enabledGroups: Schema.list(Schema.string())
31
+ .default([])
32
+ .description("启用分析的群 ID 白名单(空表示不限制)"),
33
+ disabledGroups: Schema.list(Schema.string())
34
+ .default([])
35
+ .description("禁用分析的群 ID 黑名单"),
36
+ outputFormat: Schema.string()
37
+ .default("text")
38
+ .description("报告输出格式:text 或 image(需 html-renderer)"),
39
+ maxMessagesPerAnalysis: Schema.number()
40
+ .default(500)
41
+ .min(100)
42
+ .max(5000)
43
+ .description("单次分析使用的最大消息条数"),
44
+ }));
45
+ // ─── 数据库与收件箱 ───────────────────────────────────────────────────────────
46
+ let _db = null;
47
+ let _settingsModel = null;
48
+ function getInboxModel() {
49
+ if (!_db) {
50
+ const database = root.inject("database");
51
+ if (database)
52
+ _db = database;
53
+ }
54
+ return _db?.models?.get(INBOX_TABLE) ?? null;
55
+ }
56
+ function getSettingsModel() {
57
+ return _db?.models?.get(SETTINGS_TABLE) ?? null;
58
+ }
59
+ function getChannelFromMessage(message) {
60
+ const ch = message?.$channel;
61
+ if (!ch?.id)
62
+ return null;
63
+ return {
64
+ channelId: String(ch.id),
65
+ channelType: String(ch.type || "private"),
66
+ adapter: message?.$adapter,
67
+ botId: message?.$bot,
68
+ };
69
+ }
70
+ useContext("database", (db) => {
71
+ _db = db;
72
+ // 收件箱表由主包在 inbox.enabled 时注册,此处仅只读使用
73
+ const inboxModel = db.models?.get(INBOX_TABLE);
74
+ if (!inboxModel) {
75
+ logger.warn("[group-daily-analysis] 未检测到收件箱表,请在主配置中启用 inbox.enabled 与 database");
76
+ }
77
+ // 本插件仅新增:群分析开关表(用于 /分析设置)
78
+ if (typeof db.define === "function") {
79
+ db.define(SETTINGS_TABLE, {
80
+ id: { type: "integer", primary: true, autoIncrement: true },
81
+ channel_id: { type: "text", nullable: false },
82
+ channel_type: { type: "text", nullable: false },
83
+ adapter: { type: "text", default: "" },
84
+ bot_id: { type: "text", default: "" },
85
+ enabled: { type: "integer", default: 1 },
86
+ updated_at: { type: "text", default: "" },
87
+ });
88
+ logger.info("[group-daily-analysis] 分析设置表已注册");
89
+ }
90
+ });
91
+ // ─── 群组是否参与分析(白名单/黑名单 + 分析设置)──────────────────────────────
92
+ function isGroupInList(groupId, list) {
93
+ return list.some((id) => id === groupId || id === String(groupId));
94
+ }
95
+ async function isAnalysisEnabledForChannel(channelId, channelType, adapter) {
96
+ if (channelType !== "group")
97
+ return false;
98
+ if (config.disabledGroups.length > 0 && isGroupInList(channelId, config.disabledGroups))
99
+ return false;
100
+ if (config.enabledGroups.length > 0 && !isGroupInList(channelId, config.enabledGroups))
101
+ return false;
102
+ const Settings = getSettingsModel();
103
+ if (!Settings)
104
+ return true;
105
+ try {
106
+ const rows = await Settings.select().where({
107
+ channel_id: channelId,
108
+ channel_type: channelType,
109
+ adapter: adapter || "",
110
+ });
111
+ if (rows.length === 0)
112
+ return true;
113
+ return (rows[0].enabled ?? 1) === 1;
114
+ }
115
+ catch {
116
+ return true;
117
+ }
118
+ }
119
+ async function setAnalysisEnabledForChannel(channelId, channelType, adapter, botId, enabled) {
120
+ const Settings = getSettingsModel();
121
+ if (!Settings)
122
+ return;
123
+ const ts = new Date().toISOString();
124
+ const rows = await Settings.select().where({
125
+ channel_id: channelId,
126
+ channel_type: channelType,
127
+ adapter: adapter || "",
128
+ });
129
+ if (rows.length > 0) {
130
+ await Settings.update({
131
+ enabled: enabled ? 1 : 0,
132
+ updated_at: ts,
133
+ bot_id: botId || rows[0].bot_id || "",
134
+ }).where({ id: rows[0].id });
135
+ }
136
+ else {
137
+ await Settings.insert({
138
+ channel_id: channelId,
139
+ channel_type: channelType,
140
+ adapter: adapter || "",
141
+ bot_id: botId || "",
142
+ enabled: enabled ? 1 : 0,
143
+ updated_at: ts,
144
+ });
145
+ }
146
+ }
147
+ // ─── 从收件箱查询消息并执行分析 ─────────────────────────────────────────────────
148
+ function getTimeRangeDays(days) {
149
+ const end = Date.now();
150
+ const start = end - days * 24 * 60 * 60 * 1000;
151
+ const dStart = new Date(start);
152
+ const dEnd = new Date(end);
153
+ const fmt = (d) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
154
+ return { start, end, startStr: fmt(dStart), endStr: fmt(dEnd) };
155
+ }
156
+ async function queryInboxMessages(channelId, adapter, botId, startTs, endTs, limit) {
157
+ const Inbox = getInboxModel();
158
+ if (!Inbox)
159
+ return [];
160
+ try {
161
+ let rows;
162
+ try {
163
+ rows = await Inbox.select()
164
+ .where({
165
+ channel_id: channelId,
166
+ channel_type: "group",
167
+ adapter: adapter || "",
168
+ bot_id: botId || "",
169
+ created_at: { $gte: startTs, $lte: endTs },
170
+ })
171
+ .orderBy("created_at", "ASC")
172
+ .limit(limit);
173
+ }
174
+ catch {
175
+ rows = await Inbox.select()
176
+ .where({ channel_id: channelId, channel_type: "group", adapter: adapter || "", bot_id: botId || "" });
177
+ rows = (rows || [])
178
+ .filter((r) => r.created_at >= startTs && r.created_at <= endTs)
179
+ .sort((a, b) => a.created_at - b.created_at)
180
+ .slice(0, limit);
181
+ }
182
+ return rows;
183
+ }
184
+ catch (e) {
185
+ logger.warn("[group-daily-analysis] 查询收件箱失败", e?.message);
186
+ return [];
187
+ }
188
+ }
189
+ async function runAnalysis(channelId, channelName, adapter, botId, days) {
190
+ const Inbox = getInboxModel();
191
+ if (!Inbox) {
192
+ return "请先在配置中启用 inbox.enabled 并配置 database,以使用群日常分析。";
193
+ }
194
+ const { start, end, startStr, endStr } = getTimeRangeDays(days);
195
+ const rows = await queryInboxMessages(channelId, adapter, botId, start, end, config.maxMessagesPerAnalysis);
196
+ if (rows.length === 0) {
197
+ return `在 ${startStr} 至 ${endStr} 区间内没有找到本群消息记录,请确认收件箱已启用并有过群消息。`;
198
+ }
199
+ const stats = computeBasicStats(rows);
200
+ let textReport = formatTextReport(stats, {
201
+ channelName: channelName || undefined,
202
+ days,
203
+ startDate: startStr,
204
+ endDate: endStr,
205
+ });
206
+ // 可选:LLM 话题/金句/用户画像(灵感来自 astrbot_plugin_qq_group_daily_analysis)
207
+ const ai = root.inject("ai");
208
+ if (ai?.ask) {
209
+ try {
210
+ const sampleSize = Math.min(rows.length, 150);
211
+ const sample = rows.slice(-sampleSize);
212
+ const conversation = sample
213
+ .map((r) => `[${r.sender_name || r.sender_id}]: ${extractText(r).slice(0, 200)}`)
214
+ .join("\n");
215
+ const systemPrompt = `你是一个群聊分析助手。根据下面的群聊消息摘要,提取并仅返回一个 JSON 对象,包含以下三个数组(均为中文):
216
+ - topics: 数组,每项 { "topic": "话题关键词", "summary": "简短说明" }
217
+ - quotes: 数组,每项 { "content": "金句原文", "sender": "发言人", "reason": "入选理由" },最多 5 条
218
+ - user_titles: 数组,每项 { "name": "昵称", "user_id": "id", "title": "称号/画像", "reason": "理由" },最多 8 人
219
+ 不要输出除 JSON 以外的内容。`;
220
+ const answer = await ai.ask(`请分析以下群聊片段并返回 JSON:\n\n${conversation.slice(0, 6000)}`, { systemPrompt });
221
+ if (answer && answer.trim()) {
222
+ const llm = parseLLMResponse(answer);
223
+ if (llm.topics?.length || llm.quotes?.length || llm.userTitles?.length) {
224
+ textReport = appendLLMReport(textReport, llm);
225
+ }
226
+ }
227
+ }
228
+ catch (e) {
229
+ logger.debug("[group-daily-analysis] LLM 分析跳过", e?.message);
230
+ }
231
+ }
232
+ return { stats, textReport };
233
+ }
234
+ // ─── 命令:群分析 ─────────────────────────────────────────────────────────────
235
+ addCommand(new MessageCommand("群分析 [天数:number]")
236
+ .desc("群日常分析", "分析本群近期消息统计(依赖收件箱)")
237
+ .action(async (message, result) => {
238
+ const ch = getChannelFromMessage(message);
239
+ if (!ch || ch.channelType !== "group") {
240
+ return "请在群聊中使用本命令。";
241
+ }
242
+ const days = Math.min(30, Math.max(1, Number(result.params?.天数) || config.analysisDays));
243
+ const channelName = message?.$channel?.name || "";
244
+ const report = await runAnalysis(ch.channelId, channelName, ch.adapter || "", ch.botId || "", days);
245
+ if (typeof report === "string")
246
+ return report;
247
+ if (config.outputFormat === "image") {
248
+ const renderer = root.inject("html-renderer");
249
+ if (renderer) {
250
+ try {
251
+ const escaped = report.textReport
252
+ .replace(/&/g, "&amp;")
253
+ .replace(/</g, "&lt;")
254
+ .replace(/>/g, "&gt;")
255
+ .replace(/\n/g, "<br/>");
256
+ const html = `<div style="padding:20px;font-size:14px;line-height:1.5;white-space:pre-wrap;background:#fafafa;border-radius:8px;">${escaped}</div>`;
257
+ const resultImg = await renderer.render(html);
258
+ const base64 = resultImg.data.toString("base64");
259
+ const dataUrl = `base64://${base64}`;
260
+ return [segment("image", { url: dataUrl, name: "group-daily-analysis.png" })];
261
+ }
262
+ catch (e) {
263
+ logger.debug("[group-daily-analysis] 图片渲染失败,回退文本", e?.message);
264
+ }
265
+ }
266
+ }
267
+ return report.textReport;
268
+ }));
269
+ // ─── 命令:分析设置 ───────────────────────────────────────────────────────────
270
+ addCommand(new MessageCommand("分析设置 [操作:text]")
271
+ .desc("分析设置", "enable=启用本群分析 / disable=禁用 / status=查看状态")
272
+ .action(async (message, result) => {
273
+ const ch = getChannelFromMessage(message);
274
+ if (!ch || ch.channelType !== "group") {
275
+ return "请在群聊中使用本命令。";
276
+ }
277
+ const op = (result.params?.操作 || "status").trim().toLowerCase();
278
+ const adapter = ch.adapter || "";
279
+ const botId = ch.botId || "";
280
+ if (op === "enable") {
281
+ await setAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter, botId, true);
282
+ return "已为本群启用日常分析。";
283
+ }
284
+ if (op === "disable") {
285
+ await setAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter, botId, false);
286
+ return "已为本群关闭日常分析。";
287
+ }
288
+ if (op === "status") {
289
+ const enabled = await isAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter);
290
+ return `本群日常分析:${enabled ? "已启用" : "已关闭"}`;
291
+ }
292
+ return "用法:分析设置 enable | disable | status";
293
+ }));
294
+ // ─── 定时任务(可选)───────────────────────────────────────────────────────────
295
+ let cronDispose = null;
296
+ useContext("database", () => {
297
+ if (!config.autoAnalysisEnabled || cronDispose)
298
+ return;
299
+ if (typeof addCron !== "function")
300
+ return;
301
+ try {
302
+ cronDispose = addCron(new Cron(config.autoAnalysisCron, async () => {
303
+ const inject = root.inject?.bind(root);
304
+ if (typeof inject !== "function")
305
+ return;
306
+ const targets = [];
307
+ const Settings = getSettingsModel();
308
+ if (Settings) {
309
+ const rows = await Settings.select().where({ channel_type: "group", enabled: 1 });
310
+ for (const r of rows) {
311
+ if (r.channel_id && r.adapter)
312
+ targets.push({
313
+ channelId: String(r.channel_id),
314
+ adapter: String(r.adapter),
315
+ botId: String(r.bot_id || ""),
316
+ });
317
+ }
318
+ }
319
+ for (const gid of config.enabledGroups) {
320
+ if (targets.some((t) => t.channelId === gid))
321
+ continue;
322
+ const adapters = root.adapters;
323
+ const adapterName = Array.isArray(adapters) && adapters[0] ? adapters[0] : "";
324
+ if (adapterName)
325
+ targets.push({ channelId: String(gid), adapter: adapterName, botId: "" });
326
+ }
327
+ for (const t of targets) {
328
+ if (config.disabledGroups.length && isGroupInList(t.channelId, config.disabledGroups))
329
+ continue;
330
+ try {
331
+ const report = await runAnalysis(t.channelId, "", t.adapter, t.botId, config.analysisDays);
332
+ if (typeof report === "string")
333
+ continue;
334
+ const adapter = inject(t.adapter);
335
+ if (adapter?.sendMessage) {
336
+ let botId = t.botId;
337
+ if (!botId && adapter.bots?.size) {
338
+ const first = adapter.bots.values().next().value;
339
+ botId = first?.$id ?? first?.selfId ?? "";
340
+ }
341
+ await adapter.sendMessage({
342
+ context: t.adapter,
343
+ bot: botId,
344
+ type: "group",
345
+ id: t.channelId,
346
+ content: report.textReport,
347
+ }).catch(() => { });
348
+ }
349
+ }
350
+ catch (e) {
351
+ logger.warn("[group-daily-analysis] 定时分析发送失败", t.channelId, e?.message);
352
+ }
353
+ }
354
+ }));
355
+ logger.info("[group-daily-analysis] 定时分析已注册: " + config.autoAnalysisCron);
356
+ }
357
+ catch (e) {
358
+ logger.warn("[group-daily-analysis] 注册定时任务失败", e?.message);
359
+ }
360
+ });
361
+ onDispose(() => {
362
+ if (cronDispose) {
363
+ cronDispose();
364
+ cronDispose = null;
365
+ }
366
+ });
367
+ logger.info(`[group-daily-analysis] 已加载 (分析天数=${config.analysisDays}, 定时=${config.autoAnalysisEnabled ? config.autoAnalysisCron : "关"})`);
368
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@zhin.js/plugin-group-daily-analysis",
3
+ "version": "0.0.2",
4
+ "description": "Group daily analysis plugin for Zhin.js — stats, LLM topics/quotes/user titles, reuse unified inbox",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "types": "./lib/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "development": "./src/index.ts",
12
+ "import": "./lib/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "src",
18
+ "lib",
19
+ "client",
20
+ "dist",
21
+ "skills",
22
+ "README.md"
23
+ ],
24
+ "keywords": [
25
+ "zhin",
26
+ "bot",
27
+ "plugin",
28
+ "group",
29
+ "daily",
30
+ "analysis",
31
+ "stats",
32
+ "inbox"
33
+ ],
34
+ "author": {
35
+ "name": "lc-cn",
36
+ "email": "admin@liucl.cn",
37
+ "url": "https://github.com/lc-cn"
38
+ },
39
+ "license": "MIT",
40
+ "dependencies": {},
41
+ "devDependencies": {
42
+ "typescript": "^5.3.3",
43
+ "@zhin.js/plugin-html-renderer": "0.0.31",
44
+ "zhin.js": "1.0.52"
45
+ },
46
+ "peerDependencies": {
47
+ "@zhin.js/plugin-html-renderer": "0.0.31",
48
+ "zhin.js": "1.0.52"
49
+ },
50
+ "peerDependenciesMeta": {
51
+ "@zhin.js/plugin-html-renderer": {
52
+ "optional": true
53
+ }
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/zhinjs/zhin.git",
58
+ "directory": "plugins/utils/group-daily-analysis"
59
+ },
60
+ "publishConfig": {
61
+ "access": "public",
62
+ "registry": "https://registry.npmjs.org"
63
+ },
64
+ "scripts": {
65
+ "build": "tsc --build",
66
+ "clean": "rimraf lib"
67
+ }
68
+ }
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: group-daily-analysis
3
+ description: 群日常分析:基于收件箱统计群消息、参与人数、活跃时段,支持按群启用/禁用与定时报告。
4
+ keywords:
5
+ - 群分析
6
+ - 日常分析
7
+ - 群统计
8
+ - 分析设置
9
+ tags:
10
+ - group
11
+ - analysis
12
+ - stats
13
+ - inbox
14
+ tools: []
15
+ ---
16
+
17
+ ## 执行规则
18
+
19
+ - 依赖收件箱与定时任务配置;使用插件内命令与工具进行分析与设置。