@zhin.js/plugin-group-suite 3.0.2 → 3.0.4

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 (131) hide show
  1. package/README.md +42 -58
  2. package/agent/tools/group_announce.ts +2 -2
  3. package/commands/checkin.ts +12 -0
  4. package/commands/forget.ts +12 -0
  5. package/commands/keyword-add/[keyword:string].ts +15 -0
  6. package/commands/keyword-list.ts +14 -0
  7. package/commands/keyword-remove/[keyword:string].ts +14 -0
  8. package/commands/mypoints.ts +12 -0
  9. package/commands/mystats.ts +12 -0
  10. package/commands/rank.ts +12 -0
  11. package/commands/stats-rank.ts +20 -0
  12. package/commands/stats-week.ts +20 -0
  13. package/commands/stats.ts +21 -0
  14. package/commands/teach-list/[page:number=1].ts +13 -0
  15. package/commands/teach-regex.ts +12 -0
  16. package/commands/teach.ts +12 -0
  17. package/lib/analysis-card.d.ts +4 -0
  18. package/lib/analysis-card.d.ts.map +1 -0
  19. package/lib/analysis-card.js.map +1 -0
  20. package/lib/analysis.d.ts +95 -0
  21. package/lib/analysis.d.ts.map +1 -0
  22. package/lib/analysis.js.map +1 -0
  23. package/lib/card-layout.d.ts +27 -0
  24. package/lib/card-layout.d.ts.map +1 -0
  25. package/lib/card-layout.js.map +1 -0
  26. package/lib/checkin-lib.d.ts +18 -0
  27. package/lib/checkin-lib.d.ts.map +1 -0
  28. package/lib/checkin-lib.js +118 -0
  29. package/lib/checkin-lib.js.map +1 -0
  30. package/lib/config.d.ts +15 -0
  31. package/lib/config.d.ts.map +1 -0
  32. package/lib/config.js +19 -0
  33. package/lib/config.js.map +1 -0
  34. package/lib/db-store.d.ts +12 -0
  35. package/lib/db-store.d.ts.map +1 -0
  36. package/lib/db-store.js +38 -0
  37. package/lib/db-store.js.map +1 -0
  38. package/lib/index.d.ts +10 -0
  39. package/lib/index.d.ts.map +1 -0
  40. package/lib/index.js +8 -0
  41. package/lib/index.js.map +1 -0
  42. package/lib/keyword-store.d.ts +6 -0
  43. package/lib/keyword-store.d.ts.map +1 -0
  44. package/lib/keyword-store.js +21 -0
  45. package/lib/keyword-store.js.map +1 -0
  46. package/lib/memory-store.d.ts +29 -0
  47. package/lib/memory-store.d.ts.map +1 -0
  48. package/lib/memory-store.js +59 -0
  49. package/lib/memory-store.js.map +1 -0
  50. package/lib/runtime-state.d.ts +24 -0
  51. package/lib/runtime-state.d.ts.map +1 -0
  52. package/lib/runtime-state.js +21 -0
  53. package/lib/runtime-state.js.map +1 -0
  54. package/lib/shared-runtime.d.ts +20 -0
  55. package/lib/shared-runtime.d.ts.map +1 -0
  56. package/lib/shared-runtime.js +34 -0
  57. package/lib/shared-runtime.js.map +1 -0
  58. package/lib/stats-card.d.ts +5 -0
  59. package/lib/stats-card.d.ts.map +1 -0
  60. package/lib/stats-card.js.map +1 -0
  61. package/lib/stats-data.d.ts +32 -0
  62. package/lib/stats-data.d.ts.map +1 -0
  63. package/lib/stats-data.js.map +1 -0
  64. package/lib/stats-lib.d.ts +29 -0
  65. package/lib/stats-lib.d.ts.map +1 -0
  66. package/lib/stats-lib.js +173 -0
  67. package/lib/stats-lib.js.map +1 -0
  68. package/lib/tables.d.ts +4 -0
  69. package/lib/tables.d.ts.map +1 -0
  70. package/lib/tables.js +40 -0
  71. package/lib/tables.js.map +1 -0
  72. package/lib/teach-lib.d.ts +22 -0
  73. package/lib/teach-lib.d.ts.map +1 -0
  74. package/lib/teach-lib.js +233 -0
  75. package/lib/teach-lib.js.map +1 -0
  76. package/middlewares/keyword-reply.ts +37 -0
  77. package/middlewares/stats-count.ts +22 -0
  78. package/middlewares/teach-reply.ts +22 -0
  79. package/package.json +37 -15
  80. package/plugin.ts +39 -0
  81. package/schema.json +17 -0
  82. package/src/checkin-lib.ts +148 -0
  83. package/src/config.ts +23 -57
  84. package/src/db-store.ts +51 -0
  85. package/src/index.ts +47 -33
  86. package/src/keyword-store.ts +24 -0
  87. package/src/memory-store.ts +88 -0
  88. package/src/runtime-state.ts +44 -0
  89. package/src/shared-runtime.ts +44 -0
  90. package/src/stats-lib.ts +202 -0
  91. package/src/tables.ts +46 -0
  92. package/src/teach-lib.ts +301 -0
  93. package/tools/checkin-query/handler.ts +2 -2
  94. package/tools/checkin-rank/handler.ts +1 -1
  95. package/tools/stats-query/handler.ts +2 -2
  96. package/tools/stats-user/handler.ts +3 -2
  97. package/lib/agent/tools/group_announce.js +0 -13
  98. package/lib/agent/tools/group_announce.js.map +0 -1
  99. package/lib/src/admin.js +0 -114
  100. package/lib/src/admin.js.map +0 -1
  101. package/lib/src/analysis-card.js.map +0 -1
  102. package/lib/src/analysis.js.map +0 -1
  103. package/lib/src/card-layout.js.map +0 -1
  104. package/lib/src/checkin.js +0 -168
  105. package/lib/src/checkin.js.map +0 -1
  106. package/lib/src/config.js +0 -41
  107. package/lib/src/config.js.map +0 -1
  108. package/lib/src/daily-analysis.js +0 -333
  109. package/lib/src/daily-analysis.js.map +0 -1
  110. package/lib/src/index.js +0 -30
  111. package/lib/src/index.js.map +0 -1
  112. package/lib/src/shared.js +0 -40
  113. package/lib/src/shared.js.map +0 -1
  114. package/lib/src/stats-card.js.map +0 -1
  115. package/lib/src/stats-data.js.map +0 -1
  116. package/lib/src/stats.js +0 -258
  117. package/lib/src/stats.js.map +0 -1
  118. package/lib/src/teach.js +0 -294
  119. package/lib/src/teach.js.map +0 -1
  120. package/plugin.yml +0 -3
  121. package/src/admin.ts +0 -136
  122. package/src/checkin.ts +0 -196
  123. package/src/daily-analysis.ts +0 -458
  124. package/src/shared.ts +0 -51
  125. package/src/stats.ts +0 -298
  126. package/src/teach.ts +0 -307
  127. /package/lib/{src/analysis-card.js → analysis-card.js} +0 -0
  128. /package/lib/{src/analysis.js → analysis.js} +0 -0
  129. /package/lib/{src/card-layout.js → card-layout.js} +0 -0
  130. /package/lib/{src/stats-card.js → stats-card.js} +0 -0
  131. /package/lib/{src/stats-data.js → stats-data.js} +0 -0
