koishi-plugin-ll-mc 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,455 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' https: data:; font-src 'self' file: data:; style-src 'self' 'unsafe-inline' https:;">
6
- <meta name="viewport" content="width=device-width,initial-scale=1.0">
7
- <title>{{ title }}</title>
8
- <style>{{ custom_font_css | safe }}{% raw %}
9
- @import url('https://fonts.googleapis.com/css2?family=ZCOOL+KuaiLe&display=swap');
10
-
11
- * { margin: 0; padding: 0; box-sizing: border-box; }
12
-
13
- body {
14
- font-family: var(--message-stats-font-family, "ZCOOL KuaiLe", "Comic Sans MS", "Chalkboard SE", "Marker Felt", "PingFang SC", cursive, sans-serif);
15
- background: #1a1a2e;
16
- min-height: 100vh;
17
- padding: 32px 24px;
18
- color: #e8e0d6;
19
- position: relative;
20
- }
21
-
22
- /* 深色手绘纹理背景 */
23
- body::before {
24
- content: '';
25
- position: fixed;
26
- inset: 0;
27
- background:
28
- radial-gradient(circle at 10% 20%, rgba(255, 183, 77, 0.08) 0%, transparent 50%),
29
- radial-gradient(circle at 90% 80%, rgba(129, 199, 132, 0.06) 0%, transparent 50%),
30
- radial-gradient(circle at 50% 50%, rgba(100, 181, 246, 0.05) 0%, transparent 50%);
31
- pointer-events: none;
32
- z-index: 0;
33
- }
34
-
35
- .container {
36
- max-width: 600px;
37
- margin: 0 auto;
38
- position: relative;
39
- z-index: 1;
40
- }
41
-
42
- /* ====== Header 深色手绘标题区 ====== */
43
- .header {
44
- text-align: center;
45
- margin-bottom: 24px;
46
- background: #2a2a44;
47
- border-radius: 60px 60px 60px 12px;
48
- padding: 28px 24px 24px;
49
- border: 3px solid #8d7b6a;
50
- box-shadow: 8px 8px 0 #0f0f1a;
51
- position: relative;
52
- }
53
-
54
- .header::before {
55
- content: '✦';
56
- position: absolute;
57
- top: -12px;
58
- left: 24px;
59
- font-size: 28px;
60
- color: #ffab91;
61
- transform: rotate(-15deg);
62
- }
63
-
64
- .header::after {
65
- content: '✧';
66
- position: absolute;
67
- top: -14px;
68
- right: 28px;
69
- font-size: 32px;
70
- color: #ffcc80;
71
- transform: rotate(20deg);
72
- }
73
-
74
- .group-info-row {
75
- text-align: center;
76
- margin-bottom: 8px;
77
- }
78
-
79
- .group-info {
80
- font-size: 14px;
81
- color: #bcaaa4;
82
- background: #3d3d5c;
83
- display: inline-block;
84
- padding: 4px 16px;
85
- border-radius: 30px;
86
- border: 2px dashed #6d5c50;
87
- margin-bottom: 8px;
88
- }
89
-
90
- .title {
91
- font-size: 42px;
92
- font-weight: 400;
93
- color: #ffcc80;
94
- line-height: 1.2;
95
- letter-spacing: 2px;
96
- text-shadow: 3px 3px 0 #5d4037;
97
- padding: 4px 8px;
98
- display: inline-block;
99
- transform: rotate(-1deg);
100
- }
101
-
102
- .stats-row {
103
- display: flex;
104
- justify-content: center;
105
- gap: 24px;
106
- margin-top: 12px;
107
- }
108
-
109
- .stat-item {
110
- text-align: center;
111
- background: #4a3728;
112
- border-radius: 30px;
113
- padding: 8px 24px;
114
- border: 2.5px solid #8d7b6a;
115
- box-shadow: 4px 4px 0 #0f0f1a;
116
- }
117
-
118
- .stat-value {
119
- font-size: 42px;
120
- font-weight: 400;
121
- color: #ffab91;
122
- line-height: 1.1;
123
- }
124
-
125
- .stat-label {
126
- font-size: 16px;
127
- color: #bcaaa4;
128
- letter-spacing: 1px;
129
- }
130
-
131
- /* ====== Rank Cards 深色手绘风格 ====== */
132
- .rank-list {
133
- display: flex;
134
- flex-direction: column;
135
- gap: 14px;
136
- }
137
-
138
- .rank-card {
139
- display: flex;
140
- align-items: center;
141
- background: #2e2e4a;
142
- border-radius: 40px 60px 60px 40px;
143
- padding: 12px 16px;
144
- border: 3px solid #8d7b6a;
145
- box-shadow: 6px 6px 0 #0f0f1a;
146
- position: relative;
147
- transition: all 0.2s ease;
148
- }
149
-
150
- .rank-card:hover {
151
- transform: translate(-2px, -2px);
152
- box-shadow: 8px 8px 0 #0f0f1a;
153
- }
154
-
155
- /* 不同排名的背景色 */
156
- .rank-card:nth-child(1) {
157
- background: #3d3d1a;
158
- border-color: #f9a825;
159
- box-shadow: 6px 6px 0 #0f0f1a;
160
- }
161
- .rank-card:nth-child(2) {
162
- background: #2e2e3d;
163
- border-color: #78909c;
164
- box-shadow: 6px 6px 0 #0f0f1a;
165
- }
166
- .rank-card:nth-child(3) {
167
- background: #3d2a2a;
168
- border-color: #a1887f;
169
- box-shadow: 6px 6px 0 #0f0f1a;
170
- }
171
-
172
- .rank-card.self-card {
173
- border-color: #42a5f5 !important;
174
- box-shadow: 6px 6px 0 #0f0f1a !important;
175
- background: #1a2a3d !important;
176
- }
177
-
178
- .rank-card.separator {
179
- margin-top: 16px;
180
- border-top: 4px dashed #5d4e3e;
181
- border-radius: 0 0 40px 40px;
182
- padding-top: 24px;
183
- box-shadow: none;
184
- background: transparent;
185
- border-left: none;
186
- border-right: none;
187
- border-bottom: 3px solid #8d7b6a;
188
- }
189
-
190
- /* Rank Badge */
191
- .rank-num {
192
- width: 48px;
193
- height: 48px;
194
- border-radius: 50% 50% 50% 8px;
195
- display: flex;
196
- align-items: center;
197
- justify-content: center;
198
- font-size: 20px;
199
- flex-shrink: 0;
200
- margin-right: 14px;
201
- background: #3d3d5c;
202
- color: #bcaaa4;
203
- border: 2.5px solid #8d7b6a;
204
- transform: rotate(-3deg);
205
- }
206
-
207
- .rank-card:nth-child(1) .rank-num {
208
- width: 58px;
209
- height: 58px;
210
- font-size: 28px;
211
- background: linear-gradient(135deg, #ffd54f, #ffb300);
212
- border-color: #f57f17;
213
- color: #fff;
214
- transform: rotate(-5deg);
215
- box-shadow: 3px 3px 0 #f57f17;
216
- }
217
-
218
- .rank-card:nth-child(2) .rank-num {
219
- width: 52px;
220
- height: 52px;
221
- font-size: 24px;
222
- background: linear-gradient(135deg, #cfd8dc, #90a4ae);
223
- border-color: #546e7a;
224
- color: #fff;
225
- transform: rotate(3deg);
226
- box-shadow: 3px 3px 0 #546e7a;
227
- }
228
-
229
- .rank-card:nth-child(3) .rank-num {
230
- width: 50px;
231
- height: 50px;
232
- font-size: 22px;
233
- background: linear-gradient(135deg, #d7ccc8, #a1887f);
234
- border-color: #6d4c41;
235
- color: #fff;
236
- transform: rotate(-2deg);
237
- box-shadow: 3px 3px 0 #6d4c41;
238
- }
239
-
240
- /* Avatar */
241
- .avatar-wrap {
242
- width: 50px;
243
- height: 50px;
244
- border-radius: 40% 60% 60% 40%;
245
- flex-shrink: 0;
246
- margin-right: 14px;
247
- overflow: hidden;
248
- border: 3px solid #8d7b6a;
249
- box-shadow: 3px 3px 0 #0f0f1a;
250
- }
251
-
252
- .rank-card:nth-child(1) .avatar-wrap {
253
- width: 60px;
254
- height: 60px;
255
- border-radius: 35% 65% 70% 30%;
256
- border-color: #f9a825;
257
- box-shadow: 3px 3px 0 #0f0f1a;
258
- }
259
-
260
- .rank-card:nth-child(2) .avatar-wrap {
261
- width: 55px;
262
- height: 55px;
263
- border-radius: 65% 35% 30% 70%;
264
- border-color: #78909c;
265
- box-shadow: 3px 3px 0 #0f0f1a;
266
- }
267
-
268
- .rank-card:nth-child(3) .avatar-wrap {
269
- width: 52px;
270
- height: 52px;
271
- border-radius: 45% 55% 55% 45%;
272
- border-color: #a1887f;
273
- box-shadow: 3px 3px 0 #0f0f1a;
274
- }
275
-
276
- .avatar-wrap img, .avatar-wrap svg {
277
- width: 100%;
278
- height: 100%;
279
- object-fit: cover;
280
- }
281
-
282
- /* User Info */
283
- .user-info {
284
- flex: 1;
285
- min-width: 0;
286
- }
287
-
288
- .user-name-row {
289
- display: flex;
290
- align-items: center;
291
- gap: 8px;
292
- margin-bottom: 2px;
293
- }
294
-
295
- .user-name {
296
- font-size: 18px;
297
- color: #e8e0d6;
298
- white-space: nowrap;
299
- overflow: hidden;
300
- text-overflow: ellipsis;
301
- font-weight: 400;
302
- }
303
-
304
- .rank-card:nth-child(1) .user-name {
305
- font-size: 22px;
306
- color: #ffcc80;
307
- }
308
-
309
- .rank-card:nth-child(2) .user-name {
310
- font-size: 20px;
311
- }
312
-
313
- .rank-card:nth-child(3) .user-name {
314
- font-size: 19px;
315
- }
316
-
317
- .user-title-tag {
318
- font-size: 11px;
319
- padding: 2px 12px;
320
- border-radius: 30px;
321
- white-space: nowrap;
322
- flex-shrink: 0;
323
- background: #4a3728;
324
- color: #ffab91;
325
- border: 2px solid #8d6e63;
326
- transform: rotate(-1deg);
327
- display: inline-block;
328
- }
329
-
330
- .user-meta {
331
- font-size: 12px;
332
- color: #8d7b6a;
333
- }
334
-
335
- /* Stats */
336
- .progress-wrapper {
337
- flex-shrink: 0;
338
- text-align: right;
339
- margin-left: 12px;
340
- }
341
-
342
- .msg-count {
343
- font-size: 22px;
344
- color: #e8e0d6;
345
- line-height: 1.2;
346
- background: #3d3d5c;
347
- padding: 2px 12px;
348
- border-radius: 30px;
349
- border: 2px solid #8d7b6a;
350
- display: inline-block;
351
- transform: rotate(1deg);
352
- }
353
-
354
- .rank-card:nth-child(1) .msg-count {
355
- font-size: 26px;
356
- background: #5d4e1a;
357
- border-color: #f9a825;
358
- transform: rotate(-1deg);
359
- }
360
-
361
- .rank-card:nth-child(2) .msg-count {
362
- font-size: 24px;
363
- transform: rotate(2deg);
364
- }
365
-
366
- .rank-card:nth-child(3) .msg-count {
367
- font-size: 23px;
368
- transform: rotate(-2deg);
369
- }
370
-
371
- .msg-pct {
372
- font-size: 13px;
373
- color: #8d7b6a;
374
- margin-top: 2px;
375
- }
376
-
377
- /* ====== Footer ====== */
378
- .footer {
379
- text-align: center;
380
- margin-top: 28px;
381
- padding-top: 16px;
382
- border-top: 3px dashed #3d3d5c;
383
- color: #6d5c50;
384
- }
385
-
386
- .footer p {
387
- margin: 4px 0;
388
- font-size: 12px;
389
- }
390
- {% endraw %}</style>
391
- </head>
392
- <body>
393
- <div class="container">
394
- <!-- Header -->
395
- <div class="header">
396
- {% if group_name %}
397
- <div class="group-info-row"><div class="group-info">✏️ {{ group_name }}{% if show_group_id %} · {{ group_id }}{% endif %}</div></div>
398
- {% endif %}
399
- {% if ']' in title %}
400
- {% set title_parts = title.split(']', 1) %}
401
- <div class="title">{{ title_parts[0] }}]<br>{{ title_parts[1] }}</div>
402
- {% else %}
403
- <div class="title">{{ title }}</div>
404
- {% endif %}
405
- <div class="stats-row">
406
- <div class="stat-item">
407
- <div class="stat-value">{{ total_messages }}</div>
408
- <div class="stat-label">总发言</div>
409
- </div>
410
- </div>
411
- </div>
412
-
413
- <!-- Rank List -->
414
- <div class="rank-list">
415
- {% for item in user_items %}
416
- <div class="rank-card{% if item.is_current_user %} self-card{% endif %}{% if item.is_separator %} separator{% endif %}">
417
- <!-- Rank -->
418
- <div class="rank-num">
419
- {% if item.rank == 1 %}🥇{% elif item.rank == 2 %}🥈{% elif item.rank == 3 %}🥉{% else %}{{ item.rank }}{% endif %}
420
- </div>
421
-
422
- <!-- Avatar -->
423
- <div class="avatar-wrap">
424
- <img src="{{ item.avatar_url }}" alt="{{ item.nickname }}" />
425
- </div>
426
-
427
- <!-- User Info -->
428
- <div class="user-info">
429
- <div class="user-name-row">
430
- <span class="user-name">{{ item.nickname }}</span>
431
- {% if item.title %}
432
- <span class="user-title-tag"{% if item.title_color %} style="background:{{ item.title_color }}22; border-color:{{ item.title_color }}88; color:{{ item.title_color }};"{% endif %}>「{{ item.title }}」</span>
433
- {% endif %}
434
- </div>
435
- <div class="user-meta">最近发言: {{ item.last_date }}</div>
436
- </div>
437
-
438
- <!-- Stats -->
439
- <div class="progress-wrapper">
440
- <div class="msg-count">{{ item.total }} 次</div>
441
- <div class="msg-pct">{{ "%.1f"|format(item.percentage) }}%</div>
442
- </div>
443
- </div>
444
- {% endfor %}
445
- </div>
446
-
447
- <!-- Footer -->
448
- <div class="footer">
449
- {% if llm_token_info %}<p>{{ llm_token_info }}</p>{% endif %}
450
- <p>🎨 由 AstrBot 发言统计插件 · 手绘风格</p>
451
- <p>🕐 生成时间: {{ current_time }}</p>
452
- </div>
453
- </div>
454
- </body>
455
- </html>