@zhin.js/plugin-group-suite 1.0.1 → 1.1.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.
Files changed (135) hide show
  1. package/README.md +42 -58
  2. package/agent/tools/group_announce.ts +12 -0
  3. package/commands/checkin.js +11 -0
  4. package/commands/checkin.ts +12 -0
  5. package/commands/forget.js +10 -0
  6. package/commands/forget.ts +12 -0
  7. package/commands/keyword-add/[keyword].js +16 -0
  8. package/commands/keyword-add/[keyword].ts +16 -0
  9. package/commands/keyword-list.js +14 -0
  10. package/commands/keyword-list.ts +14 -0
  11. package/commands/keyword-remove/[keyword].js +16 -0
  12. package/commands/keyword-remove/[keyword].ts +15 -0
  13. package/commands/mypoints.js +10 -0
  14. package/commands/mypoints.ts +12 -0
  15. package/commands/mystats.js +10 -0
  16. package/commands/mystats.ts +12 -0
  17. package/commands/rank.js +11 -0
  18. package/commands/rank.ts +12 -0
  19. package/commands/stats-rank.js +13 -0
  20. package/commands/stats-rank.ts +20 -0
  21. package/commands/stats-week.js +13 -0
  22. package/commands/stats-week.ts +20 -0
  23. package/commands/stats.js +14 -0
  24. package/commands/stats.ts +21 -0
  25. package/commands/teach-list/[[page]].js +13 -0
  26. package/commands/teach-list/[[page]].ts +14 -0
  27. package/commands/teach-regex.js +11 -0
  28. package/commands/teach-regex.ts +12 -0
  29. package/commands/teach.js +11 -0
  30. package/commands/teach.ts +12 -0
  31. package/lib/checkin-lib.d.ts +27 -0
  32. package/lib/checkin-lib.d.ts.map +1 -0
  33. package/lib/checkin-lib.js +134 -0
  34. package/lib/checkin-lib.js.map +1 -0
  35. package/lib/config.d.ts +4 -57
  36. package/lib/config.d.ts.map +1 -1
  37. package/lib/config.js +18 -40
  38. package/lib/config.js.map +1 -1
  39. package/lib/db-store.d.ts +12 -0
  40. package/lib/db-store.d.ts.map +1 -0
  41. package/lib/db-store.js +38 -0
  42. package/lib/db-store.js.map +1 -0
  43. package/lib/index.d.ts +9 -1
  44. package/lib/index.d.ts.map +1 -1
  45. package/lib/index.js +7 -29
  46. package/lib/index.js.map +1 -1
  47. package/lib/keyword-store.d.ts +6 -0
  48. package/lib/keyword-store.d.ts.map +1 -0
  49. package/lib/keyword-store.js +21 -0
  50. package/lib/keyword-store.js.map +1 -0
  51. package/lib/memory-store.d.ts +31 -0
  52. package/lib/memory-store.d.ts.map +1 -0
  53. package/lib/memory-store.js +63 -0
  54. package/lib/memory-store.js.map +1 -0
  55. package/lib/runtime-state.d.ts +25 -0
  56. package/lib/runtime-state.d.ts.map +1 -0
  57. package/lib/runtime-state.js +21 -0
  58. package/lib/runtime-state.js.map +1 -0
  59. package/lib/shared-runtime.d.ts +26 -0
  60. package/lib/shared-runtime.d.ts.map +1 -0
  61. package/lib/shared-runtime.js +34 -0
  62. package/lib/shared-runtime.js.map +1 -0
  63. package/lib/stats-lib.d.ts +41 -0
  64. package/lib/stats-lib.d.ts.map +1 -0
  65. package/lib/stats-lib.js +177 -0
  66. package/lib/stats-lib.js.map +1 -0
  67. package/lib/tables.d.ts +4 -0
  68. package/lib/tables.d.ts.map +1 -0
  69. package/lib/tables.js +40 -0
  70. package/lib/tables.js.map +1 -0
  71. package/lib/teach-lib.d.ts +25 -0
  72. package/lib/teach-lib.d.ts.map +1 -0
  73. package/lib/teach-lib.js +233 -0
  74. package/lib/teach-lib.js.map +1 -0
  75. package/middlewares/keyword-reply.js +36 -0
  76. package/middlewares/keyword-reply.ts +37 -0
  77. package/middlewares/stats-count.js +20 -0
  78. package/middlewares/stats-count.ts +22 -0
  79. package/middlewares/teach-reply.js +21 -0
  80. package/middlewares/teach-reply.ts +22 -0
  81. package/package.json +53 -14
  82. package/plugin.js +40 -0
  83. package/schema.json +17 -0
  84. package/src/checkin-lib.ts +165 -0
  85. package/src/config.ts +23 -57
  86. package/src/db-store.ts +51 -0
  87. package/src/index.ts +47 -33
  88. package/src/keyword-store.ts +24 -0
  89. package/src/memory-store.ts +90 -0
  90. package/src/runtime-state.ts +44 -0
  91. package/src/shared-runtime.ts +44 -0
  92. package/src/stats-lib.ts +205 -0
  93. package/src/tables.ts +46 -0
  94. package/src/teach-lib.ts +301 -0
  95. package/tools/checkin-query/handler.js +22 -0
  96. package/tools/checkin-query/handler.ts +2 -2
  97. package/tools/checkin-rank/handler.js +15 -0
  98. package/tools/checkin-rank/handler.ts +1 -1
  99. package/tools/stats-query/handler.js +28 -0
  100. package/tools/stats-query/handler.ts +2 -2
  101. package/tools/stats-user/handler.js +29 -0
  102. package/tools/stats-user/handler.ts +3 -2
  103. package/lib/admin.d.ts +0 -4
  104. package/lib/admin.d.ts.map +0 -1
  105. package/lib/admin.js +0 -123
  106. package/lib/admin.js.map +0 -1
  107. package/lib/checkin.d.ts +0 -5
  108. package/lib/checkin.d.ts.map +0 -1
  109. package/lib/checkin.js +0 -168
  110. package/lib/checkin.js.map +0 -1
  111. package/lib/daily-analysis.d.ts +0 -7
  112. package/lib/daily-analysis.d.ts.map +0 -1
  113. package/lib/daily-analysis.js +0 -334
  114. package/lib/daily-analysis.js.map +0 -1
  115. package/lib/shared.d.ts +0 -25
  116. package/lib/shared.d.ts.map +0 -1
  117. package/lib/shared.js +0 -40
  118. package/lib/shared.js.map +0 -1
  119. package/lib/stats.d.ts +0 -12
  120. package/lib/stats.d.ts.map +0 -1
  121. package/lib/stats.js +0 -256
  122. package/lib/stats.js.map +0 -1
  123. package/lib/teach.d.ts +0 -4
  124. package/lib/teach.d.ts.map +0 -1
  125. package/lib/teach.js +0 -294
  126. package/lib/teach.js.map +0 -1
  127. package/plugin.yml +0 -3
  128. package/src/admin.ts +0 -145
  129. package/src/checkin.ts +0 -196
  130. package/src/daily-analysis.ts +0 -458
  131. package/src/shared.ts +0 -51
  132. package/src/stats.ts +0 -297
  133. package/src/teach.ts +0 -307
  134. /package/{skills/checkin/SKILL.md → agent/skills/checkin.md} +0 -0
  135. /package/{skills/group-daily-analysis/SKILL.md → agent/skills/group-daily-analysis.md} +0 -0
