@sjtdev/koishi-plugin-dota2tracker 1.5.2 → 1.5.4

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,1046 +1,56 @@
1
1
  <!DOCTYPE html>
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
- <style>
8
- html {
9
- width: 816px;
10
- font-family: 'MiSans', sans-serif;
11
- }
12
- body {
13
- background-color: black;
14
- color: white;
15
- width: 800px;
16
- }
17
-
18
- img {
19
- vertical-align: middle;
20
- }
21
-
22
- p {
23
- margin: 0;
24
- }
25
-
26
- .wrapper {
27
- width: 800px;
28
- height: auto;
29
- /* border: 10px solid white; */
30
- border-radius: 10px;
31
- overflow: hidden;
32
- }
33
-
34
- .wrapper > div:not(.players) {
35
- border-radius: 5px;
36
- box-shadow: 0 0 5px #fff;
37
- /* border: 5px solid #6cf; */
38
- overflow: auto;
39
- margin: 5px;
40
- display: flex;
41
- }
42
-
43
- .players > div {
44
- height: 1646px;
45
- }
46
-
47
- .match_info {
48
- display: flex;
49
- justify-content: space-around;
50
- flex-wrap: wrap;
51
- flex-direction: row;
52
- position: relative;
53
- }
54
-
55
- .match_info .flag {
56
- width: 100px;
57
- height: 100px;
58
- border-radius: 5px;
59
- /* z-index: -1; */
60
- }
61
-
62
- .match_info .flag:not(.won) {
63
- filter: grayscale(100%);
64
- }
65
-
66
- .match_info .rank,
67
- .match_info .star {
68
- position: absolute;
69
- width: 64px;
70
- bottom: 16px;
71
- }
72
-
73
- .match_info > p.won {
74
- position: absolute;
75
- width: 100px;
76
- bottom: 0;
77
- text-align: center;
78
- left: 690px;
79
- z-index: 1;
80
- }
81
-
82
- .match_info > p.won.radiant {
83
- left: 0;
84
- }
85
-
86
- .match_info .details {
87
- width: 590px;
88
- display: flex;
89
- flex-wrap: wrap;
90
- justify-content: space-around;
91
- align-content: space-between;
92
- }
93
-
94
- .match_info div.score {
95
- display: flex;
96
- width: 590px;
97
- flex-direction: row;
98
- align-items: baseline;
99
- }
100
-
101
- .match_info div.score .score {
102
- /* width: 280px; */
103
- flex-grow: 1;
104
- text-align: center;
105
- vertical-align: bottom;
106
- font-size: 32px;
107
- }
108
-
109
- .match_info div.score .time {
110
- line-height: 1;
111
- vertical-align: bottom;
112
- }
113
-
114
- .players {
115
- display: flex;
116
- /* flex-direction: row; */
117
- }
118
-
119
- .players > div {
120
- width: 400px;
121
- display: flex;
122
- flex-direction: column;
123
- }
124
-
125
- .player {
126
- width: 390px;
127
- border-radius: 5px;
128
- box-shadow: 0 0 5px #fff;
129
- /* border: 5px solid #6cf; */
130
- overflow: hidden;
131
- margin: 5px;
132
- /* display: flex; */
133
- flex-grow: 1;
134
- height: 320px;
135
- }
136
-
137
- .player > div {
138
- /* border: 5px solid #6cf; */
139
- display: flex;
140
- flex-direction: row;
141
- line-height: 24px;
142
- }
143
-
144
- .hero {
145
- margin-bottom: 4px;
146
- }
147
-
148
- .hero .player_avatar {
149
- width: 112px;
150
- height: 63px;
151
- position: relative;
152
- border-radius: 4px;
153
- flex-grow: 0;
154
- }
155
-
156
- .player.giveup .hero .player_avatar::before {
157
- content: "";
158
- position: absolute;
159
- top: 0;
160
- right: 0;
161
- bottom: 0;
162
- left: 0;
163
- width: 100%;
164
- height: 100%;
165
- background-size: contain;
166
- background-position: center;
167
- background-repeat: no-repeat;
168
- background-image: url("data:image/png;base64,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");
169
- }
170
-
171
- .hero .player_avatar p {
172
- position: absolute;
173
- /* width: 86px; */
174
- /* line-height: 0; */
175
- line-height: 1.5;
176
- font-size: 10px;
177
- margin: 0;
178
- }
179
-
180
- .hero .player_avatar .party_line {
181
- height: 2px;
182
- top: 0;
183
- width: 100%;
184
- }
185
-
186
- .hero .player_avatar .party_mark {
187
- line-height: 1.5;
188
- text-align: center;
189
- width: 16px;
190
- font-size: 10px;
191
- top: 3px;
192
- left: 2px;
193
- background-color: rgba(0, 0, 0, 0.8);
194
- }
195
-
196
- .hero .player_avatar .party_line.party_I {
197
- background-color: #caffe5;
198
- }
199
-
200
- .hero .player_avatar .party_mark.party_I {
201
- color: #caffe5;
202
- }
203
-
204
- .hero .player_avatar .party_mark.party_I::after {
205
- content: "I";
206
- }
207
-
208
- .hero .player_avatar .party_line.party_II {
209
- background-color: #ffe484;
210
- }
211
-
212
- .hero .player_avatar .party_mark.party_II {
213
- color: #ffe484;
214
- }
215
-
216
- .hero .player_avatar .party_mark.party_II::after {
217
- content: "II";
218
- }
219
-
220
- .hero .player_avatar .party_line.party_III {
221
- background-color: #e19be2;
222
- }
223
-
224
- .hero .player_avatar .party_mark.party_III {
225
- color: #e19be2;
226
- }
227
-
228
- .hero .player_avatar .party_mark.party_III::after {
229
- content: "III";
230
- }
231
-
232
- .hero .player_avatar .party_line.party_IV {
233
- background-color: #ccdaf4;
234
- }
235
-
236
- .hero .player_avatar .party_mark.party_IV {
237
- color: #ccdaf4;
238
- }
239
-
240
- .hero .player_avatar .party_mark.party_IV::after {
241
- content: "IV";
242
- }
243
-
244
- .hero .player_avatar img {
245
- width: 100%;
246
- height: 100%;
247
- flex-grow: 0;
248
- }
249
-
250
- .hero .player_avatar .position {
251
- /* width: auto; */
252
- line-height: 1.2;
253
- text-align: right;
254
- top: 3px;
255
- right: 0;
256
- color: #cccccc;
257
- text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5), 1px -1px 0 rgba(0, 0, 0, 0.5), -1px 1px 0 rgba(0, 0, 0, 0.5), 1px 1px 0 rgba(0, 0, 0, 0.5); /* 描边效果 */
258
- }
259
-
260
- .hero .player_avatar .position.p1::first-line {
261
- color: red;
262
- }
263
-
264
- .hero .player_avatar .position.p2::first-line {
265
- color: yellow;
266
- }
267
-
268
- .hero .player_avatar .position.p3::first-line {
269
- color: green;
270
- }
271
-
272
- .hero .player_avatar .level {
273
- right: 2px;
274
- bottom: 1px;
275
- font-size: 12px;
276
- color: rgba(255, 255, 255, 1);
277
- /* color: #cccccc; */
278
- text-shadow: 0 0 4px black;
279
- }
280
-
281
- .hero .player_avatar .facet {
282
- width: 112px;
283
- height: 24px;
284
- position: absolute;
285
- left: 0;
286
- bottom: -24px;
287
- display: grid;
288
- grid-template-columns: 24px auto;
289
- align-items: center;
290
- }
291
- .hero .player_avatar .facet img{
292
- padding: 3px;
293
- width: 18px;
294
- height: 18px;
295
- background-color: #4444;
296
- }
297
- .hero .player_avatar .facet span{
298
- display: grid;
299
- place-items: center;
300
- align-items: center;
301
- justify-content: center;
302
- height: 100%;
303
- width: 88px;
304
- position: relative;
305
- }
306
- .hero .player_avatar .facet span > * {
307
- box-sizing: border-box;
308
- padding: 0 4px;
309
- max-width: 100%;
310
- overflow: hidden;
311
- text-overflow: ellipsis;
312
- white-space: nowrap;
313
- font-size: 14px;
314
- }
315
- .hero > .player_avatar > .facet.Red {
316
- background: linear-gradient(to right, #9f3c3c, #4a2026);
317
- }
318
- .hero > .player_avatar > .facet.Yellow {
319
- background: linear-gradient(to right, #c8a45c, #6f3d21);
320
- }
321
- .hero > .player_avatar > .facet.Green {
322
- background: linear-gradient(to right, #a2b23e, #2d5a18);
323
- }
324
- .hero > .player_avatar > .facet.Blue {
325
- background: linear-gradient(to right, #547ea6, #2a385e);
326
- }
327
- .hero > .player_avatar > .facet.Purple {
328
- background: linear-gradient(to right, #675cae, #261c44);
329
- }
330
- .hero > .player_avatar > .facet.Gray {
331
- background: linear-gradient(to right, #adb6be, #4e5557);
332
- }
333
-
334
- .hero .player_info {
335
- /* width: 210px; */
336
- text-align: center;
337
- margin: 0 18px;
338
- flex-grow: 0;
339
- height: 63px;
340
- font-size: 15px;
341
- line-height: 1.5;
342
- width: 144px;
343
- }
344
-
345
- .hero .player_info .player_name {
346
- max-width: 100%;
347
- overflow: hidden;
348
- text-overflow: ellipsis;
349
- white-space: nowrap;
350
- }
351
-
352
- .hero .player_info .player_performance {
353
- text-wrap: nowrap;
354
- }
355
-
356
- .hero .player_info .networth {
357
- color: rgb(203, 176, 42);
358
- }
359
-
360
- .hero .player_lane {
361
- margin-top: 6px;
362
- width: 44px;
363
- height: 100%;
364
- text-align: center;
365
- display: flex;
366
- flex-direction: column;
367
- }
368
-
369
- .hero .player_lane svg {
370
- width: 44px;
371
- height: 44px;
372
- margin-bottom: 3px;
373
- }
374
-
375
- .hero .player_lane svg path {
376
- /* fill: red; */
377
- }
378
-
379
- .hero .player_lane span {
380
- width: 100%;
381
- font-size: 10px;
382
- line-height: 1;
383
- }
384
-
385
- .hero .player_lane.advantage svg path {
386
- fill: lightgreen;
387
- }
388
-
389
- .hero .player_lane.stomp svg path {
390
- fill: green;
391
- }
392
-
393
- .hero .player_lane.stomped svg path {
394
- fill: red;
395
- }
396
-
397
- .hero .player_rank {
398
- flex-grow: 1;
399
- position: relative;
400
- }
401
-
402
- .hero .player_rank .rank .medal {
403
- z-index: 1;
404
- }
405
-
406
- .hero .player_rank .rank .star {
407
- z-index: 2;
408
- }
409
-
410
- .hero .player_rank .rank p {
411
- z-index: 3;
412
- }
413
-
414
- .hero .player_rank div {
415
- height: 36px;
416
- width: 36px;
417
- top: 0;
418
- right: 0;
419
- position: absolute;
420
- }
421
-
422
- .hero .player_rank img {
423
- top: 0;
424
- right: 0;
425
- position: absolute;
426
- height: 36px;
427
- }
428
-
429
- .hero .player_rank .dotaPlusLevel {
430
- background-size: 100%;
431
- position: absolute;
432
- top: auto;
433
- bottom: 0;
434
- }
435
-
436
- .hero .player_rank p {
437
- font-size: 10px;
438
- line-height: 1;
439
- position: absolute;
440
- text-align: center;
441
- width: 36px;
442
- bottom: 0;
443
- /* background-color: #222; */
444
- /* border: black 1px solid; */
445
- box-sizing: border-box;
446
- text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; /* 描边效果 */
447
- }
448
-
449
- .titles {
450
- display: block;
451
- margin-bottom: 4px;
452
- padding-left: 4px;
453
- height: 24px;
454
- margin-left: 120px;
455
- /* text-shadow: -1px -1px 2px #aaa, 1px -1px 2px #aaa, -1px 1px 2px #aaa, 1px 1px 2px #aaa; */ /*描边效果 */
456
- }
457
-
458
- .titles > span {
459
- margin-right: 4px;
460
- }
461
-
462
- .items {
463
- margin-bottom: 2px;
464
- position: relative;
465
- }
466
-
467
- .items > * {
468
- /* margin-bottom: 14px; */
469
- /* flex-basis: content; */
470
- width: 0;
471
- }
472
-
473
- .items .item {
474
- position: relative;
475
- /* margin-bottom: 8px; */
476
- width: 100%;
477
- /* width: 54px; */
478
- flex-grow: 1;
479
- }
480
-
481
- .item img {
482
- width: 100%;
483
- }
484
-
485
- .item.recipe {
486
- background-image: url("<%= utils.getImageUrl('recipe', ImageType.Items) %>");
487
- background-size: 100%;
488
- }
489
-
490
- .item.recipe img {
491
- opacity: 0.75;
492
- /* width: 50%; */
493
- transform: scale(0.6);
494
- transform-origin: top right;
495
- }
496
-
497
- .item .time {
498
- text-align: center;
499
- width: 100%;
500
- margin: 0;
501
- font-size: 12px;
502
- line-height: 1;
503
- position: absolute;
504
- /* bottom: -8px; */
505
- bottom: 0;
506
- color: #ccc;
507
- background-color: rgba(100, 100, 100, 0.75);
508
- }
509
-
510
- .items .items_normal {
511
- flex-grow: 9;
512
- display: flex;
513
- flex-wrap: wrap;
514
- }
515
-
516
- .items .items_normal .item {
517
- /* flex-grow: 2; */
518
- width: 33.33%;
519
- }
520
-
521
- .items .items_backpack {
522
- flex-grow: 2;
523
- display: flex;
524
- flex-direction: column;
525
- }
526
-
527
- .items .item.back {
528
- filter: grayscale(100%);
529
- }
530
-
531
- .items .item.neutral {
532
- flex-grow: 3;
533
- width: 0;
534
- background-repeat: no-repeat;
535
- background-size: 100%;
536
- background-position: center;
537
- }
538
-
539
- /* kkk */
540
- .player.bear .items_buffs {
541
- height: 73.78px;
542
- /* margin-bottom: 4px; */
543
- display: flex;
544
- flex-direction: row;
545
- }
546
-
547
- .player.bear .items_buffs:nth-child(3) {
548
- margin-bottom: 4.04px;
549
- }
550
-
551
- .player.bear .items {
552
- display: grid;
553
- height: 100%;
554
- flex-wrap: wrap;
555
- width: 250.74px;
556
- margin-right: 4px;
557
- grid-template-columns: repeat(6,1fr);
558
- grid-template-rows: repeat(2,40px);
559
- }
560
-
561
- .player.bear .items .item {
562
- flex-grow: 0;
563
- width: 41.79px;
564
- position: relative;
565
- }
566
-
567
- .player.bear .ibs .item img {
568
- width: 100%;
569
- }
570
-
571
- .player.bear .items .item.neutral {
572
- margin-left: auto;
573
- }
574
-
575
- .player.bear .buffs,
576
- .player.bear .support_items {
577
- display: flex;
578
- margin-left: auto;
579
- width: 0;
580
- flex-grow: 1;
581
- flex-direction: row;
582
- justify-content: flex-end;
583
- }
584
-
585
- .buffs_supportItems.slave {
586
- width: 0;
587
- flex-grow: 1;
588
- display: flex;
589
- flex-direction: column;
590
- justify-content: space-between;
591
- }
592
-
593
- .buffs_supportItems.slave > .support_items,
594
- .buffs_supportItems.slave > .buffs {
595
- flex-grow: 0;
596
- width: auto;
597
- height: 24px;
598
- display: flex;
599
- flex-direction: row;
600
- }
601
-
602
- .buffs {
603
- margin-bottom: 4px;
604
- height: 24px;
605
- }
606
-
607
- .buffs section {
608
- text-align: center;
609
- }
610
-
611
- .buff img,
612
- .support_item img {
613
- height: 24px;
614
- }
615
-
616
- .buffs .buff,
617
- .support_item {
618
- /* display: inline; */
619
- position: relative;
620
- }
621
-
622
- .buff p,
623
- .support_item p {
624
- text-align: center;
625
- width: 100%;
626
- margin: 0;
627
- font-size: 12px;
628
- line-height: 1;
629
- position: absolute;
630
- bottom: 0;
631
- color: #aaa;
632
- background-color: rgba(100, 100, 100, 0.5);
633
- }
634
-
635
- .buffs section {
636
- display: flex;
637
- }
638
-
639
- .player .details,
640
- .buffs {
641
- font-size: 13px;
642
- flex-wrap: wrap;
643
- /* height: 400px; */
644
- align-content: space-between;
645
- justify-content: space-between;
646
- flex-direction: row;
647
- /* justify-content: space-around; */
648
- }
649
-
650
- .player .details {
651
- margin-bottom: 0;
652
- }
653
-
654
- .player .details section {
655
- flex-grow: 1;
656
- text-align: center;
657
- margin: 0 4px;
658
- }
659
-
660
- .ban_list {
661
- flex-wrap: wrap;
662
- flex-direction: row;
663
- }
664
-
665
- .ban_list div {
666
- width: 79px;
667
- height: 44px;
668
- background-repeat: no-repeat;
669
- background-size: 100%;
670
- position: relative;
671
- }
672
-
673
- .ban_list div img {
674
- filter: grayscale(100%);
675
- width: 100%;
676
- vertical-align: middle;
677
- }
678
-
679
- .ban_list div::before {
680
- filter: none;
681
- position: absolute;
682
- display: block;
683
- /* width: 40px; */
684
- width: 100%;
685
- height: 100%;
686
- /* background-color: red; */
687
- content: "";
688
- z-index: 1;
689
- background: linear-gradient(to bottom left, transparent calc(50% - 1px), red calc(50% - 1px), black calc(50% + 1px), transparent calc(50% + 1px));
690
- }
691
- /* --------------------------------------- */
692
- </style>
693
- <script>
694
- window.onload = function () {
695
- // 查找所有具有指定类名的img元素
696
- var images = document.querySelectorAll(".item img");
697
- // 为每个元素添加onerror处理器
698
- images.forEach(function (image) {
699
- image.onerror = function () {
700
- this.onerror = null; // 防止无限循环
701
- this.classList.add("unload"); // 添加类
702
- this.src = "backup-image.jpg"; // 设置备用图片
703
- };
704
- });
705
- };
706
- </script>
707
- </head>
708
- <body>
709
- <% const match = data;
710
- let kcndcStyle = {
711
- kc: function (num) {
712
- let red = (255 - (num * 255) / 100).toFixed(2);
713
- return `rgb(255,${red},${red})`;
714
- },
715
- dc: function (num) {
716
- let gray = ((50 - Math.min(num, 50)) * (255 / 50)).toFixed(2);
717
- return `rgb(${gray},${gray},${gray})`;
718
- },
719
- };
720
- // 对线结果的图标(来自免费SVG素材网)
721
- const laneSVG = {
722
- stomp: utils.getImageUrl("lane_stomp", undefined, ImageFormat.svg),
723
- advantage: utils.getImageUrl("lane_victory", undefined, ImageFormat.svg),
724
- disadvantage: utils.getImageUrl("lane_fail", undefined, ImageFormat.svg),
725
- stomped: utils.getImageUrl("lane_stomped", undefined, ImageFormat.svg),
726
- tie: utils.getImageUrl("lane_tie", undefined, ImageFormat.svg),
727
- jungle: utils.getImageUrl("lane_jungle", undefined, ImageFormat.svg),
728
- };
729
- %>
730
- <div class="wrapper">
731
- <%- `
732
- <div class="match_info">
733
- <img src="${utils.getImageUrl("flag_radiant")}" alt="" class="flag radiant${match.didRadiantWin ? " won" : ""}" style="order: 1" />
734
- <img src="${utils.getImageUrl("flag_dire")}" alt="" class="flag dire${match.didRadiantWin ? "" : " won"}" style="order: 3" />
735
- <p class="won${match.didRadiantWin ? " radiant" : ""}">${$t("dota2tracker.template.won")}</p>
736
- <div class="details" style="order: 2">
737
- <p>${$t("dota2tracker.template.match_id_")}<span class="match_id">${match.id}</span></p>
738
- <p>${$t("dota2tracker.template.game_mode_")}<span class="mode">${$t("dota2tracker.template.lobby_types."+match.lobbyType) || match.lobbyType}/${$t("dota2tracker.template.game_modes."+match.gameMode) || match.gameMode}</span></p>
739
- <p>${$t("dota2tracker.template.region_")}<span class="server">${$t("dota2tracker.template.regions." + match.regionId)}</span></p>
740
- <p>${$t("dota2tracker.template.start_time_")}<span class="start_time">${moment(new Date(match.startDateTime * 1000))
741
- .format("YYYY-MM-DD HH:mm:ss")
742
- .slice(2)}</span></p>
743
- <img src="${utils.getImageUrl("star_" + match.rank?.toString().split("")[1])}" alt="" class="star">
744
- <img src="${utils.getImageUrl("medal_" + match.rank?.toString().split("")[0])}" alt="" class="rank">
745
- <p>${$t("dota2tracker.template.end_time_")}<span class="end_time">${moment(new Date(match.endDateTime * 1000))
746
- .format("YYYY-MM-DD HH:mm:ss")
747
- .slice(2)}</span></p>
748
- <div class="score">
749
- <p class="score radiant">${match.radiant.killsCount}</p>
750
- <p class="time">${utils.sec2time(match.durationSeconds)}</p>
751
- <p class="score dire">${match.dire.killsCount}</p>
752
- </div>
753
- </div>
754
- </div>
755
- ` %>
756
- <div class="players">
757
- <%- match.players.map((player) =>`
758
- <div class="player ${player.team}${player.hero.id == 80 ? " bear" : ""}${player.leaverStatus != "NONE" && player.leaverStatus != "DISCONNECTED" ? " giveup" : ""}" style="order:${player.position?.slice(-1)}">
759
- <div class="hero">
760
- <div class="player_avatar">
761
- <img alt="" src="${utils.getImageUrl(player.hero.shortName, ImageType.Heroes)}" />
762
- <p class="party_line${player.partyId != null ? " party_" + match.party[player.partyId] : ""}"></p>
763
- <p class="party_mark${player.partyId != null ? " party_" + match.party[player.partyId] : ""}"></p>
764
- <p class="position p${Math.floor(player.order / 4) + 1}">${player.isRandom ? $t("dota2tracker.template.random") : $t("dota2tracker.template.pick_order",[`<span>${player.order == null ? "?" : player.order + 1}</span>`])}<br/>${$t("dota2tracker.template.position_"+player.position?.slice(-1))??''}</p>
765
- <p class="level">${player.level}</p>
766
- ${player.facet ? `
767
- <div class="facet ${player.facet.color}">
768
- <img src="${utils.getImageUrl(player.facet.icon, ImageType.IconsFacets)}">
769
- <span><p style="font-size: ${player.facet.name.length > 7 ? 10 : player.facet.name.length > 5 ? 12 : 14}px;">${player.facet.name}</p></span>
770
- </div>` : ""}
771
- </div>
772
- <div class="player_info">
773
- <summary class="player_name">${eh(player.steamAccount.name)}</summary>
774
- <summary class="player_performance">
775
- <span class="kda">${player.kills}/${player.deaths}/${player.assists}</span>&nbsp;&nbsp;
776
- <span class="kc" style="color:${kcndcStyle.kc(player.killContribution * 100)}">${Math.floor(player.killContribution * 100)}%</span>&nbsp;&nbsp;
777
- <span class="dc" style="color:${kcndcStyle.dc(player.deathContribution * 100)}">${Math.floor(player.deathContribution * 100)}%</span></summary>
778
- <summary class="player_net"><span class="networth">${player.networth}</span>&emsp;<span class="score">${(player.heroDamage / player.networth)?.toFixed(2)}</span></summary>
779
- </div>
780
- <div class="player_lane ${player.laneResult}">
781
- <span>${$t("dota2tracker.template.lane_" + player.laneResult)}</span>
782
- ${laneSVG[player.laneResult]}
783
- </div>
784
- <div class="player_rank">
785
- <div class="rank">
786
- <img class="medal" src="${utils.getImageUrl(
787
- "medal_" +
788
- ((player.steamAccount.seasonLeaderboardRank
789
- ? player.steamAccount.seasonLeaderboardRank <= 100
790
- ? player.steamAccount.seasonLeaderboardRank <= 10
791
- ? "8c"
792
- : "8b"
793
- : player.steamAccount.seasonRank?.toString().split("")[0]
794
- : player.steamAccount.seasonRank?.toString().split("")[0]) ?? "0")
795
- )}" alt="" />
796
- <img class="star" src="${utils.getImageUrl("star_" + (player.steamAccount.seasonRank?.toString().split("")[1] ?? "0"))}" alt="" />
797
- <p>${player.steamAccount.seasonLeaderboardRank ?? ""}</p>
798
- </div>
799
- <div class="dotaPlusLevel"${!player.dotaPlus ? ` style="display:none"` : ""}>
800
- <img src="${utils.getImageUrl("hero_badge_" + (player.dotaPlus ? Math.ceil((player.dotaPlus?.level + 1) / 6) : 1))}" alt="" class="badge">
801
- <p class="level">${player.dotaPlus?.level}</p>
802
- </div>
803
- </div>
804
- </div>
805
- <div class="titles">
806
- ${player.titles.map((item) => {const [title, color] = $t(item).split("-"); return `<span style="color: ${color};">${title}</span>`}).join("")}
807
- </div>
808
- ${player.hero.id != 80 ? `
809
- <div class="items">
810
- <div class="items_normal">
811
- ${player.items
812
- .map((item) =>
813
- item
814
- ? `
815
- <div class="item${item.isRecipe ? " recipe" : ""}">
816
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
817
- <p class="time">${utils.sec2time(item.time)}</p>
818
- </div>`
819
- : `
820
- <div class="item" style="visibility:hidden">
821
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />
822
- <p class="time">--:--</p>
823
- </div>`
824
- )
825
- .join("")}
826
- </div>
827
- <div class="items_backpack">
828
- ${player.backpacks
829
- .map((item) =>
830
- item
831
- ? `
832
- <div class="item back${item.isRecipe ? " recipe" : ""}">
833
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
834
- <p class="time">${utils.sec2time(item.time)}</p>
835
- </div>`
836
- : `
837
- <div class="item back" style="visibility:hidden">
838
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />
839
- <p class="time">--:--</p>
840
- </div>`
841
- )
842
- .join("")}
843
- </div>
844
- <div class="item neutral" style="background-image: url(${utils.getImageUrl(dotaconstants.item_ids[player.neutral0Id], ImageType.Items)})"></div>
845
- </div>
846
- <div class="buffs">
847
- <section>
848
- ${player.stats?.matchPlayerBuffEvent
849
- ?.map(
850
- (buff) => `
851
- <div class="buff">
852
- <img src="${utils.getImageUrl(dotaconstants[buff.abilityId ? "ability_ids" : "item_ids"][buff.abilityId ?? buff.itemId], buff.abilityId ? ImageType.Abilities : ImageType.Items)}" alt="" />
853
- <p>${buff.stackCount ?? ""}</p>
854
- </div>`
855
- )
856
- .join("")??""}
857
- </section>
858
- <section>
859
- <div class="support_item"${player.supportItemsCount[30] > 0 ? "" : ' style="display:none"'}>
860
- <img src="${utils.getImageUrl("gem", ImageType.Items)}" alt="" />
861
- <p>${player.supportItemsCount[30]}</p>
862
- </div>
863
- <div class="support_item"${player.supportItemsCount[40] > 0 ? "" : ' style="display:none"'}>
864
- <img src="${utils.getImageUrl("dust", ImageType.Items)}" alt="" />
865
- <p>${player.supportItemsCount[40]}</p>
866
- </div>
867
- <div class="support_item"${player.supportItemsCount[42] > 0 ? "" : ' style="display:none"'}>
868
- <img src="${utils.getImageUrl("ward_observer", ImageType.Items)}" alt="" />
869
- <p>${player.supportItemsCount[42]}</p>
870
- </div>
871
- <div class="support_item"${player.supportItemsCount[43] > 0 ? "" : ' style="display:none"'}>
872
- <img src="${utils.getImageUrl("ward_sentry", ImageType.Items)}" alt="" />
873
- <p>${player.supportItemsCount[43]}</p>
874
- </div>
875
- <div class="support_item"${player.supportItemsCount[188] > 0 ? "" : ' style="display:none"'}>
876
- <img src="${utils.getImageUrl("smoke_of_deceit", ImageType.Items)}" alt="" />
877
- <p>${player.supportItemsCount[188]}</p>
878
- </div>
879
- </section>
880
- </div>`
881
- : `
882
- <div class="items_buffs master">
883
- <div class="items master">
884
- ${player.items
885
- .map((item) =>
886
- item
887
- ? `
888
- <div class="item${item.isRecipe ? " recipe" : ""}">
889
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
890
- <p class="time">${utils.sec2time(item.time)}</p>
891
- </div>`
892
- : `
893
- <div class="item" style="visibility:hidden">
894
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />>
895
- <p class="time">--:--</p>
896
- </div>`
897
- )
898
- .join("")}
899
- ${player.backpacks
900
- .map((item) =>
901
- item
902
- ? `
903
- <div class="item back${item.isRecipe ? " recipe" : ""}">
904
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
905
- <p class="time">${utils.sec2time(item.time)}</p>
906
- </div>`
907
- : `
908
- <div class="item back" style="visibility:hidden">
909
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />
910
- <p class="time">--:--</p>
911
- </div>`
912
- )
913
- .join("")}
914
- <div class="item neutral">
915
- <img src="${utils.getImageUrl(dotaconstants.item_ids[player.neutral0Id], ImageType.Items)}" alt="" />
916
- </div>
917
- </div>
918
- <div class="buffs master">
919
- ${player.stats?.matchPlayerBuffEvent
920
- ?.map(
921
- (buff) => `
922
- <div class="buff">
923
- <img src="${utils.getImageUrl(dotaconstants[buff.abilityId ? "ability_ids" : "item_ids"][buff.abilityId ?? buff.itemId], buff.abilityId ? ImageType.Abilities : ImageType.Items)}" alt="" />
924
- <p>${buff.stackCount ?? ""}</p>
925
- </div>`
926
- )
927
- .join("")}
928
- </div>
929
- </div>
930
- <div class="items_buffs slave">
931
- <div class="items slave">
932
- ${player.unitItems
933
- .map((item) =>
934
- item
935
- ? `
936
- <div class="item${item.isRecipe ? " recipe" : ""}">
937
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
938
- <p class="time">${utils.sec2time(item.time)}</p>
939
- </div>`
940
- : `
941
- <div class="item" style="visibility:hidden">
942
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />>
943
- <p class="time">--:--</p>
944
- </div>`
945
- )
946
- .join("")}
947
- ${player.unitBackpacks
948
- .map((item) =>
949
- item
950
- ? `
951
- <div class="item back${item.isRecipe ? " recipe" : ""}">
952
- <img src="${utils.getImageUrl(item.name, ImageType.Items)}" alt="" />
953
- <p class="time">${utils.sec2time(item.time)}</p>
954
- </div>`
955
- : `
956
- <div class="item back" style="visibility:hidden">
957
- <img src="${utils.getImageUrl("blink", ImageType.Items)}" alt="" />
958
- <p class="time">--:--</p>
959
- </div>`
960
- )
961
- .join("")}
962
- <div class="item neutral">
963
- <img src="${utils.getImageUrl(dotaconstants.item_ids[player.additionalUnit.neutral0Id], ImageType.Items)}" alt="" />
964
- </div>
965
- </div>
966
- <div class="buffs_supportItems slave">
967
- <div class="buffs">
968
- <!-- 无有效API获取熊灵buff -->
969
- </div>
970
- <div class="support_items">
971
- <div class="support_item"${player.supportItemsCount[30] > 0 ? "" : ' style="display:none"'}>
972
- <img src="${utils.getImageUrl("gem", ImageType.Items)}" alt="" />
973
- <p>${player.supportItemsCount[30]}</p>
974
- </div>
975
- <div class="support_item"${player.supportItemsCount[40] > 0 ? "" : ' style="display:none"'}>
976
- <img src="${utils.getImageUrl("dust", ImageType.Items)}" alt="" />
977
- <p>${player.supportItemsCount[40]}</p>
978
- </div>
979
- <div class="support_item"${player.supportItemsCount[42] > 0 ? "" : ' style="display:none"'}>
980
- <img src="${utils.getImageUrl("ward_observer", ImageType.Items)}" alt="" />
981
- <p>${player.supportItemsCount[42]}</p>
982
- </div>
983
- <div class="support_item"${player.supportItemsCount[43] > 0 ? "" : ' style="display:none"'}>
984
- <img src="${utils.getImageUrl("ward_sentry", ImageType.Items)}" alt="" />
985
- <p>${player.supportItemsCount[43]}</p>
986
- </div>
987
- <div class="support_item"${player.supportItemsCount[188] > 0 ? "" : ' style="display:none"'}>
988
- <img src="${utils.getImageUrl("smoke_of_deceit", ImageType.Items)}" alt="" />
989
- <p>${player.supportItemsCount[188]}</p>
990
- </div>
991
- </div>
992
- </div>
993
- </div>`}
994
- <div class="details">
995
- <section>${$t("dota2tracker.template.hero_damage_")}<span class="hero_damage">${player.heroDamage}</span></section>
996
- <section>${$t("dota2tracker.template.building_damage_")}<span class="building_damage">${player.towerDamage}</span></section>
997
- <section>${$t("dota2tracker.template.damage_received_")}<span class="tak">${
998
- (player.stats?.heroDamageReport?.receivedTotal.physicalDamage??0) + (player.stats?.heroDamageReport?.receivedTotal.magicalDamage??0) + (player.stats?.heroDamageReport?.receivedTotal.pureDamage??0)
999
- }</span></section>
1000
- <section>${$t("dota2tracker.template.lasthit_")}<span class="lh">${player.numLastHits}</span>/<span class="dn">${player.numDenies}</span></section>
1001
- <section>${$t("dota2tracker.template.GPM/XPM_")}<span class="gpm">${player.goldPerMinute}</span>/<span class="xpm">${player.experiencePerMinute}</span></section>
1002
- <section>${$t("dota2tracker.template.heal_")}<span class="heal">${player.heroHealing}</span></section>
1003
- <section>${$t("dota2tracker.template.crowd_control_duration_")}<span class="building_damage">${((player.stats?.heroDamageReport?.dealtTotal.stunDuration ?? 0) / 100).toFixed(2)}/${((player.stats?.heroDamageReport?.dealtTotal.slowDuration ?? 0) / 100).toFixed(2)}/${(
1004
- (player.stats?.heroDamageReport?.dealtTotal.disableDuration ?? 0) / 100
1005
- ).toFixed(2)}</span>s</section>
1006
- </div>
1007
- </div>`).join("") %>
1008
- </div>
1009
- <div class="ban_list">
1010
- <%- (match.pickBans??[])
1011
- .filter((hero) => !hero.isPick)
1012
- .map((hero) => `<div class="ban_hero"><img src="${utils.getImageUrl(/^npc_dota_hero_(?<name>.+)$/.exec(dotaconstants.heroes[hero.bannedHeroId].name)[1], ImageType.Heroes)}" alt="" /></div>`)
1013
- .join("") %>
1014
- </div>
1015
- </div>
1016
- </body>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Document</title>
7
+ <%- `<style>` %>
8
+ <%- include(`./match_1/style.css`) %>
9
+ <% if (fontFamily && fontFamily.length > 0) { %>
10
+ <%- `body { font-family: ${fontFamily.map(f => `${f}`).join(", ")}; }` %>
11
+ <% } %>
12
+ <%- "</style>" %>
13
+ <style>
14
+ .box {
15
+ border-radius: 5px;
16
+ border: 2px solid rgba(255, 255, 255, 0.25);
17
+ overflow: hidden;
18
+ }
19
+ </style>
20
+ </head>
21
+ <% const match = data; %>
22
+ <%
23
+ const partyColor = ["#caffe5","#ffe484","#e19be2","#ccdaf4"]
24
+ const facetColor = {
25
+ Red: "from-[#9f3c3c] to-[#4a2026]",
26
+ Yellow: "from-[#c8a45c] to-[#6f3d21]",
27
+ Green: "from-[#a2b23e] to-[#2d5a18]",
28
+ Blue: "from-[#547ea6] to-[#2a385e]",
29
+ Purple: "from-[#675cae] to-[#261c44]",
30
+ Gray: "from-[#adb6be] to-[#4e5557]",
31
+ Black: "from-[#2d2d2d] to-[#000000]"
32
+ }
33
+ let kcndcStyle = {
34
+ kc: function (num) {
35
+ let red = (255 - (num * 255) / 100).toFixed(2);
36
+ return `rgb(255,${red},${red})`;
37
+ },
38
+ dc: function (num) {
39
+ let gray = ((50 - Math.min(num, 50)) * (255 / 50)).toFixed(2);
40
+ return `rgb(${gray},${gray},${gray})`;
41
+ },
42
+ };
43
+ // 对线结果的图标(来自免费SVG素材网)
44
+ const laneSVG = {
45
+ stomp: utils.getImageUrl("lane_stomp", undefined, ImageFormat.svg),
46
+ advantage: utils.getImageUrl("lane_victory", undefined, ImageFormat.svg),
47
+ disadvantage: utils.getImageUrl("lane_fail", undefined, ImageFormat.svg),
48
+ stomped: utils.getImageUrl("lane_stomped", undefined, ImageFormat.svg),
49
+ tie: utils.getImageUrl("lane_tie", undefined, ImageFormat.svg),
50
+ jungle: utils.getImageUrl("lane_jungle", undefined, ImageFormat.svg),
51
+ };
52
+ %>
53
+ <body class="bg-black w-[800px] text-white">
54
+ <%- include(`./match_1/main.ejs`, { match, partyColor, facetColor, kcndcStyle, laneSVG }) %>
55
+ </body>
1017
56
  </html>
1018
- <script>
1019
- // 获取原始的玩家容器
1020
- const originalContainer = document.querySelector('.players');
1021
-
1022
- // 创建新的容器
1023
- const radiantContainer = document.createElement('div');
1024
- radiantContainer.className = 'radiant_players';
1025
-
1026
- const direContainer = document.createElement('div');
1027
- direContainer.className = 'dire_players';
1028
-
1029
- // 获取所有玩家元素
1030
- const players = document.querySelectorAll('.player');
1031
-
1032
- // 根据玩家类型将玩家移动到新的容器
1033
- players.forEach(player => {
1034
- if (player.classList.contains('radiant')) {
1035
- radiantContainer.appendChild(player);
1036
- } else if (player.classList.contains('dire')) {
1037
- direContainer.appendChild(player);
1038
- }
1039
- });
1040
-
1041
- // 清空原始容器并添加新的分组容器
1042
- originalContainer.innerHTML = '';
1043
- originalContainer.appendChild(radiantContainer);
1044
- originalContainer.appendChild(direContainer);
1045
-
1046
- </script>