@zhin.js/plugin-group-suite 1.1.5 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/analysis-card.d.ts +1 -1
- package/lib/analysis-card.d.ts.map +1 -1
- package/lib/analysis-card.js +37 -20
- package/lib/analysis-card.js.map +1 -1
- package/lib/card-layout.d.ts +6 -3
- package/lib/card-layout.d.ts.map +1 -1
- package/lib/card-layout.js +4 -3
- package/lib/card-layout.js.map +1 -1
- package/lib/stats-card.d.ts +2 -2
- package/lib/stats-card.d.ts.map +1 -1
- package/lib/stats-card.js +56 -25
- package/lib/stats-card.js.map +1 -1
- package/package.json +10 -9
- package/src/analysis-card.ts +63 -36
- package/src/card-layout.ts +6 -6
- package/src/stats-card.ts +89 -41
package/lib/analysis-card.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { AnalysisReportData } from "./analysis.js";
|
|
2
2
|
export declare const ANALYSIS_REPORT_CANVAS: "#d8dce3";
|
|
3
|
-
export declare function buildAnalysisReportHtml(data: AnalysisReportData): string
|
|
3
|
+
export declare function buildAnalysisReportHtml(data: AnalysisReportData): Promise<string>;
|
|
4
4
|
//# sourceMappingURL=analysis-card.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-card.d.ts","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQxD,eAAO,MAAM,sBAAsB,WAAoB,CAAC;AAUxD,
|
|
1
|
+
{"version":3,"file":"analysis-card.d.ts","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQxD,eAAO,MAAM,sBAAsB,WAAoB,CAAC;AAUxD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,CA8FjB"}
|
package/lib/analysis-card.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, renderToHtml } from "@zhin.js/jsx";
|
|
2
|
+
import { BarChart, CardHeader, ProfileRow, QuoteCard, Row, Section, StatChip, TopicItem, } from "@zhin.js/components";
|
|
2
3
|
import { CARD_THEME, cardShell, elevatedCard, formatCount, } from "./card-layout.js";
|
|
3
4
|
export const ANALYSIS_REPORT_CANVAS = CARD_THEME.canvas;
|
|
4
5
|
const T = {
|
|
@@ -8,16 +9,16 @@ const T = {
|
|
|
8
9
|
accentChars: CARD_THEME.accentDisk,
|
|
9
10
|
accentHour: CARD_THEME.barWarn,
|
|
10
11
|
};
|
|
11
|
-
export function buildAnalysisReportHtml(data) {
|
|
12
|
+
export async function buildAnalysisReportHtml(data) {
|
|
12
13
|
const { stats, channelName, days, startDate, endDate, llm } = data;
|
|
13
14
|
const title = channelName ? `${channelName} · 群日常分析` : "群日常分析";
|
|
14
15
|
const peakLabel = `${String(stats.mostActiveHour).padStart(2, "0")}:00`;
|
|
15
16
|
const hourlyValues = Array.from({ length: 24 }, (_, hour) => stats.hourlyDistribution[hour] || 0);
|
|
16
17
|
const llmBlocks = [
|
|
17
18
|
llm?.topics?.length
|
|
18
|
-
?
|
|
19
|
+
? jsx(Section, {
|
|
19
20
|
title: "热门话题",
|
|
20
|
-
children: llm.topics.map((topic, i) =>
|
|
21
|
+
children: llm.topics.map((topic, i) => jsx(TopicItem, {
|
|
21
22
|
index: i + 1,
|
|
22
23
|
title: topic.topic,
|
|
23
24
|
summary: topic.summary,
|
|
@@ -25,9 +26,9 @@ export function buildAnalysisReportHtml(data) {
|
|
|
25
26
|
})
|
|
26
27
|
: "",
|
|
27
28
|
llm?.quotes?.length
|
|
28
|
-
?
|
|
29
|
+
? jsx(Section, {
|
|
29
30
|
title: "金句精选",
|
|
30
|
-
children: llm.quotes.map((quote, i) =>
|
|
31
|
+
children: llm.quotes.map((quote, i) => jsx(QuoteCard, {
|
|
31
32
|
index: i + 1,
|
|
32
33
|
content: quote.content,
|
|
33
34
|
author: quote.sender,
|
|
@@ -36,9 +37,9 @@ export function buildAnalysisReportHtml(data) {
|
|
|
36
37
|
})
|
|
37
38
|
: "",
|
|
38
39
|
llm?.userTitles?.length
|
|
39
|
-
?
|
|
40
|
+
? jsx(Section, {
|
|
40
41
|
title: "用户画像",
|
|
41
|
-
children: llm.userTitles.map((user, i) =>
|
|
42
|
+
children: llm.userTitles.map((user, i) => jsx(ProfileRow, {
|
|
42
43
|
index: i + 1,
|
|
43
44
|
name: user.name,
|
|
44
45
|
badge: user.title,
|
|
@@ -46,25 +47,41 @@ export function buildAnalysisReportHtml(data) {
|
|
|
46
47
|
})),
|
|
47
48
|
})
|
|
48
49
|
: "",
|
|
49
|
-
]
|
|
50
|
+
];
|
|
50
51
|
const body = elevatedCard([
|
|
51
|
-
|
|
52
|
+
jsx(CardHeader, {
|
|
52
53
|
title,
|
|
53
|
-
|
|
54
|
+
subtitle: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
|
|
54
55
|
}),
|
|
55
|
-
|
|
56
|
+
jsx(Row, {
|
|
56
57
|
children: [
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
jsx(StatChip, {
|
|
59
|
+
label: "消息",
|
|
60
|
+
value: formatCount(stats.messageCount),
|
|
61
|
+
accent: T.accentMsg,
|
|
62
|
+
}),
|
|
63
|
+
jsx(StatChip, {
|
|
64
|
+
label: "参与",
|
|
65
|
+
value: formatCount(stats.participantCount),
|
|
66
|
+
accent: T.accentPeople,
|
|
67
|
+
}),
|
|
68
|
+
jsx(StatChip, {
|
|
69
|
+
label: "字数",
|
|
70
|
+
value: formatCount(stats.totalChars),
|
|
71
|
+
accent: T.accentChars,
|
|
72
|
+
}),
|
|
73
|
+
jsx(StatChip, {
|
|
74
|
+
label: "活跃",
|
|
75
|
+
value: peakLabel,
|
|
76
|
+
accent: T.accentHour,
|
|
77
|
+
}),
|
|
61
78
|
],
|
|
62
79
|
gap: 10,
|
|
63
80
|
style: "margin-bottom:4px",
|
|
64
81
|
}),
|
|
65
|
-
|
|
82
|
+
jsx(Section, {
|
|
66
83
|
title: "每小时消息分布",
|
|
67
|
-
children:
|
|
84
|
+
children: jsx(BarChart, {
|
|
68
85
|
values: hourlyValues,
|
|
69
86
|
peakIndex: stats.mostActiveHour,
|
|
70
87
|
accent: T.accentMsg,
|
|
@@ -72,7 +89,7 @@ export function buildAnalysisReportHtml(data) {
|
|
|
72
89
|
}),
|
|
73
90
|
}),
|
|
74
91
|
llmBlocks,
|
|
75
|
-
]
|
|
76
|
-
return cardShell(body);
|
|
92
|
+
]);
|
|
93
|
+
return renderToHtml(cardShell(body));
|
|
77
94
|
}
|
|
78
95
|
//# sourceMappingURL=analysis-card.js.map
|
package/lib/analysis-card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-card.js","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"analysis-card.js","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"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"}
|
package/lib/card-layout.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type JSXRenderable } from "@zhin.js/jsx";
|
|
2
|
+
import { formatCount, StatChip } from "@zhin.js/components";
|
|
2
3
|
export declare const CARD_CANVAS: "#d8dce3";
|
|
3
4
|
export declare const CARD_THEME: {
|
|
4
5
|
readonly canvas: "#d8dce3";
|
|
@@ -8,6 +9,7 @@ export declare const CARD_THEME: {
|
|
|
8
9
|
readonly text: "#111111";
|
|
9
10
|
readonly textSecondary: "#3f3f46";
|
|
10
11
|
readonly textMuted: "#a1a1aa";
|
|
12
|
+
readonly onAccent: "#ffffff";
|
|
11
13
|
readonly barTrack: "rgba(0,0,0,0.06)";
|
|
12
14
|
readonly barWarn: "#f59e0b";
|
|
13
15
|
readonly barCrit: "#ef4444";
|
|
@@ -15,6 +17,7 @@ export declare const CARD_THEME: {
|
|
|
15
17
|
readonly accentMem: "#3b82f6";
|
|
16
18
|
readonly accentDisk: "#8b5cf6";
|
|
17
19
|
readonly accentSwap: "#ec4899";
|
|
20
|
+
readonly accentRank: "#d97706";
|
|
18
21
|
readonly divider: "rgba(0,0,0,0.06)";
|
|
19
22
|
readonly shadowLg: "0 16px 40px rgba(15,23,42,0.14)";
|
|
20
23
|
readonly shadowMd: "0 8px 22px rgba(15,23,42,0.10)";
|
|
@@ -22,6 +25,6 @@ export declare const CARD_THEME: {
|
|
|
22
25
|
readonly shadowFloor: "rgba(15,23,42,0.07)";
|
|
23
26
|
};
|
|
24
27
|
export { formatCount, StatChip };
|
|
25
|
-
export declare function elevatedCard(inner:
|
|
26
|
-
export declare function cardShell(inner:
|
|
28
|
+
export declare function elevatedCard(inner: JSXRenderable): import("@zhin.js/jsx").JSXElement;
|
|
29
|
+
export declare function cardShell(inner: JSXRenderable, width?: number): import("@zhin.js/jsx").JSXElement;
|
|
27
30
|
//# sourceMappingURL=card-layout.d.ts.map
|
package/lib/card-layout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-layout.d.ts","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,
|
|
1
|
+
{"version":3,"file":"card-layout.d.ts","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAIL,WAAW,EACX,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,WAA4B,CAAC;AACrD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,qCAEhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,SAAM,qCAE1D"}
|
package/lib/card-layout.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx } from "@zhin.js/jsx";
|
|
2
|
+
import { Card, CardCanvas, DEFAULT_CARD_THEME, formatCount, StatChip, } from "@zhin.js/components";
|
|
2
3
|
export const CARD_CANVAS = DEFAULT_CARD_THEME.canvas;
|
|
3
4
|
export const CARD_THEME = DEFAULT_CARD_THEME;
|
|
4
5
|
export { formatCount, StatChip };
|
|
5
6
|
export function elevatedCard(inner) {
|
|
6
|
-
return
|
|
7
|
+
return jsx(Card, { children: inner });
|
|
7
8
|
}
|
|
8
9
|
export function cardShell(inner, width = 540) {
|
|
9
|
-
return
|
|
10
|
+
return jsx(CardCanvas, { children: inner, width });
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=card-layout.js.map
|
package/lib/card-layout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-layout.js","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"card-layout.js","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAsB,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAoB,EAAE,KAAK,GAAG,GAAG;IACzD,OAAO,GAAG,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
package/lib/stats-card.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MyStatsReportData, StatsRankReportData } from "./stats-data.js";
|
|
2
2
|
export declare const STATS_REPORT_CANVAS: "#d8dce3";
|
|
3
|
-
export declare function buildStatsRankHtml(data: StatsRankReportData): string
|
|
4
|
-
export declare function buildMyStatsHtml(data: MyStatsReportData): string
|
|
3
|
+
export declare function buildStatsRankHtml(data: StatsRankReportData): Promise<string>;
|
|
4
|
+
export declare function buildMyStatsHtml(data: MyStatsReportData): Promise<string>;
|
|
5
5
|
//# sourceMappingURL=stats-card.d.ts.map
|
package/lib/stats-card.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-card.d.ts","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stats-card.d.ts","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,eAAO,MAAM,mBAAmB,WAAoB,CAAC;AAIrD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
|
package/lib/stats-card.js
CHANGED
|
@@ -1,61 +1,92 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, renderToHtml } from "@zhin.js/jsx";
|
|
2
|
+
import { BarRow, CardHeader, EmptyState, Row, Section, StatChip, } from "@zhin.js/components";
|
|
2
3
|
import { CARD_THEME, cardShell, elevatedCard, formatCount, } from "./card-layout.js";
|
|
3
4
|
export const STATS_REPORT_CANVAS = CARD_THEME.canvas;
|
|
4
5
|
const T = CARD_THEME;
|
|
5
|
-
export function buildStatsRankHtml(data) {
|
|
6
|
+
export async function buildStatsRankHtml(data) {
|
|
6
7
|
const meta = data.empty
|
|
7
8
|
? undefined
|
|
8
9
|
: `共 ${data.participantCount} 人 · ${formatCount(data.totalMessages)} 条消息${data.myRank != null ? ` · 你第 ${data.myRank} 名` : ""}`;
|
|
9
10
|
const body = elevatedCard(data.empty
|
|
10
11
|
? [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
]
|
|
12
|
+
jsx(CardHeader, { title: data.title }),
|
|
13
|
+
jsx(EmptyState, { message: "暂无统计数据" }),
|
|
14
|
+
]
|
|
14
15
|
: [
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
jsx(CardHeader, { title: data.title, subtitle: meta }),
|
|
17
|
+
jsx(Row, {
|
|
17
18
|
children: [
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
jsx(StatChip, {
|
|
20
|
+
label: "参与",
|
|
21
|
+
value: formatCount(data.participantCount),
|
|
22
|
+
accent: T.accentCpu,
|
|
23
|
+
}),
|
|
24
|
+
jsx(StatChip, {
|
|
25
|
+
label: "消息",
|
|
26
|
+
value: formatCount(data.totalMessages),
|
|
27
|
+
accent: T.accentMem,
|
|
28
|
+
}),
|
|
29
|
+
data.myRank != null
|
|
30
|
+
? jsx(StatChip, {
|
|
31
|
+
label: "我的排名",
|
|
32
|
+
value: `#${data.myRank}`,
|
|
33
|
+
accent: T.accentDisk,
|
|
34
|
+
})
|
|
35
|
+
: null,
|
|
21
36
|
],
|
|
22
37
|
gap: 10,
|
|
23
38
|
style: "margin-bottom:6px",
|
|
24
39
|
}),
|
|
25
|
-
|
|
40
|
+
jsx(Section, {
|
|
26
41
|
title: "排行榜",
|
|
27
|
-
children: data.entries.map((entry) =>
|
|
42
|
+
children: data.entries.map((entry) => jsx(BarRow, {
|
|
28
43
|
rank: entry.rank,
|
|
29
44
|
label: entry.name,
|
|
30
45
|
value: `${entry.count} 条`,
|
|
31
46
|
percent: entry.percent,
|
|
32
47
|
})),
|
|
33
48
|
}),
|
|
34
|
-
]
|
|
35
|
-
return cardShell(body);
|
|
49
|
+
]);
|
|
50
|
+
return renderToHtml(cardShell(body));
|
|
36
51
|
}
|
|
37
|
-
export function buildMyStatsHtml(data) {
|
|
52
|
+
export async function buildMyStatsHtml(data) {
|
|
38
53
|
const body = elevatedCard([
|
|
39
|
-
|
|
54
|
+
jsx(CardHeader, {
|
|
40
55
|
title: data.userName,
|
|
41
|
-
|
|
56
|
+
subtitle: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
|
|
42
57
|
}),
|
|
43
|
-
|
|
58
|
+
jsx(Row, {
|
|
44
59
|
children: [
|
|
45
|
-
|
|
46
|
-
|
|
60
|
+
jsx(StatChip, {
|
|
61
|
+
label: "今日",
|
|
62
|
+
value: formatCount(data.todayCount),
|
|
63
|
+
accent: T.accentMem,
|
|
64
|
+
}),
|
|
65
|
+
jsx(StatChip, {
|
|
66
|
+
label: "本周",
|
|
67
|
+
value: formatCount(data.weekCount),
|
|
68
|
+
accent: T.accentCpu,
|
|
69
|
+
}),
|
|
47
70
|
],
|
|
48
71
|
gap: 10,
|
|
49
72
|
style: "margin-bottom:10px",
|
|
50
73
|
}),
|
|
51
|
-
|
|
74
|
+
jsx(Row, {
|
|
52
75
|
children: [
|
|
53
|
-
|
|
54
|
-
|
|
76
|
+
jsx(StatChip, {
|
|
77
|
+
label: "本月",
|
|
78
|
+
value: formatCount(data.monthCount),
|
|
79
|
+
accent: T.barWarn,
|
|
80
|
+
}),
|
|
81
|
+
jsx(StatChip, {
|
|
82
|
+
label: "总计",
|
|
83
|
+
value: formatCount(data.totalCount),
|
|
84
|
+
accent: T.accentDisk,
|
|
85
|
+
}),
|
|
55
86
|
],
|
|
56
87
|
gap: 10,
|
|
57
88
|
}),
|
|
58
|
-
]
|
|
59
|
-
return cardShell(body);
|
|
89
|
+
]);
|
|
90
|
+
return renderToHtml(cardShell(body));
|
|
60
91
|
}
|
|
61
92
|
//# sourceMappingURL=stats-card.js.map
|
package/lib/stats-card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-card.js","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"stats-card.js","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-group-suite",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"description": "Zhin.js 群运营套件 — slice-2 checkin/teach/stats + keywords (Plugin Runtime, in-memory)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -40,22 +40,23 @@
|
|
|
40
40
|
},
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@zhin.js/
|
|
44
|
-
"@zhin.js/
|
|
45
|
-
"@zhin.js/
|
|
46
|
-
"@zhin.js/skill": "1.1.
|
|
43
|
+
"@zhin.js/components": "1.1.1",
|
|
44
|
+
"@zhin.js/core": "1.1.41",
|
|
45
|
+
"@zhin.js/jsx": "1.1.1",
|
|
46
|
+
"@zhin.js/skill": "1.1.4",
|
|
47
|
+
"@zhin.js/tool": "1.1.4"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
50
|
"typescript": "^6.0.3",
|
|
50
51
|
"vitest": "^4.1.10",
|
|
51
52
|
"zod": "^4.4.3",
|
|
52
|
-
"zhin.js": "1.1.
|
|
53
|
+
"zhin.js": "1.1.6"
|
|
53
54
|
},
|
|
54
55
|
"peerDependencies": {
|
|
55
56
|
"zod": "^4.0.0",
|
|
56
|
-
"@zhin.js/command": "^1.1.
|
|
57
|
-
"@zhin.js/middleware": "^1.1.
|
|
58
|
-
"zhin.js": "^1.1.
|
|
57
|
+
"@zhin.js/command": "^1.1.5",
|
|
58
|
+
"@zhin.js/middleware": "^1.1.4",
|
|
59
|
+
"zhin.js": "^1.1.6"
|
|
59
60
|
},
|
|
60
61
|
"peerDependenciesMeta": {
|
|
61
62
|
"@zhin.js/command": {
|
package/src/analysis-card.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import { jsx, renderToHtml } from "@zhin.js/jsx";
|
|
1
2
|
import {
|
|
2
3
|
BarChart,
|
|
3
4
|
CardHeader,
|
|
4
|
-
h,
|
|
5
5
|
ProfileRow,
|
|
6
6
|
QuoteCard,
|
|
7
7
|
Row,
|
|
8
8
|
Section,
|
|
9
9
|
StatChip,
|
|
10
10
|
TopicItem,
|
|
11
|
-
} from "@zhin.js/
|
|
11
|
+
} from "@zhin.js/components";
|
|
12
12
|
import type { AnalysisReportData } from "./analysis.js";
|
|
13
13
|
import {
|
|
14
14
|
CARD_THEME,
|
|
@@ -27,65 +27,92 @@ const T = {
|
|
|
27
27
|
accentHour: CARD_THEME.barWarn,
|
|
28
28
|
} as const;
|
|
29
29
|
|
|
30
|
-
export function buildAnalysisReportHtml(
|
|
30
|
+
export async function buildAnalysisReportHtml(
|
|
31
|
+
data: AnalysisReportData
|
|
32
|
+
): Promise<string> {
|
|
31
33
|
const { stats, channelName, days, startDate, endDate, llm } = data;
|
|
32
34
|
const title = channelName ? `${channelName} · 群日常分析` : "群日常分析";
|
|
33
35
|
const peakLabel = `${String(stats.mostActiveHour).padStart(2, "0")}:00`;
|
|
34
|
-
const hourlyValues = Array.from(
|
|
36
|
+
const hourlyValues = Array.from(
|
|
37
|
+
{ length: 24 },
|
|
38
|
+
(_, hour) => stats.hourlyDistribution[hour] || 0
|
|
39
|
+
);
|
|
35
40
|
|
|
36
41
|
const llmBlocks = [
|
|
37
42
|
llm?.topics?.length
|
|
38
|
-
?
|
|
43
|
+
? jsx(Section, {
|
|
39
44
|
title: "热门话题",
|
|
40
|
-
children: llm.topics.map((topic, i) =>
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
children: llm.topics.map((topic, i) =>
|
|
46
|
+
jsx(TopicItem, {
|
|
47
|
+
index: i + 1,
|
|
48
|
+
title: topic.topic,
|
|
49
|
+
summary: topic.summary,
|
|
50
|
+
})
|
|
51
|
+
),
|
|
45
52
|
})
|
|
46
53
|
: "",
|
|
47
54
|
llm?.quotes?.length
|
|
48
|
-
?
|
|
55
|
+
? jsx(Section, {
|
|
49
56
|
title: "金句精选",
|
|
50
|
-
children: llm.quotes.map((quote, i) =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
children: llm.quotes.map((quote, i) =>
|
|
58
|
+
jsx(QuoteCard, {
|
|
59
|
+
index: i + 1,
|
|
60
|
+
content: quote.content,
|
|
61
|
+
author: quote.sender,
|
|
62
|
+
reason: quote.reason,
|
|
63
|
+
})
|
|
64
|
+
),
|
|
56
65
|
})
|
|
57
66
|
: "",
|
|
58
67
|
llm?.userTitles?.length
|
|
59
|
-
?
|
|
68
|
+
? jsx(Section, {
|
|
60
69
|
title: "用户画像",
|
|
61
|
-
children: llm.userTitles.map((user, i) =>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
children: llm.userTitles.map((user, i) =>
|
|
71
|
+
jsx(ProfileRow, {
|
|
72
|
+
index: i + 1,
|
|
73
|
+
name: user.name,
|
|
74
|
+
badge: user.title,
|
|
75
|
+
reason: user.reason,
|
|
76
|
+
})
|
|
77
|
+
),
|
|
67
78
|
})
|
|
68
79
|
: "",
|
|
69
|
-
]
|
|
80
|
+
];
|
|
70
81
|
|
|
71
82
|
const body = elevatedCard([
|
|
72
|
-
|
|
83
|
+
jsx(CardHeader, {
|
|
73
84
|
title,
|
|
74
|
-
|
|
85
|
+
subtitle: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
|
|
75
86
|
}),
|
|
76
|
-
|
|
87
|
+
jsx(Row, {
|
|
77
88
|
children: [
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
89
|
+
jsx(StatChip, {
|
|
90
|
+
label: "消息",
|
|
91
|
+
value: formatCount(stats.messageCount),
|
|
92
|
+
accent: T.accentMsg,
|
|
93
|
+
}),
|
|
94
|
+
jsx(StatChip, {
|
|
95
|
+
label: "参与",
|
|
96
|
+
value: formatCount(stats.participantCount),
|
|
97
|
+
accent: T.accentPeople,
|
|
98
|
+
}),
|
|
99
|
+
jsx(StatChip, {
|
|
100
|
+
label: "字数",
|
|
101
|
+
value: formatCount(stats.totalChars),
|
|
102
|
+
accent: T.accentChars,
|
|
103
|
+
}),
|
|
104
|
+
jsx(StatChip, {
|
|
105
|
+
label: "活跃",
|
|
106
|
+
value: peakLabel,
|
|
107
|
+
accent: T.accentHour,
|
|
108
|
+
}),
|
|
82
109
|
],
|
|
83
110
|
gap: 10,
|
|
84
111
|
style: "margin-bottom:4px",
|
|
85
112
|
}),
|
|
86
|
-
|
|
113
|
+
jsx(Section, {
|
|
87
114
|
title: "每小时消息分布",
|
|
88
|
-
children:
|
|
115
|
+
children: jsx(BarChart, {
|
|
89
116
|
values: hourlyValues,
|
|
90
117
|
peakIndex: stats.mostActiveHour,
|
|
91
118
|
accent: T.accentMsg,
|
|
@@ -93,7 +120,7 @@ export function buildAnalysisReportHtml(data: AnalysisReportData): string {
|
|
|
93
120
|
}),
|
|
94
121
|
}),
|
|
95
122
|
llmBlocks,
|
|
96
|
-
]
|
|
123
|
+
]);
|
|
97
124
|
|
|
98
|
-
return cardShell(body);
|
|
125
|
+
return renderToHtml(cardShell(body));
|
|
99
126
|
}
|
package/src/card-layout.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
+
import { jsx, type JSXRenderable } from "@zhin.js/jsx";
|
|
1
2
|
import {
|
|
2
3
|
Card,
|
|
3
4
|
CardCanvas,
|
|
4
5
|
DEFAULT_CARD_THEME,
|
|
5
6
|
formatCount,
|
|
6
|
-
h,
|
|
7
7
|
StatChip,
|
|
8
|
-
} from "@zhin.js/
|
|
8
|
+
} from "@zhin.js/components";
|
|
9
9
|
|
|
10
10
|
export const CARD_CANVAS = DEFAULT_CARD_THEME.canvas;
|
|
11
11
|
export const CARD_THEME = DEFAULT_CARD_THEME;
|
|
12
12
|
|
|
13
13
|
export { formatCount, StatChip };
|
|
14
14
|
|
|
15
|
-
export function elevatedCard(inner:
|
|
16
|
-
return
|
|
15
|
+
export function elevatedCard(inner: JSXRenderable) {
|
|
16
|
+
return jsx(Card, { children: inner });
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export function cardShell(inner:
|
|
20
|
-
return
|
|
19
|
+
export function cardShell(inner: JSXRenderable, width = 540) {
|
|
20
|
+
return jsx(CardCanvas, { children: inner, width });
|
|
21
21
|
}
|
package/src/stats-card.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, renderToHtml } from "@zhin.js/jsx";
|
|
2
|
+
import {
|
|
3
|
+
BarRow,
|
|
4
|
+
CardHeader,
|
|
5
|
+
EmptyState,
|
|
6
|
+
Row,
|
|
7
|
+
Section,
|
|
8
|
+
StatChip,
|
|
9
|
+
} from "@zhin.js/components";
|
|
2
10
|
import {
|
|
3
11
|
CARD_THEME,
|
|
4
12
|
cardShell,
|
|
@@ -11,63 +19,103 @@ export const STATS_REPORT_CANVAS = CARD_THEME.canvas;
|
|
|
11
19
|
|
|
12
20
|
const T = CARD_THEME;
|
|
13
21
|
|
|
14
|
-
export function buildStatsRankHtml(
|
|
22
|
+
export async function buildStatsRankHtml(
|
|
23
|
+
data: StatsRankReportData
|
|
24
|
+
): Promise<string> {
|
|
15
25
|
const meta = data.empty
|
|
16
26
|
? undefined
|
|
17
|
-
: `共 ${data.participantCount} 人 · ${formatCount(
|
|
27
|
+
: `共 ${data.participantCount} 人 · ${formatCount(
|
|
28
|
+
data.totalMessages
|
|
29
|
+
)} 条消息${data.myRank != null ? ` · 你第 ${data.myRank} 名` : ""}`;
|
|
18
30
|
|
|
19
|
-
const body = elevatedCard(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
const body = elevatedCard(
|
|
32
|
+
data.empty
|
|
33
|
+
? [
|
|
34
|
+
jsx(CardHeader, { title: data.title }),
|
|
35
|
+
jsx(EmptyState, { message: "暂无统计数据" }),
|
|
36
|
+
]
|
|
37
|
+
: [
|
|
38
|
+
jsx(CardHeader, { title: data.title, subtitle: meta }),
|
|
39
|
+
jsx(Row, {
|
|
40
|
+
children: [
|
|
41
|
+
jsx(StatChip, {
|
|
42
|
+
label: "参与",
|
|
43
|
+
value: formatCount(data.participantCount),
|
|
44
|
+
accent: T.accentCpu,
|
|
45
|
+
}),
|
|
46
|
+
jsx(StatChip, {
|
|
47
|
+
label: "消息",
|
|
48
|
+
value: formatCount(data.totalMessages),
|
|
49
|
+
accent: T.accentMem,
|
|
50
|
+
}),
|
|
51
|
+
data.myRank != null
|
|
52
|
+
? jsx(StatChip, {
|
|
53
|
+
label: "我的排名",
|
|
54
|
+
value: `#${data.myRank}`,
|
|
55
|
+
accent: T.accentDisk,
|
|
56
|
+
})
|
|
57
|
+
: null,
|
|
58
|
+
],
|
|
59
|
+
gap: 10,
|
|
60
|
+
style: "margin-bottom:6px",
|
|
61
|
+
}),
|
|
62
|
+
jsx(Section, {
|
|
63
|
+
title: "排行榜",
|
|
64
|
+
children: data.entries.map((entry) =>
|
|
65
|
+
jsx(BarRow, {
|
|
66
|
+
rank: entry.rank,
|
|
67
|
+
label: entry.name,
|
|
68
|
+
value: `${entry.count} 条`,
|
|
69
|
+
percent: entry.percent,
|
|
70
|
+
})
|
|
71
|
+
),
|
|
72
|
+
}),
|
|
73
|
+
]
|
|
74
|
+
);
|
|
45
75
|
|
|
46
|
-
return cardShell(body);
|
|
76
|
+
return renderToHtml(cardShell(body));
|
|
47
77
|
}
|
|
48
78
|
|
|
49
|
-
export function buildMyStatsHtml(
|
|
79
|
+
export async function buildMyStatsHtml(
|
|
80
|
+
data: MyStatsReportData
|
|
81
|
+
): Promise<string> {
|
|
50
82
|
const body = elevatedCard([
|
|
51
|
-
|
|
83
|
+
jsx(CardHeader, {
|
|
52
84
|
title: data.userName,
|
|
53
|
-
|
|
85
|
+
subtitle: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
|
|
54
86
|
}),
|
|
55
|
-
|
|
87
|
+
jsx(Row, {
|
|
56
88
|
children: [
|
|
57
|
-
|
|
58
|
-
|
|
89
|
+
jsx(StatChip, {
|
|
90
|
+
label: "今日",
|
|
91
|
+
value: formatCount(data.todayCount),
|
|
92
|
+
accent: T.accentMem,
|
|
93
|
+
}),
|
|
94
|
+
jsx(StatChip, {
|
|
95
|
+
label: "本周",
|
|
96
|
+
value: formatCount(data.weekCount),
|
|
97
|
+
accent: T.accentCpu,
|
|
98
|
+
}),
|
|
59
99
|
],
|
|
60
100
|
gap: 10,
|
|
61
101
|
style: "margin-bottom:10px",
|
|
62
102
|
}),
|
|
63
|
-
|
|
103
|
+
jsx(Row, {
|
|
64
104
|
children: [
|
|
65
|
-
|
|
66
|
-
|
|
105
|
+
jsx(StatChip, {
|
|
106
|
+
label: "本月",
|
|
107
|
+
value: formatCount(data.monthCount),
|
|
108
|
+
accent: T.barWarn,
|
|
109
|
+
}),
|
|
110
|
+
jsx(StatChip, {
|
|
111
|
+
label: "总计",
|
|
112
|
+
value: formatCount(data.totalCount),
|
|
113
|
+
accent: T.accentDisk,
|
|
114
|
+
}),
|
|
67
115
|
],
|
|
68
116
|
gap: 10,
|
|
69
117
|
}),
|
|
70
|
-
]
|
|
118
|
+
]);
|
|
71
119
|
|
|
72
|
-
return cardShell(body);
|
|
120
|
+
return renderToHtml(cardShell(body));
|
|
73
121
|
}
|