@zhin.js/plugin-group-suite 3.0.2 → 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.
- package/README.md +42 -58
- package/agent/tools/group_announce.ts +2 -2
- package/commands/checkin.ts +12 -0
- package/commands/forget.ts +12 -0
- package/commands/keyword-add/[keyword:string].ts +15 -0
- package/commands/keyword-list.ts +14 -0
- package/commands/keyword-remove/[keyword:string].ts +14 -0
- package/commands/mypoints.ts +12 -0
- package/commands/mystats.ts +12 -0
- package/commands/rank.ts +12 -0
- package/commands/stats-rank.ts +20 -0
- package/commands/stats-week.ts +20 -0
- package/commands/stats.ts +21 -0
- package/commands/teach-list/[page:number=1].ts +13 -0
- package/commands/teach-regex.ts +12 -0
- package/commands/teach.ts +12 -0
- package/lib/analysis-card.d.ts +4 -0
- package/lib/analysis-card.d.ts.map +1 -0
- package/lib/analysis-card.js.map +1 -0
- package/lib/analysis.d.ts +95 -0
- package/lib/analysis.d.ts.map +1 -0
- package/lib/analysis.js.map +1 -0
- package/lib/card-layout.d.ts +27 -0
- package/lib/card-layout.d.ts.map +1 -0
- package/lib/card-layout.js.map +1 -0
- package/lib/checkin-lib.d.ts +18 -0
- package/lib/checkin-lib.d.ts.map +1 -0
- package/lib/checkin-lib.js +118 -0
- package/lib/checkin-lib.js.map +1 -0
- package/lib/config.d.ts +15 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +19 -0
- package/lib/config.js.map +1 -0
- package/lib/db-store.d.ts +12 -0
- package/lib/db-store.d.ts.map +1 -0
- package/lib/db-store.js +38 -0
- package/lib/db-store.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -0
- package/lib/keyword-store.d.ts +6 -0
- package/lib/keyword-store.d.ts.map +1 -0
- package/lib/keyword-store.js +21 -0
- package/lib/keyword-store.js.map +1 -0
- package/lib/memory-store.d.ts +29 -0
- package/lib/memory-store.d.ts.map +1 -0
- package/lib/memory-store.js +59 -0
- package/lib/memory-store.js.map +1 -0
- package/lib/runtime-state.d.ts +24 -0
- package/lib/runtime-state.d.ts.map +1 -0
- package/lib/runtime-state.js +21 -0
- package/lib/runtime-state.js.map +1 -0
- package/lib/shared-runtime.d.ts +20 -0
- package/lib/shared-runtime.d.ts.map +1 -0
- package/lib/shared-runtime.js +34 -0
- package/lib/shared-runtime.js.map +1 -0
- package/lib/stats-card.d.ts +5 -0
- package/lib/stats-card.d.ts.map +1 -0
- package/lib/stats-card.js.map +1 -0
- package/lib/stats-data.d.ts +32 -0
- package/lib/stats-data.d.ts.map +1 -0
- package/lib/stats-data.js.map +1 -0
- package/lib/stats-lib.d.ts +29 -0
- package/lib/stats-lib.d.ts.map +1 -0
- package/lib/stats-lib.js +173 -0
- package/lib/stats-lib.js.map +1 -0
- package/lib/tables.d.ts +4 -0
- package/lib/tables.d.ts.map +1 -0
- package/lib/tables.js +40 -0
- package/lib/tables.js.map +1 -0
- package/lib/teach-lib.d.ts +22 -0
- package/lib/teach-lib.d.ts.map +1 -0
- package/lib/teach-lib.js +233 -0
- package/lib/teach-lib.js.map +1 -0
- package/middlewares/keyword-reply.ts +37 -0
- package/middlewares/stats-count.ts +22 -0
- package/middlewares/teach-reply.ts +22 -0
- package/package.json +37 -15
- package/plugin.ts +39 -0
- package/schema.json +17 -0
- package/src/checkin-lib.ts +148 -0
- package/src/config.ts +23 -57
- package/src/db-store.ts +51 -0
- package/src/index.ts +47 -33
- package/src/keyword-store.ts +24 -0
- package/src/memory-store.ts +88 -0
- package/src/runtime-state.ts +44 -0
- package/src/shared-runtime.ts +44 -0
- package/src/stats-lib.ts +202 -0
- package/src/tables.ts +46 -0
- package/src/teach-lib.ts +301 -0
- package/tools/checkin-query/handler.ts +2 -2
- package/tools/checkin-rank/handler.ts +1 -1
- package/tools/stats-query/handler.ts +2 -2
- package/tools/stats-user/handler.ts +3 -2
- package/lib/agent/tools/group_announce.js +0 -13
- package/lib/agent/tools/group_announce.js.map +0 -1
- package/lib/src/admin.js +0 -114
- package/lib/src/admin.js.map +0 -1
- package/lib/src/analysis-card.js.map +0 -1
- package/lib/src/analysis.js.map +0 -1
- package/lib/src/card-layout.js.map +0 -1
- package/lib/src/checkin.js +0 -168
- package/lib/src/checkin.js.map +0 -1
- package/lib/src/config.js +0 -41
- package/lib/src/config.js.map +0 -1
- package/lib/src/daily-analysis.js +0 -333
- package/lib/src/daily-analysis.js.map +0 -1
- package/lib/src/index.js +0 -30
- package/lib/src/index.js.map +0 -1
- package/lib/src/shared.js +0 -40
- package/lib/src/shared.js.map +0 -1
- package/lib/src/stats-card.js.map +0 -1
- package/lib/src/stats-data.js.map +0 -1
- package/lib/src/stats.js +0 -258
- package/lib/src/stats.js.map +0 -1
- package/lib/src/teach.js +0 -294
- package/lib/src/teach.js.map +0 -1
- package/plugin.yml +0 -3
- package/src/admin.ts +0 -136
- package/src/checkin.ts +0 -196
- package/src/daily-analysis.ts +0 -458
- package/src/shared.ts +0 -51
- package/src/stats.ts +0 -298
- package/src/teach.ts +0 -307
- /package/lib/{src/analysis-card.js → analysis-card.js} +0 -0
- /package/lib/{src/analysis.js → analysis.js} +0 -0
- /package/lib/{src/card-layout.js → card-layout.js} +0 -0
- /package/lib/{src/stats-card.js → stats-card.js} +0 -0
- /package/lib/{src/stats-data.js → stats-data.js} +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { getCheckinModel } from './db-store.js';
|
|
2
|
+
import { randomInt, resolveContextKey, resolveSender, todayStr, ts, yesterdayStr, } from './shared-runtime.js';
|
|
3
|
+
async function getOrCreateUser(model, userId, userName, ctxType, ctxId) {
|
|
4
|
+
const rows = (await model.select().where({
|
|
5
|
+
user_id: userId,
|
|
6
|
+
context_type: ctxType,
|
|
7
|
+
context_id: ctxId,
|
|
8
|
+
}));
|
|
9
|
+
if (rows.length > 0)
|
|
10
|
+
return rows[0];
|
|
11
|
+
await model.insert({
|
|
12
|
+
user_id: userId,
|
|
13
|
+
user_name: userName,
|
|
14
|
+
points: 0,
|
|
15
|
+
total_checkins: 0,
|
|
16
|
+
streak: 0,
|
|
17
|
+
max_streak: 0,
|
|
18
|
+
last_checkin: '',
|
|
19
|
+
context_type: ctxType,
|
|
20
|
+
context_id: ctxId,
|
|
21
|
+
created_at: ts(),
|
|
22
|
+
updated_at: ts(),
|
|
23
|
+
});
|
|
24
|
+
const created = (await model.select().where({
|
|
25
|
+
user_id: userId,
|
|
26
|
+
context_type: ctxType,
|
|
27
|
+
context_id: ctxId,
|
|
28
|
+
}));
|
|
29
|
+
return created[0] ?? null;
|
|
30
|
+
}
|
|
31
|
+
export async function doCheckin(input, cfg, runtime) {
|
|
32
|
+
const M = getCheckinModel(runtime?.db);
|
|
33
|
+
if (!M)
|
|
34
|
+
return '签到数据库尚未就绪,请稍后重试';
|
|
35
|
+
const { id: userId, name: userName } = resolveSender(input);
|
|
36
|
+
if (!userId)
|
|
37
|
+
return '无法获取用户信息';
|
|
38
|
+
const { type: ctxType, id: ctxId } = resolveContextKey(input);
|
|
39
|
+
const user = await getOrCreateUser(M, userId, userName, ctxType, ctxId);
|
|
40
|
+
if (!user)
|
|
41
|
+
return '签到失败,请重试';
|
|
42
|
+
const today = todayStr();
|
|
43
|
+
if (user.last_checkin === today) {
|
|
44
|
+
return `你今天已经签到过了哦~\n当前积分: ${user.points}\n连续签到: ${user.streak} 天`;
|
|
45
|
+
}
|
|
46
|
+
const isConsecutive = user.last_checkin === yesterdayStr();
|
|
47
|
+
const newStreak = isConsecutive ? Number(user.streak) + 1 : 1;
|
|
48
|
+
const base = randomInt(cfg.basePointsMin, cfg.basePointsMax);
|
|
49
|
+
const bonus = Math.min(newStreak * cfg.streakBonus, cfg.streakCap);
|
|
50
|
+
const earned = base + bonus;
|
|
51
|
+
const newPoints = Number(user.points || 0) + earned;
|
|
52
|
+
await M.update({
|
|
53
|
+
points: newPoints,
|
|
54
|
+
total_checkins: Number(user.total_checkins || 0) + 1,
|
|
55
|
+
streak: newStreak,
|
|
56
|
+
max_streak: Math.max(Number(user.max_streak || 0), newStreak),
|
|
57
|
+
last_checkin: today,
|
|
58
|
+
user_name: userName,
|
|
59
|
+
updated_at: ts(),
|
|
60
|
+
}).where({
|
|
61
|
+
user_id: userId,
|
|
62
|
+
context_type: ctxType,
|
|
63
|
+
context_id: ctxId,
|
|
64
|
+
});
|
|
65
|
+
const lines = [`签到成功!`, `基础积分: +${base}`];
|
|
66
|
+
if (bonus > 0)
|
|
67
|
+
lines.push(`连续奖励: +${bonus} (连续${newStreak}天)`);
|
|
68
|
+
lines.push(`本次获得: +${earned}`, `当前积分: ${newPoints}`);
|
|
69
|
+
return lines.join('\n');
|
|
70
|
+
}
|
|
71
|
+
export async function myPoints(input, runtime) {
|
|
72
|
+
const M = getCheckinModel(runtime?.db);
|
|
73
|
+
if (!M)
|
|
74
|
+
return '签到数据库尚未就绪';
|
|
75
|
+
const { id: userId } = resolveSender(input);
|
|
76
|
+
const { type: ctxType, id: ctxId } = resolveContextKey(input);
|
|
77
|
+
const rows = (await M.select().where({
|
|
78
|
+
user_id: userId,
|
|
79
|
+
context_type: ctxType,
|
|
80
|
+
context_id: ctxId,
|
|
81
|
+
}));
|
|
82
|
+
if (rows.length === 0)
|
|
83
|
+
return '你还没有签到记录哦,发送「checkin」开始吧!';
|
|
84
|
+
const u = rows[0];
|
|
85
|
+
const checkedToday = u.last_checkin === todayStr();
|
|
86
|
+
return [
|
|
87
|
+
`${u.user_name || '用户'} 的积分信息`,
|
|
88
|
+
`积分: ${u.points}`,
|
|
89
|
+
`累计签到: ${u.total_checkins} 天`,
|
|
90
|
+
`连续签到: ${u.streak} 天`,
|
|
91
|
+
`最长连续: ${u.max_streak} 天`,
|
|
92
|
+
checkedToday ? '今日已签到 ✓' : '今日未签到',
|
|
93
|
+
].join('\n');
|
|
94
|
+
}
|
|
95
|
+
export async function pointsRank(input, cfg, runtime) {
|
|
96
|
+
const M = getCheckinModel(runtime?.db);
|
|
97
|
+
if (!M)
|
|
98
|
+
return '签到数据库尚未就绪';
|
|
99
|
+
const { type: ctxType, id: ctxId } = resolveContextKey(input);
|
|
100
|
+
const all = (await M.select().where(ctxType === 'global'
|
|
101
|
+
? { context_type: 'global' }
|
|
102
|
+
: { context_type: ctxType, context_id: ctxId }));
|
|
103
|
+
if (all.length === 0)
|
|
104
|
+
return '还没有人签到过哦~';
|
|
105
|
+
const sorted = all.sort((a, b) => Number(b.points || 0) - Number(a.points || 0));
|
|
106
|
+
const top = sorted.slice(0, cfg.rankSize);
|
|
107
|
+
const medals = ['🥇', '🥈', '🥉'];
|
|
108
|
+
const lines = top.map((u, i) => {
|
|
109
|
+
const prefix = i < 3 ? medals[i] : `${i + 1}.`;
|
|
110
|
+
return `${prefix} ${u.user_name || u.user_id} — ${u.points}分 (${u.total_checkins}天)`;
|
|
111
|
+
});
|
|
112
|
+
const title = ctxType === 'group' ? '本群积分排行' : '全局积分排行';
|
|
113
|
+
const { id: userId } = resolveSender(input);
|
|
114
|
+
const myRank = sorted.findIndex((u) => u.user_id === userId);
|
|
115
|
+
const footer = myRank >= 0 ? `\n你的排名: 第${myRank + 1}名` : '';
|
|
116
|
+
return `${title}\n${lines.join('\n')}${footer}`;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=checkin-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkin-lib.js","sourceRoot":"","sources":["../src/checkin-lib.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface GroupSuiteConfig {
|
|
2
|
+
keywordReply: boolean;
|
|
3
|
+
basePointsMin: number;
|
|
4
|
+
basePointsMax: number;
|
|
5
|
+
streakBonus: number;
|
|
6
|
+
streakCap: number;
|
|
7
|
+
rankSize: number;
|
|
8
|
+
teachMaxPerGroup: number;
|
|
9
|
+
teachCooldownMs: number;
|
|
10
|
+
teachAllowRegex: boolean;
|
|
11
|
+
teachPageSize: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const DEFAULT_GROUP_SUITE_CONFIG: GroupSuiteConfig;
|
|
14
|
+
export declare function resolveGroupSuiteConfig(raw: Partial<GroupSuiteConfig> | undefined): GroupSuiteConfig;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAWxC,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,SAAS,GACzC,gBAAgB,CAKlB"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const DEFAULT_GROUP_SUITE_CONFIG = {
|
|
2
|
+
keywordReply: false,
|
|
3
|
+
basePointsMin: 10,
|
|
4
|
+
basePointsMax: 30,
|
|
5
|
+
streakBonus: 5,
|
|
6
|
+
streakCap: 50,
|
|
7
|
+
rankSize: 10,
|
|
8
|
+
teachMaxPerGroup: 200,
|
|
9
|
+
teachCooldownMs: 3000,
|
|
10
|
+
teachAllowRegex: true,
|
|
11
|
+
teachPageSize: 10,
|
|
12
|
+
};
|
|
13
|
+
export function resolveGroupSuiteConfig(raw) {
|
|
14
|
+
return {
|
|
15
|
+
...DEFAULT_GROUP_SUITE_CONFIG,
|
|
16
|
+
...raw,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,0BAA0B,GAAqB;IAC1D,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,gBAAgB,EAAE,GAAG;IACrB,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,GAA0C;IAE1C,OAAO;QACL,GAAG,0BAA0B;QAC7B,GAAG,GAAG;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type GroupSuiteMemoryDb, type GroupSuiteModel } from './memory-store.js';
|
|
2
|
+
/** Ensure an in-memory store when Runtime DatabaseFeature Resource is not wired yet. */
|
|
3
|
+
export declare function ensureGroupSuiteMemoryDb(): GroupSuiteMemoryDb;
|
|
4
|
+
export declare function getGroupSuiteDb(): GroupSuiteMemoryDb | null;
|
|
5
|
+
export declare function setGroupSuiteDb(db: GroupSuiteMemoryDb | null): void;
|
|
6
|
+
export declare function registerGroupSuiteDb(db: GroupSuiteMemoryDb): () => void;
|
|
7
|
+
/** Test helper: clear module store. */
|
|
8
|
+
export declare function resetGroupSuiteDb(): void;
|
|
9
|
+
export declare function getCheckinModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
|
|
10
|
+
export declare function getTeachModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
|
|
11
|
+
export declare function getStatsModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
|
|
12
|
+
//# sourceMappingURL=db-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-store.d.ts","sourceRoot":"","sources":["../src/db-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAK3B,wFAAwF;AACxF,wBAAgB,wBAAwB,IAAI,kBAAkB,CAG7D;AAED,wBAAgB,eAAe,IAAI,kBAAkB,GAAG,IAAI,CAE3D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAOvE;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,eAAe,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE9E;AAED,wBAAgB,aAAa,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE5E;AAED,wBAAgB,aAAa,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE5E"}
|
package/lib/db-store.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CHECKIN_TABLE, createInMemoryGroupSuiteDb, STATS_TABLE, TEACH_TABLE, } from './memory-store.js';
|
|
2
|
+
let _db = null;
|
|
3
|
+
const registrations = [];
|
|
4
|
+
/** Ensure an in-memory store when Runtime DatabaseFeature Resource is not wired yet. */
|
|
5
|
+
export function ensureGroupSuiteMemoryDb() {
|
|
6
|
+
if (!_db)
|
|
7
|
+
_db = createInMemoryGroupSuiteDb();
|
|
8
|
+
return _db;
|
|
9
|
+
}
|
|
10
|
+
export function getGroupSuiteDb() {
|
|
11
|
+
return registrations[registrations.length - 1]?.value ?? ensureGroupSuiteMemoryDb();
|
|
12
|
+
}
|
|
13
|
+
export function setGroupSuiteDb(db) {
|
|
14
|
+
_db = db;
|
|
15
|
+
}
|
|
16
|
+
export function registerGroupSuiteDb(db) {
|
|
17
|
+
const registration = Object.freeze({ value: db });
|
|
18
|
+
registrations.push(registration);
|
|
19
|
+
return () => {
|
|
20
|
+
const index = registrations.lastIndexOf(registration);
|
|
21
|
+
if (index >= 0)
|
|
22
|
+
registrations.splice(index, 1);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Test helper: clear module store. */
|
|
26
|
+
export function resetGroupSuiteDb() {
|
|
27
|
+
_db = null;
|
|
28
|
+
}
|
|
29
|
+
export function getCheckinModel(db = getGroupSuiteDb()) {
|
|
30
|
+
return db?.models.get(CHECKIN_TABLE) ?? null;
|
|
31
|
+
}
|
|
32
|
+
export function getTeachModel(db = getGroupSuiteDb()) {
|
|
33
|
+
return db?.models.get(TEACH_TABLE) ?? null;
|
|
34
|
+
}
|
|
35
|
+
export function getStatsModel(db = getGroupSuiteDb()) {
|
|
36
|
+
return db?.models.get(STATS_TABLE) ?? null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=db-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-store.js","sourceRoot":"","sources":["../src/db-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,WAAW,EACX,WAAW,GAGZ,MAAM,mBAAmB,CAAC;AAE3B,IAAI,GAAG,GAA8B,IAAI,CAAC;AAC1C,MAAM,aAAa,GAAkD,EAAE,CAAC;AAExE,wFAAwF;AACxF,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,GAAG;QAAE,GAAG,GAAG,0BAA0B,EAAE,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,wBAAwB,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAA6B;IAC3D,GAAG,GAAG,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAsB;IACzD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,CAAC;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,iBAAiB;IAC/B,GAAG,GAAG,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,GAAG,eAAe,EAAE;IACpD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,GAAG,eAAe,EAAE;IAClD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,GAAG,eAAe,EAAE;IAClD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DEFAULT_GROUP_SUITE_CONFIG, resolveGroupSuiteConfig, } from './config.js';
|
|
2
|
+
export type { GroupSuiteConfig } from './config.js';
|
|
3
|
+
export { doCheckin, myPoints, pointsRank } from './checkin-lib.js';
|
|
4
|
+
export { addKeyword, listKeywords, matchKeyword, removeKeyword, resetKeywords, } from './keyword-store.js';
|
|
5
|
+
export { ensureGroupSuiteMemoryDb, getCheckinModel, getGroupSuiteDb, getStatsModel, getTeachModel, resetGroupSuiteDb, registerGroupSuiteDb, setGroupSuiteDb, } from './db-store.js';
|
|
6
|
+
export { createGroupSuiteRuntime, groupSuiteRuntimeToken, resolveGroupSuiteRuntime, } from './runtime-state.js';
|
|
7
|
+
export type { GroupSuiteRuntime, PendingStatsIncrement } from './runtime-state.js';
|
|
8
|
+
export { parseTeachPair, resetTeachCooldown, teachAdd, teachForget, teachList, tryTeachReply, } from './teach-lib.js';
|
|
9
|
+
export { flushStatsBuffer, monthStartStr, myStatsText, queryStats, recordMessage, resetStatsBuffer, statsRankText, weekStartStr, } from './stats-lib.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { DEFAULT_GROUP_SUITE_CONFIG, resolveGroupSuiteConfig, } from './config.js';
|
|
2
|
+
export { doCheckin, myPoints, pointsRank } from './checkin-lib.js';
|
|
3
|
+
export { addKeyword, listKeywords, matchKeyword, removeKeyword, resetKeywords, } from './keyword-store.js';
|
|
4
|
+
export { ensureGroupSuiteMemoryDb, getCheckinModel, getGroupSuiteDb, getStatsModel, getTeachModel, resetGroupSuiteDb, registerGroupSuiteDb, setGroupSuiteDb, } from './db-store.js';
|
|
5
|
+
export { createGroupSuiteRuntime, groupSuiteRuntimeToken, resolveGroupSuiteRuntime, } from './runtime-state.js';
|
|
6
|
+
export { parseTeachPair, resetTeachCooldown, teachAdd, teachForget, teachList, tryTeachReply, } from './teach-lib.js';
|
|
7
|
+
export { flushStatsBuffer, monthStartStr, myStatsText, queryStats, recordMessage, resetStatsBuffer, statsRankText, weekStartStr, } from './stats-lib.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function addKeyword(keyword: string, reply: string, store?: Map<string, string>): void;
|
|
2
|
+
export declare function removeKeyword(keyword: string, store?: Map<string, string>): boolean;
|
|
3
|
+
export declare function listKeywords(store?: Map<string, string>): Array<[string, string]>;
|
|
4
|
+
export declare function matchKeyword(text: string, store?: Map<string, string>): string | null;
|
|
5
|
+
export declare function resetKeywords(): void;
|
|
6
|
+
//# sourceMappingURL=keyword-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyword-store.d.ts","sourceRoot":"","sources":["../src/keyword-store.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,IAAI,CAEjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,OAAO,CAExE;AAED,wBAAgB,YAAY,CAAC,KAAK,sBAAW,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEtE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,MAAM,GAAG,IAAI,CAK1E;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const keywords = new Map();
|
|
2
|
+
export function addKeyword(keyword, reply, store = keywords) {
|
|
3
|
+
store.set(keyword, reply);
|
|
4
|
+
}
|
|
5
|
+
export function removeKeyword(keyword, store = keywords) {
|
|
6
|
+
return store.delete(keyword);
|
|
7
|
+
}
|
|
8
|
+
export function listKeywords(store = keywords) {
|
|
9
|
+
return Array.from(store.entries());
|
|
10
|
+
}
|
|
11
|
+
export function matchKeyword(text, store = keywords) {
|
|
12
|
+
for (const [keyword, reply] of store) {
|
|
13
|
+
if (text.includes(keyword))
|
|
14
|
+
return reply;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function resetKeywords() {
|
|
19
|
+
keywords.clear();
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=keyword-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyword-store.js","sourceRoot":"","sources":["../src/keyword-store.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa,EAAE,KAAK,GAAG,QAAQ;IACzE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAK,GAAG,QAAQ;IAC7D,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,QAAQ;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAK,GAAG,QAAQ;IACzD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory group-suite models (slice-2) until Plugin Runtime DatabaseFeature Resource lands.
|
|
3
|
+
*/
|
|
4
|
+
export interface GroupSuiteRow extends Record<string, unknown> {
|
|
5
|
+
id: string;
|
|
6
|
+
}
|
|
7
|
+
export interface GroupSuiteModel {
|
|
8
|
+
select: () => {
|
|
9
|
+
where: (query: Record<string, unknown>) => Promise<GroupSuiteRow[]>;
|
|
10
|
+
then: <TResult1 = GroupSuiteRow[], TResult2 = never>(onfulfilled?: ((value: GroupSuiteRow[]) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null) => Promise<TResult1 | TResult2>;
|
|
11
|
+
};
|
|
12
|
+
insert: (row: Record<string, unknown>) => Promise<GroupSuiteRow>;
|
|
13
|
+
delete: () => {
|
|
14
|
+
where: (query: Record<string, unknown>) => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
update: (patch: Record<string, unknown>) => {
|
|
17
|
+
where: (query: Record<string, unknown>) => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface GroupSuiteMemoryDb {
|
|
21
|
+
models: {
|
|
22
|
+
get: (name: string) => GroupSuiteModel | undefined;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare const CHECKIN_TABLE = "checkin_records";
|
|
26
|
+
export declare const TEACH_TABLE = "teach_qa";
|
|
27
|
+
export declare const STATS_TABLE = "message_stats";
|
|
28
|
+
export declare function createInMemoryGroupSuiteDb(): GroupSuiteMemoryDb;
|
|
29
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,QAAQ,GAAG,aAAa,EAAE,EAAE,QAAQ,GAAG,KAAK,EACjD,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACnF,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,KACxE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;KACnC,CAAC;IACF,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,EAAE,MAAM;QAAE,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1D,CAAC;CACH;AA6CD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AAED,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAE3C,wBAAgB,0BAA0B,IAAI,kBAAkB,CAW/D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory group-suite models (slice-2) until Plugin Runtime DatabaseFeature Resource lands.
|
|
3
|
+
*/
|
|
4
|
+
function createMemoryModel() {
|
|
5
|
+
const rows = [];
|
|
6
|
+
let nextId = 1;
|
|
7
|
+
function matches(row, query) {
|
|
8
|
+
return Object.entries(query).every(([key, value]) => row[key] === value);
|
|
9
|
+
}
|
|
10
|
+
function all() {
|
|
11
|
+
return rows.map((row) => ({ ...row }));
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
select: () => {
|
|
15
|
+
const promise = Promise.resolve(all());
|
|
16
|
+
return {
|
|
17
|
+
where: async (query) => rows.filter((row) => matches(row, query)).map((row) => ({ ...row })),
|
|
18
|
+
then: (onfulfilled, onrejected) => promise.then(onfulfilled, onrejected),
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
insert: async (row) => {
|
|
22
|
+
const withId = { id: String(nextId++), ...row };
|
|
23
|
+
rows.push(withId);
|
|
24
|
+
return { ...withId };
|
|
25
|
+
},
|
|
26
|
+
delete: () => ({
|
|
27
|
+
where: async (query) => {
|
|
28
|
+
for (let i = rows.length - 1; i >= 0; i -= 1) {
|
|
29
|
+
if (matches(rows[i], query))
|
|
30
|
+
rows.splice(i, 1);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
update: (patch) => ({
|
|
35
|
+
where: async (query) => {
|
|
36
|
+
for (const row of rows) {
|
|
37
|
+
if (matches(row, query))
|
|
38
|
+
Object.assign(row, patch);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export const CHECKIN_TABLE = 'checkin_records';
|
|
45
|
+
export const TEACH_TABLE = 'teach_qa';
|
|
46
|
+
export const STATS_TABLE = 'message_stats';
|
|
47
|
+
export function createInMemoryGroupSuiteDb() {
|
|
48
|
+
const models = new Map([
|
|
49
|
+
[CHECKIN_TABLE, createMemoryModel()],
|
|
50
|
+
[TEACH_TABLE, createMemoryModel()],
|
|
51
|
+
[STATS_TABLE, createMemoryModel()],
|
|
52
|
+
]);
|
|
53
|
+
return {
|
|
54
|
+
models: {
|
|
55
|
+
get: (name) => models.get(name),
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GroupSuiteMemoryDb } from './memory-store.js';
|
|
2
|
+
export interface PendingStatsIncrement {
|
|
3
|
+
user_id: string;
|
|
4
|
+
user_name: string;
|
|
5
|
+
group_id: string;
|
|
6
|
+
date: string;
|
|
7
|
+
count: number;
|
|
8
|
+
}
|
|
9
|
+
/** All mutable state owned by one group-suite plugin instance. */
|
|
10
|
+
export interface GroupSuiteRuntime {
|
|
11
|
+
readonly db: GroupSuiteMemoryDb;
|
|
12
|
+
readonly keywords: Map<string, string>;
|
|
13
|
+
readonly teachCooldowns: Map<string, number>;
|
|
14
|
+
readonly statsBuffer: Map<string, PendingStatsIncrement>;
|
|
15
|
+
}
|
|
16
|
+
export declare const groupSuiteRuntimeToken: import("@zhin.js/plugin-runtime").Token<GroupSuiteRuntime>;
|
|
17
|
+
export declare function createGroupSuiteRuntime(db: GroupSuiteMemoryDb): GroupSuiteRuntime;
|
|
18
|
+
export declare function resolveGroupSuiteRuntime(context: {
|
|
19
|
+
owner?: {
|
|
20
|
+
id?: unknown;
|
|
21
|
+
};
|
|
22
|
+
use<T>(token: typeof groupSuiteRuntimeToken): T;
|
|
23
|
+
}): GroupSuiteRuntime | undefined;
|
|
24
|
+
//# sourceMappingURL=runtime-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,sBAAsB,4DAGlC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,kBAAkB,GAAG,iBAAiB,CAOjF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,CAAC,CAAC;CACjD,GAAG,iBAAiB,GAAG,SAAS,CAOhC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createToken } from '@zhin.js/plugin-runtime';
|
|
2
|
+
export const groupSuiteRuntimeToken = createToken('zhin.group-suite.runtime', 'Owner-scoped Group Suite database and ephemeral state');
|
|
3
|
+
export function createGroupSuiteRuntime(db) {
|
|
4
|
+
return {
|
|
5
|
+
db,
|
|
6
|
+
keywords: new Map(),
|
|
7
|
+
teachCooldowns: new Map(),
|
|
8
|
+
statsBuffer: new Map(),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function resolveGroupSuiteRuntime(context) {
|
|
12
|
+
try {
|
|
13
|
+
return context.use(groupSuiteRuntimeToken);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (context.owner?.id)
|
|
17
|
+
throw error;
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=runtime-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAmBtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAC/C,0BAA0B,EAC1B,uDAAuD,CACxD,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,EAAsB;IAC5D,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAGxC;IACC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAsB,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;YAAE,MAAM,KAAK,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function todayStr(): string;
|
|
2
|
+
export declare function yesterdayStr(): string;
|
|
3
|
+
export declare function ts(): string;
|
|
4
|
+
export declare function randomInt(min: number, max: number): number;
|
|
5
|
+
/** Runtime Message → group/global context */
|
|
6
|
+
export declare function resolveContextKey(input: {
|
|
7
|
+
target?: string;
|
|
8
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
9
|
+
}): {
|
|
10
|
+
type: string;
|
|
11
|
+
id: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function resolveSender(input: {
|
|
14
|
+
sender?: string;
|
|
15
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
16
|
+
}): {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=shared-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-runtime.d.ts","sourceRoot":"","sources":["../src/shared-runtime.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAGjC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC9C,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAU/B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC9C,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAK/B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function todayStr() {
|
|
2
|
+
const d = new Date();
|
|
3
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
4
|
+
}
|
|
5
|
+
export function yesterdayStr() {
|
|
6
|
+
const d = new Date();
|
|
7
|
+
d.setDate(d.getDate() - 1);
|
|
8
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
9
|
+
}
|
|
10
|
+
export function ts() {
|
|
11
|
+
return new Date().toISOString();
|
|
12
|
+
}
|
|
13
|
+
export function randomInt(min, max) {
|
|
14
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
15
|
+
}
|
|
16
|
+
/** Runtime Message → group/global context */
|
|
17
|
+
export function resolveContextKey(input) {
|
|
18
|
+
const meta = input.metadata ?? {};
|
|
19
|
+
const channelType = String(meta.type ?? meta.channelType ?? '');
|
|
20
|
+
if (channelType === 'group' || channelType === 'guild') {
|
|
21
|
+
return { type: 'group', id: String(input.target ?? meta.channelId ?? '') };
|
|
22
|
+
}
|
|
23
|
+
if (input.target && channelType !== 'private') {
|
|
24
|
+
return { type: 'group', id: String(input.target) };
|
|
25
|
+
}
|
|
26
|
+
return { type: 'global', id: '' };
|
|
27
|
+
}
|
|
28
|
+
export function resolveSender(input) {
|
|
29
|
+
const meta = input.metadata ?? {};
|
|
30
|
+
const id = String(input.sender ?? meta.senderId ?? '');
|
|
31
|
+
const name = String(meta.senderName ?? meta.name ?? '用户');
|
|
32
|
+
return { id, name };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=shared-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-runtime.js","sourceRoot":"","sources":["../src/shared-runtime.ts"],"names":[],"mappings":"AAAA,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,YAAY;IAC1B,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3B,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,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAAC,KAGjC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAChE,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAG7B;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC1D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MyStatsReportData, StatsRankReportData } from "./stats-data.js";
|
|
2
|
+
export declare const STATS_REPORT_CANVAS: "#d8dce3";
|
|
3
|
+
export declare function buildStatsRankHtml(data: StatsRankReportData): string;
|
|
4
|
+
export declare function buildMyStatsHtml(data: MyStatsReportData): string;
|
|
5
|
+
//# sourceMappingURL=stats-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-card.d.ts","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,eAAO,MAAM,mBAAmB,WAAoB,CAAC;AAIrD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAiCpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAwBhE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-card.js","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface StatsRankEntry {
|
|
2
|
+
rank: number;
|
|
3
|
+
userId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
count: number;
|
|
6
|
+
percent: number;
|
|
7
|
+
}
|
|
8
|
+
export interface StatsRankReportData {
|
|
9
|
+
title: string;
|
|
10
|
+
entries: StatsRankEntry[];
|
|
11
|
+
participantCount: number;
|
|
12
|
+
totalMessages: number;
|
|
13
|
+
myRank?: number;
|
|
14
|
+
myCount?: number;
|
|
15
|
+
empty?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface MyStatsReportData {
|
|
18
|
+
userName: string;
|
|
19
|
+
scope: string;
|
|
20
|
+
todayCount: number;
|
|
21
|
+
weekCount: number;
|
|
22
|
+
monthCount: number;
|
|
23
|
+
totalCount: number;
|
|
24
|
+
activeDays: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function buildStatsRankReportData(stats: Map<string, {
|
|
27
|
+
name: string;
|
|
28
|
+
count: number;
|
|
29
|
+
}>, title: string, size: number, myUserId?: string): StatsRankReportData;
|
|
30
|
+
export declare function formatRankText(data: StatsRankReportData): string;
|
|
31
|
+
export declare function formatMyStatsText(data: MyStatsReportData): string;
|
|
32
|
+
//# sourceMappingURL=stats-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-data.d.ts","sourceRoot":"","sources":["../src/stats-data.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACnD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,mBAAmB,CA0CrB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAYhE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CASjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-data.js","sourceRoot":"","sources":["../src/stats-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { GroupSuiteConfig } from './config.js';
|
|
2
|
+
import type { GroupSuiteRuntime } from './runtime-state.js';
|
|
3
|
+
export declare function weekStartStr(): string;
|
|
4
|
+
export declare function monthStartStr(): string;
|
|
5
|
+
export declare function resolveGroupId(input: {
|
|
6
|
+
target?: string;
|
|
7
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
8
|
+
}): string;
|
|
9
|
+
export declare function recordMessage(input: {
|
|
10
|
+
sender?: string;
|
|
11
|
+
target?: string;
|
|
12
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
13
|
+
}, runtime?: GroupSuiteRuntime): void;
|
|
14
|
+
export declare function flushStatsBuffer(runtime?: GroupSuiteRuntime): Promise<void>;
|
|
15
|
+
export declare function queryStats(groupId: string, fromDate: string, runtime?: GroupSuiteRuntime): Promise<Map<string, {
|
|
16
|
+
name: string;
|
|
17
|
+
count: number;
|
|
18
|
+
}>>;
|
|
19
|
+
type MessageInput = {
|
|
20
|
+
sender?: string;
|
|
21
|
+
target?: string;
|
|
22
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
23
|
+
};
|
|
24
|
+
export declare function statsRankText(input: MessageInput, cfg: GroupSuiteConfig, fromDate: string, title: string, runtime?: GroupSuiteRuntime): Promise<string>;
|
|
25
|
+
export declare function myStatsText(input: MessageInput, runtime?: GroupSuiteRuntime): Promise<string>;
|
|
26
|
+
/** Test helper */
|
|
27
|
+
export declare function resetStatsBuffer(): void;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=stats-lib.d.ts.map
|