@zhin.js/plugin-group-suite 3.0.1 → 3.0.3

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 (114) hide show
  1. package/README.md +42 -58
  2. package/agent/tools/group_announce.ts +12 -0
  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/checkin-lib.d.ts +18 -0
  18. package/lib/checkin-lib.d.ts.map +1 -0
  19. package/lib/checkin-lib.js +118 -0
  20. package/lib/checkin-lib.js.map +1 -0
  21. package/lib/config.d.ts +4 -57
  22. package/lib/config.d.ts.map +1 -1
  23. package/lib/config.js +18 -40
  24. package/lib/config.js.map +1 -1
  25. package/lib/db-store.d.ts +12 -0
  26. package/lib/db-store.d.ts.map +1 -0
  27. package/lib/db-store.js +38 -0
  28. package/lib/db-store.js.map +1 -0
  29. package/lib/index.d.ts +9 -1
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +7 -29
  32. package/lib/index.js.map +1 -1
  33. package/lib/keyword-store.d.ts +6 -0
  34. package/lib/keyword-store.d.ts.map +1 -0
  35. package/lib/keyword-store.js +21 -0
  36. package/lib/keyword-store.js.map +1 -0
  37. package/lib/memory-store.d.ts +29 -0
  38. package/lib/memory-store.d.ts.map +1 -0
  39. package/lib/memory-store.js +59 -0
  40. package/lib/memory-store.js.map +1 -0
  41. package/lib/runtime-state.d.ts +24 -0
  42. package/lib/runtime-state.d.ts.map +1 -0
  43. package/lib/runtime-state.js +21 -0
  44. package/lib/runtime-state.js.map +1 -0
  45. package/lib/shared-runtime.d.ts +20 -0
  46. package/lib/shared-runtime.d.ts.map +1 -0
  47. package/lib/shared-runtime.js +34 -0
  48. package/lib/shared-runtime.js.map +1 -0
  49. package/lib/stats-lib.d.ts +29 -0
  50. package/lib/stats-lib.d.ts.map +1 -0
  51. package/lib/stats-lib.js +173 -0
  52. package/lib/stats-lib.js.map +1 -0
  53. package/lib/tables.d.ts +4 -0
  54. package/lib/tables.d.ts.map +1 -0
  55. package/lib/tables.js +40 -0
  56. package/lib/tables.js.map +1 -0
  57. package/lib/teach-lib.d.ts +22 -0
  58. package/lib/teach-lib.d.ts.map +1 -0
  59. package/lib/teach-lib.js +233 -0
  60. package/lib/teach-lib.js.map +1 -0
  61. package/middlewares/keyword-reply.ts +37 -0
  62. package/middlewares/stats-count.ts +22 -0
  63. package/middlewares/teach-reply.ts +22 -0
  64. package/package.json +46 -13
  65. package/plugin.ts +39 -0
  66. package/schema.json +17 -0
  67. package/src/checkin-lib.ts +148 -0
  68. package/src/config.ts +23 -57
  69. package/src/db-store.ts +51 -0
  70. package/src/index.ts +47 -33
  71. package/src/keyword-store.ts +24 -0
  72. package/src/memory-store.ts +88 -0
  73. package/src/runtime-state.ts +44 -0
  74. package/src/shared-runtime.ts +44 -0
  75. package/src/stats-lib.ts +202 -0
  76. package/src/tables.ts +46 -0
  77. package/src/teach-lib.ts +301 -0
  78. package/tools/checkin-query/handler.ts +2 -2
  79. package/tools/checkin-rank/handler.ts +1 -1
  80. package/tools/stats-query/handler.ts +2 -2
  81. package/tools/stats-user/handler.ts +3 -2
  82. package/lib/admin.d.ts +0 -4
  83. package/lib/admin.d.ts.map +0 -1
  84. package/lib/admin.js +0 -123
  85. package/lib/admin.js.map +0 -1
  86. package/lib/checkin.d.ts +0 -5
  87. package/lib/checkin.d.ts.map +0 -1
  88. package/lib/checkin.js +0 -168
  89. package/lib/checkin.js.map +0 -1
  90. package/lib/daily-analysis.d.ts +0 -7
  91. package/lib/daily-analysis.d.ts.map +0 -1
  92. package/lib/daily-analysis.js +0 -333
  93. package/lib/daily-analysis.js.map +0 -1
  94. package/lib/shared.d.ts +0 -25
  95. package/lib/shared.d.ts.map +0 -1
  96. package/lib/shared.js +0 -40
  97. package/lib/shared.js.map +0 -1
  98. package/lib/stats.d.ts +0 -12
  99. package/lib/stats.d.ts.map +0 -1
  100. package/lib/stats.js +0 -258
  101. package/lib/stats.js.map +0 -1
  102. package/lib/teach.d.ts +0 -4
  103. package/lib/teach.d.ts.map +0 -1
  104. package/lib/teach.js +0 -294
  105. package/lib/teach.js.map +0 -1
  106. package/plugin.yml +0 -3
  107. package/src/admin.ts +0 -145
  108. package/src/checkin.ts +0 -196
  109. package/src/daily-analysis.ts +0 -458
  110. package/src/shared.ts +0 -51
  111. package/src/stats.ts +0 -298
  112. package/src/teach.ts +0 -307
  113. /package/{skills/checkin/SKILL.md → agent/skills/checkin.md} +0 -0
  114. /package/{skills/group-daily-analysis/SKILL.md → agent/skills/group-daily-analysis.md} +0 -0