package/lib/checkin.js DELETED
@@ -1,168 +0,0 @@
1
- import { formatCompact, MessageCommand } from "zhin.js";
2
- import { getDatabase, getMessageContextKey, todayStr, ts } from "./shared.js";
3
- function yesterdayStr() {
4
- const d = new Date();
5
- d.setDate(d.getDate() - 1);
6
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
7
- }
8
- function randomInt(min, max) {
9
- return Math.floor(Math.random() * (max - min + 1)) + min;
10
- }
11
- let _db = null;
12
- export function getCheckinModel() {
13
- return _db?.models?.get("checkin_records") ?? null;
14
- }
15
- export function registerCheckin(plugin, cfg) {
16
- const { logger, addCommand, useContext } = plugin;
17
- useContext("database", (db) => {
18
- _db = db;
19
- db.define("checkin_records", {
20
- user_id: { type: "text", nullable: false },
21
- user_name: { type: "text", default: "" },
22
- points: { type: "integer", default: 0 },
23
- total_checkins: { type: "integer", default: 0 },
24
- streak: { type: "integer", default: 0 },
25
- max_streak: { type: "integer", default: 0 },
26
- last_checkin: { type: "text", default: "" },
27
- context_type: { type: "text", default: "global" },
28
- context_id: { type: "text", default: "" },
29
- created_at: { type: "text", default: "" },
30
- updated_at: { type: "text", default: "" },
31
- });
32
- logger.info(formatCompact({ 模块: "签到", 数据模型: "已就绪" }));
33
- });
34
- async function getOrCreateUser(model, userId, userName, ctxType, ctxId) {
35
- const rows = (await model.select().where({
36
- user_id: userId,
37
- context_type: ctxType,
38
- context_id: ctxId,
39
- }));
40
- if (rows.length > 0)
41
- return rows[0];
42
- await model.insert({
43
- user_id: userId,
44
- user_name: userName,
45
- points: 0,
46
- total_checkins: 0,
47
- streak: 0,
48
- max_streak: 0,
49
- last_checkin: "",
50
- context_type: ctxType,
51
- context_id: ctxId,
52
- created_at: ts(),
53
- updated_at: ts(),
54
- });
55
- const created = (await model.select().where({
56
- user_id: userId,
57
- context_type: ctxType,
58
- context_id: ctxId,
59
- }));
60
- return created[0] ?? null;
61
- }
62
- addCommand(new MessageCommand("checkin")
63
- .desc("签到", "每日签到获得积分")
64
- .action(async (message) => {
65
- const M = getCheckinModel();
66
- if (!M)
67
- return "签到数据库尚未就绪,请稍后重试";
68
- const userId = String(message.$sender?.id || "");
69
- const userName = String(message.$sender?.name || "用户");
70
- if (!userId)
71
- return "无法获取用户信息";
72
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
73
- const user = await getOrCreateUser(M, userId, userName, ctxType, ctxId);
74
- if (!user)
75
- return "签到失败,请重试";
76
- const today = todayStr();
77
- if (user.last_checkin === today) {
78
- return `你今天已经签到过了哦~\n当前积分: ${user.points}\n连续签到: ${user.streak} 天`;
79
- }
80
- const isConsecutive = user.last_checkin === yesterdayStr();
81
- const newStreak = isConsecutive ? Number(user.streak) + 1 : 1;
82
- const base = randomInt(cfg.basePointsMin, cfg.basePointsMax);
83
- const bonus = Math.min(newStreak * cfg.streakBonus, cfg.streakCap);
84
- const earned = base + bonus;
85
- const newPoints = Number(user.points || 0) + earned;
86
- await M.update({
87
- points: newPoints,
88
- total_checkins: Number(user.total_checkins || 0) + 1,
89
- streak: newStreak,
90
- max_streak: Math.max(Number(user.max_streak || 0), newStreak),
91
- last_checkin: today,
92
- user_name: userName,
93
- updated_at: ts(),
94
- }).where({
95
- user_id: userId,
96
- context_type: ctxType,
97
- context_id: ctxId,
98
- });
99
- const lines = [`签到成功!`, `基础积分: +${base}`];
100
- if (bonus > 0)
101
- lines.push(`连续奖励: +${bonus} (连续${newStreak}天)`);
102
- lines.push(`本次获得: +${earned}`, `当前积分: ${newPoints}`);
103
- return lines.join("\n");
104
- }));
105
- addCommand(new MessageCommand("mypoints")
106
- .desc("我的积分", "查看个人积分与签到信息")
107
- .action(async (message) => {
108
- const M = getCheckinModel();
109
- if (!M)
110
- return "签到数据库尚未就绪";
111
- const userId = String(message.$sender?.id || "");
112
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
113
- const rows = (await M.select().where({
114
- user_id: userId,
115
- context_type: ctxType,
116
- context_id: ctxId,
117
- }));
118
- if (rows.length === 0)
119
- return "你还没有签到记录哦,发送「签到」开始吧!";
120
- const u = rows[0];
121
- const checkedToday = u.last_checkin === todayStr();
122
- return [
123
- `${u.user_name || "用户"} 的积分信息`,
124
- `积分: ${u.points}`,
125
- `累计签到: ${u.total_checkins} 天`,
126
- `连续签到: ${u.streak} 天`,
127
- `最长连续: ${u.max_streak} 天`,
128
- checkedToday ? "今日已签到 ✓" : "今日未签到",
129
- ].join("\n");
130
- }));
131
- addCommand(new MessageCommand("rank")
132
- .desc("积分排行", "查看积分排行榜")
133
- .action(async (message) => {
134
- const M = getCheckinModel();
135
- if (!M)
136
- return "签到数据库尚未就绪";
137
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
138
- const all = (await M.select().where(ctxType === "global"
139
- ? { context_type: "global" }
140
- : { context_type: ctxType, context_id: ctxId }));
141
- if (all.length === 0)
142
- return "还没有人签到过哦~";
143
- const sorted = all.sort((a, b) => Number(b.points || 0) - Number(a.points || 0));
144
- const top = sorted.slice(0, cfg.rankSize);
145
- const medals = ["🥇", "🥈", "🥉"];
146
- const lines = top.map((u, i) => {
147
- const prefix = i < 3 ? medals[i] : `${i + 1}.`;
148
- return `${prefix} ${u.user_name || u.user_id} — ${u.points}分 (${u.total_checkins}天)`;
149
- });
150
- const title = ctxType === "group" ? "本群积分排行" : "全局积分排行";
151
- const userId = String(message.$sender?.id || "");
152
- const myRank = sorted.findIndex((u) => u.user_id === userId);
153
- const footer = myRank >= 0 ? `\n你的排名: 第${myRank + 1}名` : "";
154
- return `${title}\n${lines.join("\n")}${footer}`;
155
- }));
156
- if (!_db) {
157
- const db = getDatabase(plugin);
158
- if (db)
159
- _db = db;
160
- }
161
- logger.info(formatCompact({
162
- 模块: "签到",
163
- 状态: "已加载",
164
- 基础积分最小值: cfg.basePointsMin,
165
- 基础积分最大值: cfg.basePointsMax,
166
- }));
167
- }
168
- //# sourceMappingURL=checkin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkin.js","sourceRoot":"","sources":["../src/checkin.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * 群日常分析(group-suite 子模块)
3
- */
4
- import { type Plugin } from "zhin.js";
5
- import type { GroupSuiteConfig } from "./config.js";
6
- export declare function registerDailyAnalysis(plugin: Plugin, config: GroupSuiteConfig): void;
7
- //# sourceMappingURL=daily-analysis.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daily-analysis.d.ts","sourceRoot":"","sources":["../src/daily-analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAiBpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAgbN"}
@@ -1,334 +0,0 @@
1
- /**
2
- * 群日常分析(group-suite 子模块)
3
- */
4
- import { formatCompact, Cron, MessageCommand, segment } from "zhin.js";
5
- import { buildAnalysisReportData, computeBasicStats, formatTextReport, appendLLMReport, parseLLMResponse, extractText, } from "./analysis.js";
6
- import { buildAnalysisReportHtml, ANALYSIS_REPORT_CANVAS } from "./analysis-card.js";
7
- const INBOX_TABLE = "unified_inbox_message";
8
- const SETTINGS_TABLE = "group_daily_analysis_settings";
9
- export function registerDailyAnalysis(plugin, config) {
10
- const { logger, root, addCommand, useContext, addCron, onDispose } = plugin;
11
- // ─── 数据库与收件箱 ───────────────────────────────────────────────────────────
12
- let _db = null;
13
- let _settingsModel = null;
14
- function getInboxModel() {
15
- if (!_db) {
16
- const database = root.inject("database");
17
- if (database)
18
- _db = database;
19
- }
20
- return _db?.models?.get(INBOX_TABLE) ?? null;
21
- }
22
- function getSettingsModel() {
23
- return _db?.models?.get(SETTINGS_TABLE) ?? null;
24
- }
25
- function getChannelFromMessage(message) {
26
- const ch = message?.$channel;
27
- if (!ch?.id)
28
- return null;
29
- return {
30
- channelId: String(ch.id),
31
- channelType: String(ch.type || "private"),
32
- adapter: message?.$adapter,
33
- endpointId: message?.$endpoint,
34
- };
35
- }
36
- useContext("database", (db) => {
37
- _db = db;
38
- db.define(SETTINGS_TABLE, {
39
- id: { type: "integer", primary: true, autoIncrement: true },
40
- channel_id: { type: "text", nullable: false },
41
- channel_type: { type: "text", nullable: false },
42
- adapter: { type: "text", default: "" },
43
- endpoint_id: { type: "text", default: "" },
44
- enabled: { type: "integer", default: 1 },
45
- updated_at: { type: "text", default: "" },
46
- });
47
- });
48
- // ─── 群组是否参与分析(白名单/黑名单 + 分析设置)──────────────────────────────
49
- function isGroupInList(groupId, list) {
50
- return list.some((id) => id === groupId || id === String(groupId));
51
- }
52
- async function isAnalysisEnabledForChannel(channelId, channelType, adapter) {
53
- if (channelType !== "group")
54
- return false;
55
- if (config.analysisGroupsBlock.length > 0 &&
56
- isGroupInList(channelId, config.analysisGroupsBlock))
57
- return false;
58
- if (config.analysisGroups.length > 0 &&
59
- !isGroupInList(channelId, config.analysisGroups))
60
- return false;
61
- const Settings = getSettingsModel();
62
- if (!Settings)
63
- return true;
64
- try {
65
- const rows = await Settings.select().where({
66
- channel_id: channelId,
67
- channel_type: channelType,
68
- adapter: adapter || "",
69
- });
70
- if (rows.length === 0)
71
- return true;
72
- return (rows[0].enabled ?? 1) === 1;
73
- }
74
- catch {
75
- return true;
76
- }
77
- }
78
- async function setAnalysisEnabledForChannel(channelId, channelType, adapter, endpointId, enabled) {
79
- const Settings = getSettingsModel();
80
- if (!Settings)
81
- return;
82
- const ts = new Date().toISOString();
83
- const rows = await Settings.select().where({
84
- channel_id: channelId,
85
- channel_type: channelType,
86
- adapter: adapter || "",
87
- });
88
- if (rows.length > 0) {
89
- await Settings.update({
90
- enabled: enabled ? 1 : 0,
91
- updated_at: ts,
92
- endpoint_id: endpointId || rows[0].endpoint_id || "",
93
- }).where({ id: rows[0].id });
94
- }
95
- else {
96
- await Settings.insert({
97
- channel_id: channelId,
98
- channel_type: channelType,
99
- adapter: adapter || "",
100
- endpoint_id: endpointId || "",
101
- enabled: enabled ? 1 : 0,
102
- updated_at: ts,
103
- });
104
- }
105
- }
106
- // ─── 从收件箱查询消息并执行分析 ─────────────────────────────────────────────────
107
- function getTimeRangeDays(days) {
108
- const end = Date.now();
109
- const start = end - days * 24 * 60 * 60 * 1000;
110
- const dStart = new Date(start);
111
- const dEnd = new Date(end);
112
- const fmt = (d) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
113
- return { start, end, startStr: fmt(dStart), endStr: fmt(dEnd) };
114
- }
115
- async function queryInboxMessages(channelId, adapter, endpointId, startTs, endTs, limit) {
116
- const Inbox = getInboxModel();
117
- if (!Inbox)
118
- return [];
119
- try {
120
- let rows;
121
- try {
122
- rows = await Inbox.select()
123
- .where({
124
- channel_id: channelId,
125
- channel_type: "group",
126
- adapter: adapter || "",
127
- endpoint_id: endpointId || "",
128
- created_at: { $gte: startTs, $lte: endTs },
129
- })
130
- .orderBy("created_at", "ASC")
131
- .limit(limit);
132
- }
133
- catch {
134
- rows = await Inbox.select().where({
135
- channel_id: channelId,
136
- channel_type: "group",
137
- adapter: adapter || "",
138
- endpoint_id: endpointId || "",
139
- });
140
- rows = (rows || [])
141
- .filter((r) => r.created_at >= startTs && r.created_at <= endTs)
142
- .sort((a, b) => a.created_at - b.created_at)
143
- .slice(0, limit);
144
- }
145
- return rows;
146
- }
147
- catch (e) {
148
- logger.warn(formatCompact({ op: "inbox", ok: false, error: e?.message }));
149
- return [];
150
- }
151
- }
152
- async function runAnalysis(channelId, channelName, adapter, endpointId, days) {
153
- const Inbox = getInboxModel();
154
- if (!Inbox) {
155
- return "请先在配置中启用 inbox.enabled 并配置 database,以使用群日常分析。";
156
- }
157
- const { start, end, startStr, endStr } = getTimeRangeDays(days);
158
- const rows = await queryInboxMessages(channelId, adapter, endpointId, start, end, config.analysisMaxMessages);
159
- if (rows.length === 0) {
160
- return `在 ${startStr} 至 ${endStr} 区间内没有找到本群消息记录,请确认收件箱已启用并有过群消息。`;
161
- }
162
- const stats = computeBasicStats(rows);
163
- const meta = {
164
- channelName: channelName || undefined,
165
- days,
166
- startDate: startStr,
167
- endDate: endStr,
168
- };
169
- let textReport = formatTextReport(stats, meta);
170
- let llm;
171
- // 可选:LLM 话题/金句/用户画像(灵感来自 astrbot_plugin_qq_group_daily_analysis)
172
- const ai = root.inject("ai");
173
- if (ai?.ask) {
174
- try {
175
- const sampleSize = Math.min(rows.length, 150);
176
- const sample = rows.slice(-sampleSize);
177
- const conversation = sample
178
- .map((r) => `[${r.sender_name || r.sender_id}]: ${extractText(r).slice(0, 200)}`)
179
- .join("\n");
180
- const systemPrompt = `你是一个群聊分析助手。根据下面的群聊消息摘要,提取并仅返回一个 JSON 对象,包含以下三个数组(均为中文):
181
- - topics: 数组,每项 { "topic": "话题关键词", "summary": "简短说明" }
182
- - quotes: 数组,每项 { "content": "金句原文", "sender": "发言人", "reason": "入选理由" },最多 5 条
183
- - user_titles: 数组,每项 { "name": "昵称", "user_id": "id", "title": "称号/画像", "reason": "理由" },最多 8 人
184
- 不要输出除 JSON 以外的内容。`;
185
- const answer = await ai.ask(`请分析以下群聊片段并返回 JSON:\n\n${conversation.slice(0, 6000)}`, { systemPrompt });
186
- if (answer && answer.trim()) {
187
- const parsed = parseLLMResponse(answer);
188
- if (parsed.topics?.length ||
189
- parsed.quotes?.length ||
190
- parsed.userTitles?.length) {
191
- llm = parsed;
192
- textReport = appendLLMReport(textReport, llm);
193
- }
194
- }
195
- }
196
- catch (e) {
197
- logger.debug("[LLM 分析跳过", e?.message);
198
- }
199
- }
200
- return { stats, textReport, llm, meta };
201
- }
202
- function analysisReportReply(report) {
203
- return segment.html({
204
- html: buildAnalysisReportHtml(buildAnalysisReportData(report.stats, report.meta, report.llm)),
205
- width: 540,
206
- backgroundColor: ANALYSIS_REPORT_CANVAS,
207
- fileName: "group-daily-analysis.png",
208
- });
209
- }
210
- // ─── 命令:群分析 ─────────────────────────────────────────────────────────────
211
- addCommand(new MessageCommand("群分析 [天数:number]")
212
- .desc("群日常分析", "分析本群近期消息统计(依赖收件箱)")
213
- .action(async (message, result) => {
214
- const ch = getChannelFromMessage(message);
215
- if (!ch || ch.channelType !== "group") {
216
- return "请在群聊中使用本命令。";
217
- }
218
- const days = Math.min(30, Math.max(1, Number(result.params?.天数) || config.analysisDays));
219
- const channelName = message?.$channel?.name || "";
220
- const report = await runAnalysis(ch.channelId, channelName, ch.adapter || "", ch.endpointId || "", days);
221
- if (typeof report === "string")
222
- return report;
223
- return analysisReportReply(report);
224
- }));
225
- // ─── 命令:分析设置 ───────────────────────────────────────────────────────────
226
- addCommand(new MessageCommand("分析设置 [操作:text]")
227
- .desc("分析设置", "enable=启用本群分析 / disable=禁用 / status=查看状态")
228
- .action(async (message, result) => {
229
- const ch = getChannelFromMessage(message);
230
- if (!ch || ch.channelType !== "group") {
231
- return "请在群聊中使用本命令。";
232
- }
233
- const op = (result.params?.操作 || "status").trim().toLowerCase();
234
- const adapter = ch.adapter || "";
235
- const endpointId = ch.endpointId || "";
236
- if (op === "enable") {
237
- await setAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter, endpointId, true);
238
- return "已为本群启用日常分析。";
239
- }
240
- if (op === "disable") {
241
- await setAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter, endpointId, false);
242
- return "已为本群关闭日常分析。";
243
- }
244
- if (op === "status") {
245
- const enabled = await isAnalysisEnabledForChannel(ch.channelId, ch.channelType, adapter);
246
- return `本群日常分析:${enabled ? "已启用" : "已关闭"}`;
247
- }
248
- return "用法:分析设置 enable | disable | status";
249
- }));
250
- // ─── 定时任务(可选)───────────────────────────────────────────────────────────
251
- let cronDispose = null;
252
- useContext("database", () => {
253
- if (!config.autoAnalysisEnabled || cronDispose)
254
- return;
255
- if (typeof addCron !== "function")
256
- return;
257
- try {
258
- cronDispose = addCron(new Cron(config.autoAnalysisCron, async () => {
259
- const inject = root.inject?.bind(root);
260
- if (typeof inject !== "function")
261
- return;
262
- const targets = [];
263
- const Settings = getSettingsModel();
264
- if (Settings) {
265
- const rows = await Settings.select().where({
266
- channel_type: "group",
267
- enabled: 1,
268
- });
269
- for (const r of rows) {
270
- if (r.channel_id && r.adapter)
271
- targets.push({
272
- channelId: String(r.channel_id),
273
- adapter: String(r.adapter),
274
- endpointId: String(r.endpoint_id || ""),
275
- });
276
- }
277
- }
278
- for (const gid of config.analysisGroups) {
279
- if (targets.some((t) => t.channelId === gid))
280
- continue;
281
- const adapters = root.adapters;
282
- const adapterName = Array.isArray(adapters) && adapters[0] ? adapters[0] : "";
283
- if (adapterName)
284
- targets.push({
285
- channelId: String(gid),
286
- adapter: adapterName,
287
- endpointId: "",
288
- });
289
- }
290
- for (const t of targets) {
291
- if (config.analysisGroupsBlock.length &&
292
- isGroupInList(t.channelId, config.analysisGroupsBlock))
293
- continue;
294
- try {
295
- const report = await runAnalysis(t.channelId, "", t.adapter, t.endpointId, config.analysisDays);
296
- if (typeof report === "string")
297
- continue;
298
- const adapter = inject(t.adapter);
299
- if (adapter?.sendMessage) {
300
- let endpointId = t.endpointId;
301
- if (!endpointId && adapter.endpoints?.size) {
302
- const first = adapter.endpoints.values().next().value;
303
- endpointId = first?.$id ?? first?.selfId ?? "";
304
- }
305
- const content = analysisReportReply(report);
306
- await adapter
307
- .sendMessage({
308
- context: t.adapter,
309
- endpoint: endpointId,
310
- type: "group",
311
- id: t.channelId,
312
- content,
313
- })
314
- .catch(() => { });
315
- }
316
- }
317
- catch (e) {
318
- logger.warn(formatCompact({ op: "send", channel: t.channelId, ok: false, error: e?.message }));
319
- }
320
- }
321
- }));
322
- }
323
- catch (e) {
324
- logger.warn(formatCompact({ op: "cron", ok: false, error: e?.message }));
325
- }
326
- });
327
- onDispose(() => {
328
- if (cronDispose) {
329
- cronDispose();
330
- cronDispose = null;
331
- }
332
- });
333
- }
334
- //# sourceMappingURL=daily-analysis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daily-analysis.js","sourceRoot":"","sources":["../src/daily-analysis.ts"],"names":[],"mappings":"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"}
package/lib/shared.d.ts DELETED
@@ -1,25 +0,0 @@
1
- import { type Message, type Plugin } from "zhin.js";
2
- export declare function todayStr(): string;
3
- export declare function ts(): string;
4
- /** 入站纯文本(与 AI trigger 一致:segment.toString($content),否则 $raw) */
5
- export declare function extractInboundText(message: Pick<Message, "$raw" | "$content">): string;
6
- /** 消息所属群/全局上下文 */
7
- export declare function getMessageContextKey(message: {
8
- $channel?: {
9
- type?: string;
10
- id?: string | number;
11
- };
12
- type?: string;
13
- $group?: {
14
- id?: string | number;
15
- };
16
- $target?: {
17
- id?: string | number;
18
- };
19
- }): {
20
- type: string;
21
- id: string;
22
- };
23
- export declare function adapterAllowed(allowed: string[] | undefined, adapter: string | undefined): boolean;
24
- export declare function getDatabase(plugin: Plugin): any;
25
- //# sourceMappingURL=shared.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7D,wBAAgB,QAAQ,IAAI,MAAM,CAGjC;AAED,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,MAAM,CAMtF;AAED,kBAAkB;AAClB,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClC,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAW/B;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAIT;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAE/C"}
package/lib/shared.js DELETED
@@ -1,40 +0,0 @@
1
- import { segment } from "zhin.js";
2
- export function todayStr() {
3
- const d = new Date();
4
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
5
- }
6
- export function ts() {
7
- return new Date().toISOString();
8
- }
9
- /** 入站纯文本(与 AI trigger 一致:segment.toString($content),否则 $raw) */
10
- export function extractInboundText(message) {
11
- if (message.$content?.length) {
12
- const fromContent = segment.toString(message.$content).trim();
13
- if (fromContent)
14
- return fromContent;
15
- }
16
- return (message.$raw ?? "").trim();
17
- }
18
- /** 消息所属群/全局上下文 */
19
- export function getMessageContextKey(message) {
20
- const channelType = message.$channel?.type ?? message.type;
21
- if (channelType === "group") {
22
- const id = message.$channel?.id ??
23
- message.$group?.id ??
24
- message.$target?.id ??
25
- "";
26
- return { type: "group", id: String(id) };
27
- }
28
- return { type: "global", id: "" };
29
- }
30
- export function adapterAllowed(allowed, adapter) {
31
- if (!allowed?.length)
32
- return true;
33
- if (!adapter)
34
- return false;
35
- return allowed.includes(adapter);
36
- }
37
- export function getDatabase(plugin) {
38
- return plugin.root.inject("database");
39
- }
40
- //# sourceMappingURL=shared.js.map
package/lib/shared.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA6B,MAAM,SAAS,CAAC;AAE7D,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,EAAE;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,OAA2C;IAC5E,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,oBAAoB,CAAC,OAKpC;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC3D,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,GACN,OAAO,CAAC,QAAQ,EAAE,EAAE;YACpB,OAAO,CAAC,MAAM,EAAE,EAAE;YAClB,OAAO,CAAC,OAAO,EAAE,EAAE;YACnB,EAAE,CAAC;QACL,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAA6B,EAC7B,OAA2B;IAE3B,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAmB,CAAQ,CAAC;AACxD,CAAC"}
package/lib/stats.d.ts DELETED
@@ -1,12 +0,0 @@
1
- import { type Plugin } from "zhin.js";
2
- import type { GroupSuiteConfig } from "./config.js";
3
- export declare function weekStartStr(): string;
4
- export declare function monthStartStr(): string;
5
- export declare function getStatsModel(): any;
6
- export declare function flushStatsBuffer(): Promise<void>;
7
- export declare function queryStats(groupId: string, fromDate: string): Promise<Map<string, {
8
- name: string;
9
- count: number;
10
- }>>;
11
- export declare function registerStats(plugin: Plugin, cfg: GroupSuiteConfig): void;
12
- //# sourceMappingURL=stats.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,wBAAgB,YAAY,IAAI,MAAM,CAKrC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAID,wBAAgB,aAAa,IAAI,GAAG,CAEnC;AAuBD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCtD;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAqBvD;AAoBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAyKzE"}