@sjtdev/koishi-plugin-dota2tracker 1.4.2 → 1.5.0-pre.1

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,614 +1,15 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="<%= languageTag %>">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Document</title>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" />
8
- <style>
9
- p {
10
- margin: 0;
11
- }
12
-
13
- img {
14
- width: 100%;
15
- vertical-align: middle;
16
- }
17
-
18
- html,
19
- body {
20
- overflow: hidden;
21
- width: 800px;
22
- font-family: 'MiSans', sans-serif;
23
- }
24
-
25
- nav {
26
- font-size: 14px;
27
- line-height: 1.8;
28
- height: 72px;
29
- color: #fff;
30
- background-color: #000;
31
- display: flex;
32
- flex-direction: row;
33
- justify-content: space-around;
34
- align-items: center;
35
- }
36
-
37
- nav > div > p:first-of-type {
38
- font-weight: bold;
39
- }
40
-
41
- nav .match_id p:first-of-type {
42
- font-size: 16px;
43
- }
44
-
45
- nav > div.match_id > p.success::after {
46
- content: "※<%= $t('dota2tracker.template.analysis_successful') %>";
47
- color: #7ba334;
48
- }
49
- nav > div.match_id > p.fail::after {
50
- content: "※<%= $t('dota2tracker.template.analysis_incomplete') %>";
51
- color: #ffb400;
52
- }
53
-
54
- nav > .rank {
55
- width: 48px;
56
- height: 48px;
57
- position: relative;
58
- }
59
-
60
- nav > .rank > img {
61
- width: 48px;
62
- height: 48px;
63
- position: absolute;
64
- }
65
-
66
- .radiant {
67
- color: #3c9028;
68
- }
69
-
70
- .dire {
71
- color: #9c3628;
72
- }
73
-
74
- .match_result {
75
- font-weight: bold;
76
- height: 49px;
77
- display: flex;
78
- justify-content: center;
79
- align-items: center;
80
- }
81
-
82
- .match_result .win {
83
- margin: 0 25px;
84
- }
85
-
86
- .match_result .win.radiant::after {
87
- content: "<%=$t('dota2tracker.template.radiant_won')%>";
88
- }
89
-
90
- .match_result .win.dire::after {
91
- content: "<%=$t('dota2tracker.template.dire_won')%>";
92
- }
93
-
94
- .players {
95
- display: flex;
96
- flex-direction: column;
97
- }
98
-
99
- .panel {
100
- padding: 0 10px;
101
- }
102
-
103
- .panel {
104
- padding-top: 4px;
105
- height: 40px;
106
- border-top: 3px solid #fff;
107
- font-size: 13.3px;
108
- display: grid;
109
- grid-template-columns: 32px 56px 378px repeat(4,1fr);
110
- }
111
- .panel.radiant {
112
- border-color: #3c9028;
113
- }
114
- .panel.dire {
115
- border-color: #9c3628;
116
- }
117
- .panel p{
118
- line-height: 16px;
119
- margin-left: 8px;
120
- }
121
- .panel .win{
122
- font-size: 20px;
123
- line-height: 32px;
124
- }
125
- .panel .data{
126
- color: #aaa;
127
- }
128
-
129
- .player:not(:last-child) {
130
- border-bottom: 1px solid #e1e1e1; /* 示例边框样式 */
131
- }
132
-
133
- .player {
134
- color: #000;
135
- width: 100%;
136
- display: grid;
137
- grid-template-columns: 64px 48px 88px 160px 112px 252px 36px 20px;
138
- grid-template-rows: 19px 14px 14px 14px;
139
- padding-bottom: 3px;
140
- font-size: 12px;
141
- line-height: 14px;
142
- overflow: hidden;
143
- justify-content: center;
144
- }
145
-
146
- .player > .row-1 {
147
- margin-top: 6px;
148
- }
149
-
150
- .player > .hero_avatar {
151
- margin-bottom: 5px;
152
- width: 64px;
153
- grid-row: 1 / span 3;
154
- grid-column: 1;
155
- position: relative;
156
- }
157
- .player > .hero_avatar > .level {
158
- width: 20px;
159
- height: 15px;
160
- background-color: #323232;
161
- position: absolute;
162
- bottom: 0;
163
- right: 0;
164
- font-size: 12px;
165
- line-height: 15px;
166
- color: #fff;
167
- text-align: center;
168
- }
169
-
170
- .player > .hero_avatar > .party_line {
171
- position: absolute;
172
- height: 2px;
173
- top: 0;
174
- width: 100%;
175
- }
176
-
177
- .player > .hero_avatar > .party_mark {
178
- position: absolute;
179
- line-height: 1.5;
180
- text-align: center;
181
- width: 16px;
182
- font-size: 10px;
183
- top: 3px;
184
- left: 1px;
185
- background-color: rgba(0, 0, 0, 0.8);
186
- }
187
-
188
- .player > .hero_avatar.party_I > .party_line {
189
- background-color: #caffe5;
190
- }
191
-
192
- .player > .hero_avatar.party_I > .party_mark {
193
- color: #caffe5;
194
- }
195
-
196
- .player > .hero_avatar.party_I > .party_mark::after {
197
- content: "I";
198
- }
199
-
200
- .player > .hero_avatar.party_II > .party_line {
201
- background-color: #ffe484;
202
- }
203
-
204
- .player > .hero_avatar.party_II > .party_mark {
205
- color: #ffe484;
206
- }
207
-
208
- .player > .hero_avatar.party_II > .party_mark::after {
209
- content: "II";
210
- }
211
-
212
- .player > .hero_avatar.party_III > .party_line {
213
- background-color: #e19be2;
214
- }
215
-
216
- .player > .hero_avatar.party_III > .party_mark {
217
- color: #e19be2;
218
- }
219
-
220
- .player > .hero_avatar.party_III > .party_mark::after {
221
- content: "III";
222
- }
223
-
224
- .player > .hero_avatar.party_IV > .party_line {
225
- background-color: #ccdaf4;
226
- }
227
-
228
- .player > .hero_avatar.party_IV > .party_mark {
229
- color: #ccdaf4;
230
- }
231
-
232
- .player > .hero_avatar.party_IV > .party_mark::after {
233
- content: "IV";
234
- }
235
-
236
- .player > .facet {
237
- color: #fff;
238
- width: 100%;
239
- height: 16px;
240
- grid-row: 4;
241
- grid-column: 1;
242
- display: grid;
243
- grid-template-columns: 16px auto;
244
- z-index: 1;
245
- position: relative;
246
- top: -5px;
247
- }
248
- .player > .facet > img {
249
- padding: 2px;
250
- width: 12px;
251
- height: 12px;
252
- background-color: #4444;
253
- }
254
- .player > .facet > span {
255
- padding: 0 2px;
256
- line-height: 1;
257
- display: grid;
258
- place-items: center;
259
- align-items: center;
260
- justify-content: center;
261
- height: 100%;
262
- }
263
- .player > .facet > span > * {
264
- max-width: 100%;
265
- overflow: hidden;
266
- text-overflow: ellipsis;
267
- white-space: nowrap;
268
- }
269
- .player > .facet.Red {
270
- background: linear-gradient(to right, #9f3c3c, #4a2026);
271
- }
272
- .player > .facet.Yellow {
273
- background: linear-gradient(to right, #c8a45c, #6f3d21);
274
- }
275
- .player > .facet.Green {
276
- background: linear-gradient(to right, #a2b23e, #2d5a18);
277
- }
278
- .player > .facet.Blue {
279
- background: linear-gradient(to right, #547ea6, #2a385e);
280
- }
281
- .player > .facet.Purple {
282
- background: linear-gradient(to right, #675cae, #261c44);
283
- }
284
- .player > .facet.Gray {
285
- background: linear-gradient(to right, #adb6be, #4e5557);
286
- }
287
-
288
- .player > .rank {
289
- position: relative;
290
- grid-row: 1 / span 3;
291
- grid-column: 2;
292
- width: 48px;
293
- height: 48px;
294
- }
295
- .player > .rank > img {
296
- position: absolute;
297
- }
298
- .player > .rank > p {
299
- position: absolute;
300
- width: 100%;
301
- bottom: 1.5px;
302
- text-align: center;
303
- font-size: 8px;
304
- color: #fff;
305
- text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; /* 文字描边 */
306
- }
307
-
308
- .player > .titles {
309
- grid-row: 4;
310
- grid-column: 2/4;
311
- margin-left: 4px;
312
- /* text-shadow: 1px 1px 0 #333; 设置阴影颜色及偏移 */
313
- }
314
- .player > .titles > span {
315
- margin-right: 1.5px;
316
- }
317
-
318
- .player > .player_name {
319
- grid-row: 1;
320
- grid-column: 3 / span 2;
321
- white-space: nowrap; /* 禁止换行 */
322
- overflow: hidden; /* 隐藏溢出部分 */
323
- text-overflow: ellipsis; /* 用省略号表示溢出的文本 */
324
- }
325
- .player > .player_name > .rank {
326
- color: #aaa;
327
- }
328
- .player.radiant > .player_name > .name {
329
- color: #3c9028;
330
- }
331
- .player.dire > .player_name > .name {
332
- color: #9c3628;
333
- }
334
-
335
- .player .pick {
336
- grid-column: 3;
337
- }
338
-
339
- .player .networth {
340
- grid-column: 3;
341
- }
342
- .player .networth .gold {
343
- color: rgb(203, 176, 42);
344
- text-shadow: 1px 1px 0 #000; /* 设置阴影颜色及偏移 */
345
- }
346
-
347
- .player .hero_damage {
348
- grid-row: 2;
349
- grid-column: 4;
350
- }
351
- .player .damage_received {
352
- grid-row: 3;
353
- grid-column: 4;
354
- }
355
- .player .tower_damage {
356
- grid-row: 4;
357
- grid-column: 4;
358
- }
359
- .player .kda {
360
- grid-row: 1;
361
- grid-column: 5;
362
- }
363
- .player .kill_contribution {
364
- grid-row: 2;
365
- grid-column: 5;
366
- }
367
- .player .stun_duration {
368
- grid-row: 3;
369
- grid-column: 5;
370
- }
371
- .player .heal {
372
- grid-row: 4;
373
- grid-column: 5;
374
- }
375
-
376
- .player .items {
377
- grid-row: 1 / span 4;
378
- grid-column: 6;
379
- display: grid;
380
- grid-template-columns: 24px 192px auto;
381
- grid-template-rows: 32px 24px;
382
- }
383
- .player .items > div {
384
- display: flex;
385
- background-color: #c0c0c0;
386
- }
387
- .player .items .normal {
388
- height: 32px;
389
- grid-column: 1/-1;
390
- grid-row: 1;
391
- }
392
- .player .items .backpack {
393
- height: 24px;
394
- width: 96px;
395
- grid-row: 2;
396
- /* grid-column: 1; */
397
- }
398
- .player .items .normal .item {
399
- width: 40px;
400
- height: 30px;
401
- margin: 1px;
402
- position: relative;
403
- }
404
- .player .items .time {
405
- position: absolute;
406
- width: 100%;
407
- text-align: center;
408
- bottom: 0;
409
- height: 11px;
410
- line-height: 11px;
411
- color: #ccc;
412
- background-color: #323232;
413
- }
414
- .player .items .backpack{
415
- filter: grayscale(100%);
416
- }
417
- .player .items .backpack .item,
418
- .player .items .bear .item {
419
- width: 30px;
420
- height: 22px;
421
- margin: 1px;
422
- position: relative;
423
- }
424
- .player .neutral_item {
425
- grid-row: 1 / span 3;
426
- grid-column: 7;
427
- overflow: hidden;
428
- height: 32px;
429
- width: 32px;
430
- border-radius: 50%;
431
- background-size: auto 100%;
432
- background-position: center;
433
- margin-left: 2px;
434
- }
435
- .player .items .item.recipe {
436
- background-image: url("https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/items/recipe.png");
437
- background-size: 100%;
438
- }
439
-
440
- .player .ahgs {
441
- grid-row: 1 / span 3;
442
- grid-column: 8;
443
- }
444
- .player .items .bear{
445
- height: 24px;
446
- width: 192px;
447
- grid-row: 2;
448
- grid-column: 2;
449
- }
450
- .player.bear .items .bear .time{
451
- font-size: 10px;
452
- }
453
- .player.bear .items .bear_icon{
454
- grid-row: 2;
455
- grid-column: 1;
456
- }
457
- .player.bear .items .neutral_item{
458
- height: 24px;
459
- width: 24px;
460
- grid-row: 2;
461
- grid-column: 3;
462
- }
463
- /* .player .items .backpack .item img{
464
- height: 22px;
465
- width: auto;
466
- } */
467
- </style>
468
- </head>
469
- <body>
470
- <% const match = data; %>
471
- <% function darkenHexColor(hex, percentage) {
472
- // 移除前缀 #
473
- hex = hex.replace(/^#/, '');
474
-
475
- // 处理三位 hex 颜色值
476
- if (hex.length === 3) {
477
- hex = hex.split('').map(char => char + char).join('');
478
- }
479
-
480
- // 将 hex 转换为 RGB
481
- let r = parseInt(hex.substring(0, 2), 16);
482
- let g = parseInt(hex.substring(2, 4), 16);
483
- let b = parseInt(hex.substring(4, 6), 16);
484
-
485
- // 将 RGB 变暗
486
- r = Math.floor(r * (1 - percentage / 100));
487
- g = Math.floor(g * (1 - percentage / 100));
488
- b = Math.floor(b * (1 - percentage / 100));
489
-
490
- // 将 RGB 转换回 hex
491
- const darkenedHex = `#${((1 << 24) + (r << 16) + (g << 8) + b)
492
- .toString(16)
493
- .slice(1)
494
- .toUpperCase()}`;
495
-
496
- return darkenedHex;
497
- } %>
498
- <nav>
499
- <div class="match_id">
500
- <p><%= $t("dota2tracker.template.match_id_").slice(0, -1) %> <%-match.id%></p>
501
- <p class="<%-match.parsedDateTime?'success':'fail'%>"><!--伪类赋值:类名输入success时此处为※录像分析成功,fail为※分析结果不完整,同时自动应用字体颜色样式。--></p>
502
- </div>
503
- <div class="start_time">
504
- <p><%= $t("dota2tracker.template.start_time_").slice(0, -1) %></p>
505
- <p><%-moment(new Date(match.startDateTime * 1000)).format("YYYY-MM-DD HH:mm:ss").slice(2)%></p>
506
- </div>
507
- <div class="duration">
508
- <p><%= $t("dota2tracker.template.duration_").slice(0, -1) %></p>
509
- <p><%-utils.sec2time(match.durationSeconds)%></p>
510
- </div>
511
- <div class="region">
512
- <p><%= $t("dota2tracker.template.region_").slice(0, -1) %></p>
513
- <p><%-$t("dota2tracker.template.regions." + match.regionId)%></p>
514
- </div>
515
- <div class="mode">
516
- <p><%= $t("dota2tracker.template.game_mode_").slice(0, -1) %></p>
517
- <p><%-$t("dota2tracker.template.lobby_types."+match.lobbyType) || match.lobbyType%>/<%-$t("dota2tracker.template.game_modes."+match.gameMode) || match.gameMode%></p>
518
- </div>
519
- <div class="rank">
520
- <img src="<%-utils.getImageUrl('medal_' + (match.rank?.toString().split('')[0] ?? '0'))%>" alt="" />
521
- <img style="z-index: 1;" src="<%-utils.getImageUrl('star_' + (match.rank?.toString().split('')[1] ?? '0'))%>" alt="" />
522
- </div>
523
- </nav>
524
- <section class="match_result">
525
- <span class="kills radiant"><%-match.radiant.killsCount%></span>
526
- <span class="win <%-match.didRadiantWin?'radiant':'dire'%>"><!--伪类赋值:类名输入radiant此处为天辉获胜,dire为夜魇获胜,同时自动应用字体颜色样式。--></span>
527
- <span class="kills dire"><%-match.dire.killsCount%></span>
528
- </section>
529
- <section class="players">
530
- <%- ['radiant','dire'].map(team=>`
531
- <section class="panel ${team}" style="order: ${team==="radiant"?0:50}">
532
- <img src="${utils.getImageUrl("logo_"+team)}" alt="">
533
- <p>${(team==="radiant"?["Radiant","天辉"]:["Dire","夜魇"]).join("<br>")}</p>
534
- ${((team==="radiant")===match.didRadiantWin)?`<p class="win">${$t("dota2tracker.template.won")}</p>`:"<p></p>"}
535
- <p class="data">${$t("dota2tracker.template.kill")}<br>${match[team].killsCount}</p>
536
- <p class="data">${$t("dota2tracker.template.total_damage")}<br>${match[team].heroDamage}</p>
537
- <p class="data">${$t("dota2tracker.template.total_gold")}<br>${match[team].networth}</p>
538
- <p class="data">${$t("dota2tracker.template.total_experience")}<br>${match[team].experience}</p><!--此处无有效API,仅能通过每分钟经验推算-->
539
- </section>`).join("")
540
- %>
541
- <%- match.players.map(player=> `
542
- <div class="player ${player.team}${player.hero.id==80?" bear":""}" style="order: ${player.team==="radiant"?1:100};">
543
- <div class="hero_avatar row-1${player.partyId != null ? " party_" + match.party[player.partyId] : ""}">
544
- <img src="${utils.getImageUrl(player.hero.shortName, ImageType.Heroes)}" />
545
- <p class="level">${player.level}</p>
546
- <p class="party_line"></p>
547
- <p class="party_mark"></p>
548
- </div>
549
- ${player.facet ? `
550
- <div class="facet ${player.facet.color}">
551
- <img src="${utils.getImageUrl(player.facet.icon, ImageType.IconsFacets)}">
552
- <span style="font-size: ${player.facet.name?.length>4?8:11}px;"><p>${player.facet.name??""}</p></span>
553
- </div>` : ""}
554
- <div class="rank">
555
- <img
556
- src="${utils.getImageUrl('medal_' +(player.rank.inTop100??player.rank.medal))}"
557
- class="medal"
558
- />
559
- <img src="${utils.getImageUrl('star_' + player.rank.star)}" class="stars" />
560
- <p>${player.steamAccount.seasonLeaderboardRank??""}</p>
561
- </div>
562
- <div class="titles">${player.titles.map((item) => `<span style="color: ${darkenHexColor(item.color, 25)};">${item.name}</span>`).join('')}</div>
563
- <div class="player_name row-1">
564
- <span class="rank">${`[${$t("dota2tracker.template.ranks."+player.rank.medal)}${player.rank.star||""}]`}</span>
565
- <span class="name">${eh(player.steamAccount.name)}</span>
566
- </div>
567
- <p class="pick">${player.isRandom?$t("dota2tracker.template.random"):$t("dota2tracker.template.pick_order", [player.order == null ? "?" : player.order + 1])} ${$t("dota2tracker.template.position_"+player.position?.slice(-1))??''}</p>
568
- <p class="networth">
569
- <span class="gold">${utils.formatNumber(player.networth)}</span>
570
- (${(player.heroDamage / player.networth)?.toFixed(2)})
571
- </p>
572
- <p class="hero_damage">${$t("dota2tracker.template.hero_damage_")}${player.heroDamage} (${(player.heroDamage/match[player.team].heroDamage*100).toFixed(2)}%)</p>
573
- <p class="damage_received">${$t("dota2tracker.template.damage_received_")}${player.damageReceived} (${match[player.team].damageReceived>0?((player.damageReceived/match[player.team].damageReceived*100).toFixed(2)):"0.00"}%)</p>
574
- <p class="tower_damage">${$t("dota2tracker.template.building_damage_")}${player.towerDamage}</p>
575
- <p class="kda row-1">${player.kills}/${player.deaths}/${player.assists} (${((player.kills + player.assists) / (player.deaths || 1)).toFixed(2)})</p>
576
- <p class="kill_contribution">${$t("dota2tracker.template.kill_contribution_")}${(player.killContribution * 100).toFixed(2)}%</p>
577
- <p class="stun_duration">${$t("dota2tracker.template.crowd_control_duration_")}${((player.stats.heroDamageReport?.dealtTotal.stunDuration ?? 0)/ 100).toFixed(2)}s</p>
578
- <p class="heal">${$t("dota2tracker.template.heal_")}${player.heroHealing}</p>
579
- <div class="items row-1">
580
- <div class="normal">
581
- ${player.items.map((item) =>`
582
- <div class="item${item?.isRecipe ? " recipe" : ""}" data-id="${item?.id??0}">
583
- <img src="${item ? utils.getImageUrl(item.name, ImageType.Items) : ""}" alt="" />
584
- ${item ? `<p class="time">${utils.sec2time(item?.time) ?? ""}</p>` : ""}
585
- </div>`).join("")}
586
- </div>
587
- ${player.hero.id != 80?`
588
- <div class="backpack">
589
- ${player.backpacks.map((item) =>`
590
- <div class="item${item?.isRecipe ? " recipe" : ""}">
591
- <img src="${item ? utils.getImageUrl(item.name, ImageType.Items) : ""}" alt="" />
592
- </div>`).join("")}
593
- </div>`:`
594
- <img class="bear_icon" src="https://cdn.cloudflare.steamstatic.com/apps/dota2/images/dota_react/abilities/lone_druid_spirit_bear.png" alt="">
595
- <div class="bear">
596
- ${player.unitItems.map((item) =>`
597
- <div class="item${item?.isRecipe ? " recipe" : ""}" data-id="${item?.id??0}">
598
- <img src="${item ? utils.getImageUrl(item.name, ImageType.Items) : ""}" alt="" />
599
- ${item ? `<p class="time">${utils.sec2time(item?.time) ?? ""}</p>` : ""}
600
- </div>`).join("")}
601
- </div>
602
- <div class="neutral_item" style="background-image: url(${utils.getImageUrl(dotaconstants.item_ids[player.additionalUnit.neutral0Id], ImageType.Items)})"></div>`
603
- }
604
- </div>
605
- <div class="neutral_item row-1" style="background-image: url(${utils.getImageUrl(dotaconstants.item_ids[player.neutral0Id], ImageType.Items)})"></div>
606
- <div class="ahgs row-1">
607
- <img src="${utils.getImageUrl("scepter_"+((player.items.concat(player.backpacks).find(item=>item?.id==108)||(player.stats?.matchPlayerBuffEvent||[]).find(buff=>buff.itemId==108))?1:0))}" alt="" />
608
- <img src="${utils.getImageUrl("shard_"+((player.stats?.matchPlayerBuffEvent||[]).find(buff=>buff.itemId==609)?1:0))}" alt="" />
609
- </div>
610
- </div>
611
- `).join("") %>
612
- </section>
613
- </body>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Document</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" />
8
+ <%- "<style>" %>
9
+ <%- include("./match_2/regular.css") %>
10
+ <%- "</style>" %>
11
+ </head>
12
+ <body>
13
+ <%- include('./match_2/regular') %>
14
+ </body>
614
15
  </html>