package/lib/admin.js DELETED
@@ -1,123 +0,0 @@
1
- import { formatCompact, MessageCommand, ZhinTool, } from "zhin.js";
2
- import { adapterAllowed } from "./shared.js";
3
- export function registerAdmin(plugin, cfg) {
4
- const { addCommand, addTool, logger } = plugin;
5
- const welcomeTemplate = cfg.welcome;
6
- const noticeAdapters = cfg.noticeAdapters;
7
- plugin.on("notice.receive", async (notice) => {
8
- if (!adapterAllowed(noticeAdapters, String(notice.$adapter)))
9
- return;
10
- if (notice.$type === "group_member_increase") {
11
- if (notice.$channel.type !== "group")
12
- return;
13
- const targetName = notice.$target?.name || notice.$target?.id || "新成员";
14
- const welcomeMsg = `🎉 ${targetName},${welcomeTemplate}`;
15
- try {
16
- const adapter = plugin.inject(notice.$adapter);
17
- if (!adapter?.sendMessage)
18
- return;
19
- await adapter.sendMessage({
20
- context: notice.$adapter,
21
- endpoint: notice.$endpoint,
22
- content: welcomeMsg,
23
- id: notice.$channel.id,
24
- type: notice.$channel.type,
25
- });
26
- }
27
- catch (e) {
28
- logger.warn(formatCompact({
29
- op: "welcome",
30
- ok: false,
31
- error: e instanceof Error ? e.message : String(e),
32
- }));
33
- }
34
- return;
35
- }
36
- if (cfg.recallNotify && notice.$type === "group_recall") {
37
- if (notice.$channel.type !== "group")
38
- return;
39
- const operatorName = notice.$operator?.name || notice.$operator?.id || "某人";
40
- const msg = `⚠️ ${operatorName} 撤回了一条消息`;
41
- try {
42
- const adapter = plugin.inject(notice.$adapter);
43
- if (!adapter?.sendMessage)
44
- return;
45
- await adapter.sendMessage({
46
- context: notice.$adapter,
47
- endpoint: notice.$endpoint,
48
- content: msg,
49
- id: notice.$channel.id,
50
- type: notice.$channel.type,
51
- });
52
- }
53
- catch (e) {
54
- logger.warn(formatCompact({
55
- op: "recall_notice",
56
- ok: false,
57
- error: e instanceof Error ? e.message : String(e),
58
- }));
59
- }
60
- }
61
- });
62
- if (!cfg.keywordReply)
63
- return;
64
- const keywords = new Map();
65
- plugin.root.addMiddleware(async (message, next) => {
66
- if (message.$channel.type !== "group") {
67
- await next();
68
- return;
69
- }
70
- const raw = message.$raw?.trim();
71
- if (!raw) {
72
- await next();
73
- return;
74
- }
75
- for (const [keyword, reply] of keywords) {
76
- if (raw.includes(keyword)) {
77
- await message.$reply?.(reply);
78
- return;
79
- }
80
- }
81
- await next();
82
- });
83
- addCommand(new MessageCommand("添加关键词 <keyword:text> <reply:text>")
84
- .desc("添加一个关键词自动回复对")
85
- .action(async (_message, result) => {
86
- const { keyword, reply } = result.params;
87
- if (!keyword || !reply)
88
- return "请提供关键词和回复内容";
89
- keywords.set(keyword, reply);
90
- return `已添加关键词「${keyword}」→「${reply}」`;
91
- }));
92
- addCommand(new MessageCommand("删除关键词 <keyword:text>")
93
- .desc("删除一个关键词")
94
- .action(async (_message, result) => {
95
- const { keyword } = result.params;
96
- if (!keyword)
97
- return "请提供要删除的关键词";
98
- if (!keywords.has(keyword))
99
- return `关键词「${keyword}」不存在`;
100
- keywords.delete(keyword);
101
- return `已删除关键词「${keyword}」`;
102
- }));
103
- addCommand(new MessageCommand("关键词列表")
104
- .desc("查看所有关键词回复对")
105
- .action(async () => {
106
- if (keywords.size === 0)
107
- return "当前没有设置任何关键词";
108
- const lines = Array.from(keywords.entries()).map(([k, v], i) => `${i + 1}. 「${k}」→「${v}」`);
109
- return `关键词列表(共 ${keywords.size} 条):\n${lines.join("\n")}`;
110
- }));
111
- addTool(new ZhinTool("group_announce")
112
- .desc("向群聊发送公告/通知消息")
113
- .keyword("群公告", "通知", "announce")
114
- .param("message", { type: "string", description: "要发送的公告内容" }, true)
115
- .execute(async (args) => {
116
- const content = args.message;
117
- if (!content?.trim())
118
- return "公告内容不能为空";
119
- return `📢 群公告:\n${content}`;
120
- })
121
- .toTool());
122
- }
123
- //# sourceMappingURL=admin.js.map
package/lib/admin.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EAEd,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAqB;IACjE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC;IACpC,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;IAE1C,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO;QAErE,IAAI,MAAM,CAAC,KAAK,KAAK,uBAAuB,EAAE,CAAC;YAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO;YAC7C,MAAM,UAAU,GACd,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,KAAK,CAAC;YACtD,MAAM,UAAU,GAAG,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAiB,CAAQ,CAAC;gBAC/D,IAAI,CAAC,OAAO,EAAE,WAAW;oBAAE,OAAO;gBAClC,MAAM,OAAO,CAAC,WAAW,CAAC;oBACxB,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,QAAQ,EAAE,MAAM,CAAC,SAAS;oBAC1B,OAAO,EAAE,UAAU;oBACnB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACtB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CACT,aAAa,CAAC;oBACZ,EAAE,EAAE,SAAS;oBACb,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC,CACH,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO;YAC7C,MAAM,YAAY,GAChB,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,IAAI,CAAC;YACzD,MAAM,GAAG,GAAG,MAAM,YAAY,UAAU,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAiB,CAAQ,CAAC;gBAC/D,IAAI,CAAC,OAAO,EAAE,WAAW;oBAAE,OAAO;gBAClC,MAAM,OAAO,CAAC,WAAW,CAAC;oBACxB,OAAO,EAAE,MAAM,CAAC,QAAQ;oBACxB,QAAQ,EAAE,MAAM,CAAC,SAAS;oBAC1B,OAAO,EAAE,GAAG;oBACZ,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;oBACtB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CACT,aAAa,CAAC;oBACZ,EAAE,EAAE,eAAe;oBACnB,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,UAAU,CACR,IAAI,cAAc,CAAC,mCAAmC,CAAC;SACpD,IAAI,CAAC,cAAc,CAAC;SACpB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,MAGjC,CAAC;QACF,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;YAAE,OAAO,aAAa,CAAC;QAC7C,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,UAAU,OAAO,MAAM,KAAK,GAAG,CAAC;IACzC,CAAC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,IAAI,cAAc,CAAC,sBAAsB,CAAC;SACvC,IAAI,CAAC,SAAS,CAAC;SACf,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAA6B,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,OAAO,YAAY,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,OAAO,MAAM,CAAC;QACxD,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,UAAU,OAAO,GAAG,CAAC;IAC9B,CAAC,CAAC,CACL,CAAC;IAEF,UAAU,CACR,IAAI,cAAc,CAAC,OAAO,CAAC;SACxB,IAAI,CAAC,YAAY,CAAC;SAClB,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,aAAa,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAC9C,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CACzC,CAAC;QACF,OAAO,WAAW,QAAQ,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7D,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,CACL,IAAI,QAAQ,CAAC,gBAAgB,CAAC;SAC3B,IAAI,CAAC,cAAc,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC;SAChC,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC;SACnE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACxC,OAAO,YAAY,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;SACD,MAAM,EAAE,CACZ,CAAC;AACJ,CAAC"}
package/lib/checkin.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { type Plugin } from "zhin.js";
2
- import type { GroupSuiteConfig } from "./config.js";
3
- export declare function getCheckinModel(): any;
4
- export declare function registerCheckin(plugin: Plugin, cfg: GroupSuiteConfig): void;
5
- //# sourceMappingURL=checkin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkin.d.ts","sourceRoot":"","sources":["../src/checkin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAepD,wBAAgB,eAAe,IAAI,GAAG,CAErC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CA+K3E"}
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,EAA0C,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAiB9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAgbN"}