package/lib/src/stats.js DELETED
@@ -1,258 +0,0 @@
1
- import { formatCompact, isActionMessage, MessageCommand, segment } from "zhin.js";
2
- import { todayStr, ts } from "./shared.js";
3
- import { buildStatsRankReportData } from "./stats-data.js";
4
- import { buildMyStatsHtml, buildStatsRankHtml, STATS_REPORT_CANVAS } from "./stats-card.js";
5
- export function weekStartStr() {
6
- const d = new Date();
7
- const day = d.getDay() || 7;
8
- d.setDate(d.getDate() - day + 1);
9
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
10
- }
11
- export function monthStartStr() {
12
- const d = new Date();
13
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-01`;
14
- }
15
- let _db = null;
16
- export function getStatsModel() {
17
- return _db?.models?.get("message_stats") ?? null;
18
- }
19
- const buffer = new Map();
20
- function bufferKey(userId, groupId, date) {
21
- return `${userId}:${groupId}:${date}`;
22
- }
23
- function getGroupId(message) {
24
- if (message.$channel?.type === "group") {
25
- return String(message.$channel.id ?? "");
26
- }
27
- return "";
28
- }
29
- export async function flushStatsBuffer() {
30
- const M = getStatsModel();
31
- if (!M || buffer.size === 0)
32
- return;
33
- const entries = [...buffer.values()];
34
- buffer.clear();
35
- for (const entry of entries) {
36
- try {
37
- const existing = await M.select().where({
38
- user_id: entry.user_id,
39
- group_id: entry.group_id,
40
- date: entry.date,
41
- });
42
- if (existing.length > 0) {
43
- await M.update({
44
- count: (existing[0].count || 0) + entry.count,
45
- user_name: entry.user_name,
46
- updated_at: ts(),
47
- }).where({
48
- user_id: entry.user_id,
49
- group_id: entry.group_id,
50
- date: entry.date,
51
- });
52
- }
53
- else {
54
- await M.insert({
55
- user_id: entry.user_id,
56
- user_name: entry.user_name,
57
- group_id: entry.group_id,
58
- date: entry.date,
59
- count: entry.count,
60
- updated_at: ts(),
61
- });
62
- }
63
- }
64
- catch {
65
- /* single row failure */
66
- }
67
- }
68
- }
69
- export async function queryStats(groupId, fromDate) {
70
- const M = getStatsModel();
71
- if (!M)
72
- return new Map();
73
- const all = groupId
74
- ? await M.select().where({ group_id: groupId })
75
- : await M.select();
76
- const result = new Map();
77
- for (const row of all) {
78
- if (row.date < fromDate)
79
- continue;
80
- const existing = result.get(row.user_id);
81
- if (existing) {
82
- existing.count += row.count || 0;
83
- if (row.user_name)
84
- existing.name = row.user_name;
85
- }
86
- else {
87
- result.set(row.user_id, {
88
- name: row.user_name || row.user_id,
89
- count: row.count || 0,
90
- });
91
- }
92
- }
93
- return result;
94
- }
95
- function statsRankReply(data) {
96
- return segment.html({
97
- html: buildStatsRankHtml(data),
98
- width: 540,
99
- backgroundColor: STATS_REPORT_CANVAS,
100
- fileName: "message-stats-rank.png",
101
- });
102
- }
103
- function myStatsReply(data) {
104
- return segment.html({
105
- html: buildMyStatsHtml(data),
106
- width: 540,
107
- backgroundColor: STATS_REPORT_CANVAS,
108
- fileName: "my-message-stats.png",
109
- });
110
- }
111
- export function registerStats(plugin, cfg) {
112
- const { logger, addCommand, useContext, onDispose } = plugin;
113
- useContext("database", (db) => {
114
- _db = db;
115
- db.define("message_stats", {
116
- user_id: { type: "text", nullable: false },
117
- user_name: { type: "text", default: "" },
118
- group_id: { type: "text", default: "" },
119
- date: { type: "text", nullable: false },
120
- count: { type: "integer", default: 0 },
121
- updated_at: { type: "text", default: "" },
122
- });
123
- logger.debug(formatCompact({ 模块: "消息统计", 数据模型: "已就绪" }));
124
- });
125
- const flushTimer = setInterval(flushStatsBuffer, 10_000);
126
- onDispose(async () => {
127
- clearInterval(flushTimer);
128
- await flushStatsBuffer();
129
- buffer.clear();
130
- });
131
- plugin.root.addMiddleware(async (message, next) => {
132
- if (isActionMessage(message))
133
- return next();
134
- const userId = String(message.$sender?.id || "");
135
- if (!userId)
136
- return next();
137
- const key = bufferKey(userId, getGroupId(message), todayStr());
138
- const pending = buffer.get(key);
139
- if (pending) {
140
- pending.count++;
141
- pending.user_name = String(message.$sender?.name || "");
142
- }
143
- else {
144
- buffer.set(key, {
145
- user_id: userId,
146
- user_name: String(message.$sender?.name || ""),
147
- group_id: getGroupId(message),
148
- date: todayStr(),
149
- count: 1,
150
- });
151
- }
152
- return next();
153
- });
154
- addCommand(new MessageCommand("stats")
155
- .desc("消息统计", "查看今日消息统计")
156
- .action(async (message) => {
157
- await flushStatsBuffer();
158
- const groupId = getGroupId(message);
159
- const stats = await queryStats(groupId, todayStr());
160
- const title = groupId ? "今日本群消息统计" : "今日全局消息统计";
161
- const data = buildStatsRankReportData(stats, title, cfg.rankSize, String(message.$sender?.id || ""));
162
- return statsRankReply(data);
163
- }));
164
- addCommand(new MessageCommand("stats-week")
165
- .desc("周消息统计", "查看本周消息统计")
166
- .action(async (message) => {
167
- await flushStatsBuffer();
168
- const groupId = getGroupId(message);
169
- const stats = await queryStats(groupId, weekStartStr());
170
- const title = groupId ? "本周本群消息统计" : "本周全局消息统计";
171
- const data = buildStatsRankReportData(stats, title, cfg.rankSize, String(message.$sender?.id || ""));
172
- return statsRankReply(data);
173
- }));
174
- addCommand(new MessageCommand("stats-rank")
175
- .desc("话唠排行", "查看活跃度排行榜")
176
- .action(async (message) => {
177
- await flushStatsBuffer();
178
- const groupId = getGroupId(message);
179
- const stats = await queryStats(groupId, monthStartStr());
180
- const title = groupId ? "本月话唠排行" : "全局话唠排行";
181
- const data = buildStatsRankReportData(stats, title, cfg.rankSize, String(message.$sender?.id || ""));
182
- return statsRankReply(data);
183
- }));
184
- addCommand(new MessageCommand("mystats")
185
- .desc("我的统计", "查看个人消息统计")
186
- .action(async (message) => {
187
- await flushStatsBuffer();
188
- const M = getStatsModel();
189
- if (!M)
190
- return "统计数据库尚未就绪";
191
- const userId = String(message.$sender?.id || "");
192
- if (!userId)
193
- return "无法获取用户信息";
194
- const groupId = getGroupId(message);
195
- const rows = groupId
196
- ? await M.select().where({ user_id: userId, group_id: groupId })
197
- : await M.select().where({ user_id: userId });
198
- if (rows.length === 0)
199
- return "暂无你的消息记录";
200
- const today = todayStr();
201
- const weekStart = weekStartStr();
202
- const monthStart = monthStartStr();
203
- let todayCount = 0;
204
- let weekCount = 0;
205
- let monthCount = 0;
206
- let totalCount = 0;
207
- for (const row of rows) {
208
- const c = row.count || 0;
209
- totalCount += c;
210
- if (row.date >= monthStart)
211
- monthCount += c;
212
- if (row.date >= weekStart)
213
- weekCount += c;
214
- if (row.date === today)
215
- todayCount += c;
216
- }
217
- const scope = groupId ? "本群" : "全局";
218
- const data = {
219
- userName: String(message.$sender?.name || "你"),
220
- scope,
221
- todayCount,
222
- weekCount,
223
- monthCount,
224
- totalCount,
225
- activeDays: rows.length,
226
- };
227
- return myStatsReply(data);
228
- }));
229
- const cleanupTimer = setInterval(async () => {
230
- const M = getStatsModel();
231
- if (!M)
232
- return;
233
- try {
234
- const cutoff = new Date();
235
- cutoff.setDate(cutoff.getDate() - cfg.statsRetentionDays);
236
- const cutoffStr = `${cutoff.getFullYear()}-${String(cutoff.getMonth() + 1).padStart(2, "0")}-${String(cutoff.getDate()).padStart(2, "0")}`;
237
- const all = await M.select();
238
- for (const row of all.filter((r) => r.date < cutoffStr)) {
239
- await M.delete().where({
240
- user_id: row.user_id,
241
- group_id: row.group_id,
242
- date: row.date,
243
- });
244
- }
245
- }
246
- catch {
247
- /* ignore */
248
- }
249
- }, 24 * 60 * 60_000);
250
- onDispose(() => clearInterval(cleanupTimer));
251
- logger.debug(formatCompact({
252
- 模块: "消息统计",
253
- 状态: "已加载",
254
- 排行榜大小: cfg.rankSize,
255
- 数据保留天数: cfg.statsRetentionDays,
256
- }));
257
- }
258
- //# sourceMappingURL=stats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAe,MAAM,SAAS,CAAC;AAE/F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAA0B,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE5F,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IACjC,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,aAAa;IAC3B,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,KAAK,CAAC;AAC9E,CAAC;AAED,IAAI,GAAG,GAAQ,IAAI,CAAC;AAEpB,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC;AACnD,CAAC;AAUD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEnD,SAAS,SAAS,CAAC,MAAc,EAAE,OAAe,EAAE,IAAY;IAC9D,OAAO,GAAG,MAAM,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,OAAsD;IACxE,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACpC,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAU,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;gBAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,CAAC,MAAM,CAAC;oBACb,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK;oBAC7C,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,UAAU,EAAE,EAAE,EAAE;iBACjB,CAAC,CAAC,KAAK,CAAC;oBACP,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,MAAM,CAAC;oBACb,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,EAAE,EAAE;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,QAAgB;IAEhB,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACzB,MAAM,GAAG,GAAU,OAAO;QACxB,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC/C,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,IAAI,GAAG,QAAQ;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;YACjC,IAAI,GAAG,CAAC,SAAS;gBAAE,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;gBACtB,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO;gBAClC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,IAAiD;IACvE,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,GAAG;QACV,eAAe,EAAE,mBAAmB;QACpC,QAAQ,EAAE,wBAAwB;KACnC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC5B,KAAK,EAAE,GAAG;QACV,eAAe,EAAE,mBAAmB;QACpC,QAAQ,EAAE,sBAAsB;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAqB;IACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7D,UAAU,CAAC,UAAU,EAAE,CAAC,EAAO,EAAE,EAAE;QACjC,GAAG,GAAG,EAAE,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;YACzB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACvC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YACvC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;YACtC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACzD,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,eAAe,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACd,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC9C,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC;gBAC7B,IAAI,EAAE,QAAQ,EAAE;gBAChB,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,UAAU,CACR,IAAI,cAAc,CAAC,OAAO,CAAC;SACxB,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAChD,MAAM,IAAI,GAAG,wBAAwB,CACnC,KAAK,EACL,KAAK,EACL,GAAG,CAAC,QAAQ,EACZ,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAClC,CAAC;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,IAAI,cAAc,CAAC,YAAY,CAAC;SAC7B,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;SACzB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAChD,MAAM,IAAI,GAAG,wBAAwB,CACnC,KAAK,EACL,KAAK,EACL,GAAG,CAAC,QAAQ,EACZ,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAClC,CAAC;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,IAAI,cAAc,CAAC,YAAY,CAAC;SAC7B,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5C,MAAM,IAAI,GAAG,wBAAwB,CACnC,KAAK,EACL,KAAK,EACL,GAAG,CAAC,QAAQ,EACZ,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAClC,CAAC;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,IAAI,cAAc,CAAC,SAAS,CAAC;SAC1B,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;SACxB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,OAAO,WAAW,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,UAAU,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,GAAU,OAAO;YACzB,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAChE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;YACzB,UAAU,IAAI,CAAC,CAAC;YAChB,IAAI,GAAG,CAAC,IAAI,IAAI,UAAU;gBAAE,UAAU,IAAI,CAAC,CAAC;YAC5C,IAAI,GAAG,CAAC,IAAI,IAAI,SAAS;gBAAE,SAAS,IAAI,CAAC,CAAC;YAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;gBAAE,UAAU,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,MAAM,IAAI,GAAsB;YAC9B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC;YAC9C,KAAK;YACL,UAAU;YACV,SAAS;YACT,UAAU;YACV,UAAU;YACV,UAAU,EAAE,IAAI,CAAC,MAAM;SACxB,CAAC;QACF,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3I,MAAM,GAAG,GAAU,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YACpC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;oBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IAErB,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAE7C,MAAM,CAAC,KAAK,CACV,aAAa,CAAC;QACZ,EAAE,EAAE,MAAM;QACV,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,GAAG,CAAC,QAAQ;QACnB,MAAM,EAAE,GAAG,CAAC,kBAAkB;KAC/B,CAAC,CACH,CAAC;AACJ,CAAC"}
package/lib/src/teach.js DELETED
@@ -1,294 +0,0 @@
1
- import { MessageCommand } from "zhin.js";
2
- import { extractInboundText, getMessageContextKey, ts } from "./shared.js";
3
- const cooldownMap = new Map();
4
- function isSafeRegex(pattern) {
5
- if (pattern.length > 200)
6
- return false;
7
- if (/(\+|\*|\{)\)?(\+|\*|\{)/.test(pattern))
8
- return false;
9
- if (/\([^)]*(\+|\*)[^)]*(\+|\*)[^)]*\)[+*]/.test(pattern))
10
- return false;
11
- const altGroups = pattern.match(/\([^)]*\|[^)]*\)/g) || [];
12
- for (const g of altGroups) {
13
- if ((g.match(/\|/g) || []).length > 10)
14
- return false;
15
- }
16
- return true;
17
- }
18
- /** 从 teach / teach-regex 命令的剩余文本解析「问题|答案」或「问题 答案」 */
19
- function extractRestParam(payload) {
20
- if (Array.isArray(payload)) {
21
- return payload.map((v) => String(v)).join(" ").trim();
22
- }
23
- return String(payload ?? "").trim();
24
- }
25
- function parseTeachPair(raw) {
26
- if (!raw)
27
- return null;
28
- const pipe = raw.indexOf("|");
29
- if (pipe >= 0) {
30
- const question = raw.slice(0, pipe).trim();
31
- const answer = raw.slice(pipe + 1).trim();
32
- if (question && answer)
33
- return { question, answer };
34
- return null;
35
- }
36
- const lastSpace = raw.lastIndexOf(" ");
37
- if (lastSpace < 0)
38
- return null;
39
- const question = raw.slice(0, lastSpace).trim();
40
- const answer = raw.slice(lastSpace + 1).trim();
41
- if (!question || !answer)
42
- return null;
43
- return { question, answer };
44
- }
45
- const TEACH_USAGE_HINT = "格式:teach 关键词 回答(回答可含空格),或 teach 问题|答案";
46
- function processAnswer(answer, message, match) {
47
- let result = answer;
48
- result = result.replace(/\{sender\}/g, message.$sender?.name || "你");
49
- result = result.replace(/\{sender\.id\}/g, message.$sender?.id || "");
50
- result = result.replace(/\{time\}/g, new Date().toLocaleTimeString("zh-CN"));
51
- result = result.replace(/\{date\}/g, new Date().toLocaleDateString("zh-CN"));
52
- if (match) {
53
- for (let i = 1; i < match.length; i++) {
54
- result = result.replace(new RegExp(`\\$${i}`, "g"), match[i] || "");
55
- }
56
- }
57
- return result;
58
- }
59
- let _db = null;
60
- function getQA() {
61
- return _db?.models?.get("teach_qa") ?? null;
62
- }
63
- /** teach_qa 无自增 id 列,更新/删除用业务主键 */
64
- function qaWhereKey(row) {
65
- return {
66
- question: row.question,
67
- context_type: row.context_type,
68
- context_id: row.context_id,
69
- is_regex: row.is_regex ? 1 : 0,
70
- };
71
- }
72
- export function registerTeach(plugin, cfg) {
73
- const { addCommand, useContext, onDispose } = plugin;
74
- const root = plugin.root;
75
- useContext("database", (db) => {
76
- _db = db;
77
- db.define("teach_qa", {
78
- question: { type: "text", nullable: false },
79
- answer: { type: "text", nullable: false },
80
- is_regex: { type: "integer", default: 0 },
81
- context_type: { type: "text", default: "global" },
82
- context_id: { type: "text", default: "" },
83
- creator_id: { type: "text", default: "" },
84
- creator_name: { type: "text", default: "" },
85
- hit_count: { type: "integer", default: 0 },
86
- created_at: { type: "text", default: "" },
87
- updated_at: { type: "text", default: "" },
88
- });
89
- });
90
- const cooldownCleanup = setInterval(() => {
91
- const now = Date.now();
92
- for (const [key, time] of cooldownMap) {
93
- if (now - time > cfg.teachCooldownMs * 2)
94
- cooldownMap.delete(key);
95
- }
96
- }, 60_000);
97
- onDispose(() => clearInterval(cooldownCleanup));
98
- async function findMatch(content, ctxType, ctxId) {
99
- const QA = getQA();
100
- if (!QA)
101
- return null;
102
- const allItems = await QA.select();
103
- const candidates = allItems.filter((item) => item.context_type === "global" ||
104
- (item.context_type === ctxType && item.context_id === ctxId));
105
- for (const item of candidates) {
106
- if (!item.is_regex && item.question === content)
107
- return item;
108
- }
109
- if (cfg.teachAllowRegex) {
110
- for (const item of candidates) {
111
- if (!item.is_regex)
112
- continue;
113
- try {
114
- if (new RegExp(item.question, "i").test(content))
115
- return item;
116
- }
117
- catch {
118
- continue;
119
- }
120
- }
121
- }
122
- return null;
123
- }
124
- // 入站链只执行 root.middleware(见 packages/im/core inbound-runner)
125
- root.addMiddleware(async (message, next) => {
126
- const content = extractInboundText(message);
127
- if (!content)
128
- return next();
129
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
130
- const matched = await findMatch(content, ctxType, ctxId);
131
- if (!matched)
132
- return next();
133
- const cooldownKey = `${matched.question}:${ctxType}:${ctxId}:${matched.is_regex ?? 0}`;
134
- const last = cooldownMap.get(cooldownKey);
135
- if (last && Date.now() - last < cfg.teachCooldownMs)
136
- return next();
137
- cooldownMap.set(cooldownKey, Date.now());
138
- const QA = getQA();
139
- if (QA) {
140
- try {
141
- await QA.update({
142
- hit_count: (matched.hit_count || 0) + 1,
143
- updated_at: ts(),
144
- }).where(qaWhereKey(matched));
145
- }
146
- catch {
147
- /* ignore */
148
- }
149
- }
150
- let answer = matched.answer;
151
- if (matched.is_regex) {
152
- try {
153
- const m = content.match(new RegExp(matched.question, "i"));
154
- answer = processAnswer(answer, message, m || undefined);
155
- }
156
- catch {
157
- /* ignore */
158
- }
159
- }
160
- else {
161
- answer = processAnswer(answer, message);
162
- }
163
- await message.$reply?.(answer);
164
- return;
165
- });
166
- // 先注册较长前缀,避免 `teach [...]` 误匹配 teach-list / teach-regex
167
- addCommand(new MessageCommand("teach-list [page:number]")
168
- .desc("问答列表", "查看问答对")
169
- .action(async (message, result) => {
170
- const QA = getQA();
171
- if (!QA)
172
- return "问答数据库尚未就绪";
173
- const page = Math.max(1, result.params.page || 1);
174
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
175
- const allItems = await QA.select().where(ctxType === "global"
176
- ? { context_type: "global" }
177
- : { context_type: ctxType, context_id: ctxId });
178
- if (allItems.length === 0)
179
- return "还没有教过任何问答哦~";
180
- const totalPages = Math.ceil(allItems.length / cfg.teachPageSize);
181
- const safePage = Math.min(page, totalPages);
182
- const start = (safePage - 1) * cfg.teachPageSize;
183
- const pageItems = allItems.slice(start, start + cfg.teachPageSize);
184
- const lines = pageItems.map((item, i) => {
185
- const prefix = item.is_regex ? "[正则]" : "[精确]";
186
- const q = item.is_regex ? `/${item.question}/` : item.question;
187
- return `${start + i + 1}. ${prefix} ${q} → ${item.answer}`;
188
- });
189
- const header = ctxType === "global" ? "全局问答列表" : "本群问答列表";
190
- return `${header}\n${lines.join("\n")}\n第 ${safePage}/${totalPages} 页 · 共 ${allItems.length} 条`;
191
- }));
192
- addCommand(new MessageCommand("teach-regex [...payload:text]")
193
- .desc("教我正则问答", "用正则匹配")
194
- .usage("teach-regex 正则 回答", "teach-regex 正则|回答")
195
- .action(async (message, result) => {
196
- const QA = getQA();
197
- if (!QA)
198
- return "问答数据库尚未就绪";
199
- if (!cfg.teachAllowRegex)
200
- return "管理员已禁用正则问答";
201
- const parsed = parseTeachPair(extractRestParam(result.params.payload));
202
- if (!parsed)
203
- return "格式:teach-regex 正则 回答,或 teach-regex 正则|回答";
204
- const pattern = parsed.question;
205
- const answer = parsed.answer;
206
- try {
207
- new RegExp(pattern, "i");
208
- }
209
- catch (e) {
210
- return `正则表达式不合法: ${e.message}`;
211
- }
212
- if (!isSafeRegex(pattern))
213
- return "该正则可能导致性能问题,请简化";
214
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
215
- await QA.insert({
216
- question: pattern,
217
- answer,
218
- is_regex: 1,
219
- context_type: ctxType,
220
- context_id: ctxId,
221
- creator_id: message.$sender?.id || "",
222
- creator_name: message.$sender?.name || "",
223
- hit_count: 0,
224
- created_at: ts(),
225
- updated_at: ts(),
226
- });
227
- return `学会了!匹配 /${pattern}/ 的消息我会回复「${answer}」`;
228
- }));
229
- addCommand(new MessageCommand("forget <question:text>")
230
- .desc("忘记问答", "删除问答对")
231
- .action(async (message, result) => {
232
- const QA = getQA();
233
- if (!QA)
234
- return "问答数据库尚未就绪";
235
- const question = result.params.question?.trim();
236
- if (!question)
237
- return "请提供要删除的问题";
238
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
239
- const items = await QA.select().where({
240
- question,
241
- context_type: ctxType,
242
- context_id: ctxId,
243
- });
244
- if (items.length === 0)
245
- return `没有找到问题「${question}」`;
246
- await QA.delete().where(qaWhereKey(items[0]));
247
- return `已忘记「${question}」的回答`;
248
- }));
249
- addCommand(new MessageCommand("teach [...payload:text]")
250
- .desc("教我问答", "教会 Endpoint 一个新的问答对")
251
- .usage("teach 关键词 回答", "teach 问题|答案")
252
- .action(async (message, result) => {
253
- const QA = getQA();
254
- if (!QA)
255
- return "问答数据库尚未就绪,请稍后重试";
256
- const parsed = parseTeachPair(extractRestParam(result.params.payload));
257
- if (!parsed)
258
- return TEACH_USAGE_HINT;
259
- const { question, answer } = parsed;
260
- const { type: ctxType, id: ctxId } = getMessageContextKey(message);
261
- if (ctxType === "group") {
262
- const existing = await QA.select().where({
263
- context_type: ctxType,
264
- context_id: ctxId,
265
- });
266
- if (existing.length >= cfg.teachMaxPerGroup) {
267
- return `该群问答数已达上限 (${cfg.teachMaxPerGroup})`;
268
- }
269
- }
270
- const duplicate = await QA.select().where({
271
- question,
272
- context_type: ctxType,
273
- context_id: ctxId,
274
- });
275
- if (duplicate.length > 0) {
276
- await QA.update({ answer, updated_at: ts() }).where(qaWhereKey(duplicate[0]));
277
- return `已更新问答:「${question}」→「${answer}」`;
278
- }
279
- await QA.insert({
280
- question,
281
- answer,
282
- is_regex: 0,
283
- context_type: ctxType,
284
- context_id: ctxId,
285
- creator_id: message.$sender?.id || "",
286
- creator_name: message.$sender?.name || "",
287
- hit_count: 0,
288
- created_at: ts(),
289
- updated_at: ts(),
290
- });
291
- return `学会了!发送「${question}」我会回复「${answer}」`;
292
- }));
293
- }
294
- //# sourceMappingURL=teach.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"teach.js","sourceRoot":"","sources":["../../src/teach.ts"],"names":[],"mappings":"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"}
package/plugin.yml DELETED
@@ -1,3 +0,0 @@
1
- name: group-suite
2
- description: 群运营套件(入群欢迎、撤回提示、签到、消息统计、群日报、问答库)
3
- version: 0.1.0