@sjtdev/koishi-plugin-dota2tracker 1.2.2 → 1.2.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.
package/changelog.md ADDED
@@ -0,0 +1,89 @@
1
+ ### 1.2.4
2
+ **修复**:修正调用help指令时本插件某些指令的说明错误
3
+ **修复**:修复`取消订阅`指令失效的问题
4
+
5
+ ### 1.2.3
6
+ **修复**:修复了比赛战报图片中称号`摸`判定不正确的问题
7
+ **改进**:微调了比赛战报图片模板`match_2`中称号的显示样式
8
+
9
+ ### 1.2.2
10
+ **移除**:取消`查询英雄`的缓存功能,原因为valve的API返回的数据可能包含未本地化的字段(例如这次的7.36b更新后获取到的很多改动后技能说明暂时都是英文),这些数据无法根据版本判断是否需要更新缓存。
11
+ **修复**:修复了`查询英雄`图片中某些命石提供技能可能被判定为先天技能的问题。(实际为API缺陷)
12
+
13
+ ### 1.2.1
14
+ **改进**:优化比赛战报图片中,对多个同种物品(例如双护腕双挂件一类)的出装时间显示进行优化,原先都将显示为最后一件此种物品的购买时间,现在可以显示不同的时间。
15
+ > 从第一件购买时间算起,例如火枪于1:00 2:00 3:00购买了三个系带,游戏结束前卖出其中之一,则剩余两个则显示为1:00 2:00
16
+
17
+ **改进**:出于实用性考虑,比赛战报图片中将不再显示辅助道具的购买时间。
18
+
19
+ ### 1.2.0
20
+ **改进**:对`查询英雄`模板代码进行了调整与部分重写,完成7.36版本的英雄数据匹配,现在可正常使用。
21
+ > (人话说就是先天技能和命石适配完成了)
22
+
23
+ **移除**:因`查询英雄`指令已适配7.36版本,`7.36`指令退役。(删除)
24
+ #### hotfix
25
+ **修复**:删除一些留存的测试用代码
26
+
27
+ ### 1.1.10
28
+ **修复**:修复`7.36`指令因DOTA2官网的cdn链接变动导致获取失败的问题,并优化了加载速度。
29
+ **修复**:修复每次在koishi重新启动后,使用指令`7.36`都会重新获取数据的问题。
30
+ #### hotfix
31
+ **修复**:修复一处编译问题导致`7.36`指令无法使用的问题
32
+
33
+ ### 1.1.9
34
+ **新增**:v1.1.6加入的功能等待解析时间现在可以配置,位于插件页配置项`dataParsingTimeoutMinutes`
35
+ **修复**:修复因v1.1.8修改数据获取方式导致的`绑定`指令失效
36
+ **修复**:修复指令`查询英雄`报错问题(数据仍为7.35d,等待上游API更新)
37
+ **改进**:兼容Discord、KOOK等频道类平台,将订阅与绑定存储时群组(guild)改为频道(channel),对onebot(qq)类无影响(出现使用问题请联系我)
38
+ <details>
39
+ <summary>若此前已在使用频道类平台……</summary>
40
+ 此版本前频道类平台应该无法使用战报功能与日报功能。此版本在订阅本群与绑定玩家时将存储channelId而不是guildID,对于非频道类平台这两个值是一样的,不会造成影响。但频道类平台应该会彻底失效,解决方案只有操作数据库,将channelId填入原先guildId处(兼容原因,未修改数据库字段名[guildId],但实际上存入的已经是channel的ID了;guildId和channelId可参考数据库表channel中的数据),或重新订阅与绑定。(若是重新订阅与绑定,不会覆盖原先存储guildId的数据,也就是说旧数据依然会存在,可根据需求选择是否删除)
41
+ </details>
42
+
43
+ ### 1.1.8
44
+ **改进**:将数据获取方式从 npm 包 `axios` 切换为 Koishi 提供的 `http` 服务,并简化了相关代码(用户体验无差别)。
45
+ **改进**:为 `match_2` 模板添加了玩家小队标识(效果与 `match_1` 模板中的相同功能一致,但在显示上进行了微调)。
46
+
47
+ ### 1.1.7
48
+ **改进**:玩家信息模板中代表位置的图标替换为简约风格图标
49
+ **修复**:于v1.1.5新增的`7.36`指令生成英雄改动图片时会额外产生的测试用的`remainingContent.html`文件,现已不再生成。(如果之前使用了该命令并产生了此文件,可根据需要手动删除。位于`koishi/node_modules/@sjtdev/koishi-plugin-dota2tracker/`)
50
+
51
+ ### 1.1.6
52
+ 由于近期stratz网站问题,比赛数据无法自动解析,导致bot会一直等待解析后的战报数据而无法发送。
53
+ **新增**:现在调整为比赛结束1小时后仍然未解析时将直接发出缺失部分数据的战报(缺失包括BP顺序、出装时间、英雄受到伤害等)
54
+ #### hotfix
55
+ **修复**:修复引发播报未解析比赛战报失败的一个小问题
56
+
57
+ ### 1.1.5
58
+ **新增**:为新版本7.36添加新指令`7.36`
59
+ `7.36 <英雄ID|英雄名|英雄常用别名>`可查询对应英雄的改动信息,未输入英雄查询参数时直接返回官网7.36更新日志链接
60
+ 添加`--refresh|-r`参数可强制重新获取数据,如`7.36 -r`,也可在查询时使用,如`7.36 敌法师 -r`
61
+
62
+ ### 1.1.4
63
+ **改进**:完善查询玩家指定英雄的生成模板
64
+
65
+ ### 1.1.3
66
+ **新增**:新增实验性功能【日报昨日总结】,在指定时间播报昨日已订阅群组中已绑定群友的战绩(简略文字),默认关闭,可在插件配置中打开
67
+ `查询玩家`指令新增功能,现在额外输入参数`--hero <英雄ID|英雄名|英雄常用别名>`可查询目标玩家指定英雄的详情(--hero可替换为-o)
68
+ 例如:
69
+ * `查询玩家 123456789 --hero 敌法师`
70
+ * `查询玩家 -o 敌法师` (仍可缺省玩家参数以自查)
71
+
72
+ ### 1.1.2
73
+ **改进**:完成查询群友功能
74
+ **修复**:修复玩家模板中显示NaN的部分
75
+ #### hotfix
76
+ **修复**:修复查询远古玩家账号时可能意外失败的问题
77
+ **改进**:调整mvp中的控制分与[控]称号算法
78
+ #### hotfix.2
79
+ **修复**:修复初次使用查询英雄指令时,技能名初始化失败导致的错误
80
+
81
+ ### 1.1.2-beta
82
+ **改进**:为`查询群友`添加模板,还在调整布局中
83
+
84
+ ### 1.1.1
85
+ **改进**:玩家信息模板添加近25场内各个位置表现展示
86
+
87
+ ### 1.1.0
88
+ **改进**:使用ejs重写模板相关代码使其模块化,使新增模板更方便
89
+ **新增**:为比赛信息添加了仿MAX+模板,效果可见[match_2](./wiki/match_2),可在插件配置中切换
package/lib/index.js CHANGED
@@ -808,8 +808,8 @@ function getFormattedMatchData(match) {
808
808
  findMaxByProperty("towerDamage", "heroDamage").titles.push({ name: "拆", color: "#FEDCBA" });
809
809
  findMaxByProperty("heroHealing").titles.push({ name: "奶", color: "#00FF00" });
810
810
  match.players.reduce((lowest, player) => {
811
- const currentContribution = (player.kills + player.assists) / match[player.team].KillsCount;
812
- const lowestContribution = (lowest.kills + lowest.assists) / match[lowest.team].KillsCount;
811
+ const currentContribution = (player.kills + player.assists) / match[player.team].killsCount;
812
+ const lowestContribution = (lowest.kills + lowest.assists) / match[lowest.team].killsCount;
813
813
  if (currentContribution < lowestContribution) {
814
814
  return player;
815
815
  } else if (currentContribution === lowestContribution) {
@@ -1232,14 +1232,14 @@ async function apply(ctx, config) {
1232
1232
  if (session.guild) {
1233
1233
  let cancelingGuild = (await ctx.database.get("dt_subscribed_guilds", { guildId: session.event.channel.id, platform: session.event.platform }))[0];
1234
1234
  if (cancelingGuild) {
1235
- ctx.database.remove("dt_subscribed_guilds", session.event.channel.id);
1235
+ ctx.database.remove("dt_subscribed_guilds", { guildId: session.event.channel.id, platform: session.event.platform });
1236
1236
  session.send("取消订阅成功。");
1237
1237
  return;
1238
1238
  }
1239
1239
  } else
1240
1240
  session.send("本群尚未订阅,无需取消订阅。");
1241
1241
  });
1242
- ctx.command("绑定 <steam_id> [nick_name]", "绑定SteamID,并起一个别名(也可以不起)").usage("将你的SteamID与你的账号绑定,若本群已订阅将会实时获取你的新比赛数据发布至群中。").example("-绑定 123456789").example("-绑定 123456789 张三").action(async ({ session }, steam_id, nick_name) => {
1242
+ ctx.command("绑定 <steam_id> [nick_name]", "绑定SteamID,并起一个别名(也可以不起)").usage("将你的SteamID与你的账号绑定,若本群已订阅将会实时获取你的新比赛数据发布至群中。").example("绑定 123456789").example("绑定 123456789 张三").action(async ({ session }, steam_id, nick_name) => {
1243
1243
  if (session.guild) {
1244
1244
  if (!steam_id || !/^\d{1,11}$/.test(steam_id)) {
1245
1245
  session.send("SteamID无效。");
@@ -1286,7 +1286,7 @@ async function apply(ctx, config) {
1286
1286
  session.send("尚未绑定,无需取消绑定。");
1287
1287
  }
1288
1288
  });
1289
- ctx.command("改名 <nick_name>", "修改绑定时设定的别名").example("-改名 李四").action(async ({ session }, nick_name) => {
1289
+ ctx.command("改名 <nick_name>", "修改绑定时设定的别名").example("改名 李四").action(async ({ session }, nick_name) => {
1290
1290
  if (session.guild) {
1291
1291
  let sessionPlayer = (await ctx.database.get("dt_subscribed_players", { guildId: session.event.channel.id, platform: session.event.platform, userId: session.event.user.id }))[0];
1292
1292
  if (sessionPlayer) {
@@ -1363,7 +1363,7 @@ async function apply(ctx, config) {
1363
1363
  }
1364
1364
  }
1365
1365
  __name(queryAndDisplayMatch, "queryAndDisplayMatch");
1366
- ctx.command("查询比赛 <match_id>", "查询比赛ID").usage("查询指定比赛ID的比赛数据,生成图片发布。").example("-查询比赛 1234567890").action(async ({ session }, match_id) => {
1366
+ ctx.command("查询比赛 <match_id>", "查询比赛ID").usage("查询指定比赛ID的比赛数据,生成图片发布。").example("查询比赛 1234567890").action(async ({ session }, match_id) => {
1367
1367
  if (!match_id) {
1368
1368
  session.send("请输入比赛ID。");
1369
1369
  return;
@@ -1376,7 +1376,7 @@ async function apply(ctx, config) {
1376
1376
  session.send("正在搜索对局详情,请稍后...");
1377
1377
  queryAndDisplayMatch(session, match_id);
1378
1378
  });
1379
- ctx.command("查询最近比赛 [input_data]", "查询玩家的最近比赛").usage("查询指定玩家的最近一场比赛的比赛数据,生成图片发布。\n参数可输入该玩家的SteamID或已在本群绑定玩家的别名,无参数时尝试查询调用指令玩家的SteamID").example("-查询最近比赛 123456789").example("-查询最近比赛 张三").action(async ({ session }, input_data) => {
1379
+ ctx.command("查询最近比赛 [input_data]", "查询玩家的最近比赛").usage("查询指定玩家的最近一场比赛的比赛数据,生成图片发布。\n参数可输入该玩家的SteamID或已在本群绑定玩家的别名,无参数时尝试查询调用指令玩家的SteamID").example("查询最近比赛 123456789").example("查询最近比赛 张三").action(async ({ session }, input_data) => {
1380
1380
  if (session.guild) {
1381
1381
  let sessionPlayer;
1382
1382
  if (!input_data) {
@@ -1402,7 +1402,7 @@ async function apply(ctx, config) {
1402
1402
  queryAndDisplayMatch(session, lastMatchId);
1403
1403
  }
1404
1404
  });
1405
- ctx.command("查询玩家 <input_data>", "查询玩家信息,可指定英雄").usage("查询指定玩家的个人信息与最近战绩,生成图片发布。\n参数可输入该玩家的SteamID或已在本群绑定玩家的别名,无参数时尝试查询调用指令玩家的SteamID").option("hero", "-o <value:string> 查询玩家指定英雄使用情况(同其他英雄查询,可用简称与ID)").example("-查询玩家 123456789").example("-查询玩家 张三").example("-查询玩家 张三 hero 敌法师").action(async ({ session, options }, input_data) => {
1405
+ ctx.command("查询玩家 <input_data>", "查询玩家信息,可指定英雄").usage("查询指定玩家的个人信息与最近战绩,生成图片发布。\n参数可输入该玩家的SteamID或已在本群绑定玩家的别名,无参数时尝试查询调用指令玩家的SteamID").option("hero", "-o <value:string> 查询玩家指定英雄使用情况(同其他英雄查询,可用简称与ID)").example("查询玩家 123456789").example("查询玩家 张三").example("查询玩家 张三 hero 敌法师").action(async ({ session, options }, input_data) => {
1406
1406
  if (session.guild) {
1407
1407
  let sessionPlayer;
1408
1408
  if (!input_data) {
@@ -1469,7 +1469,7 @@ async function apply(ctx, config) {
1469
1469
  }
1470
1470
  }
1471
1471
  });
1472
- ctx.command("查询英雄 <input_data>", "查询英雄技能/面板信息").usage("查询英雄的技能说明与各项数据,生成图片发布。\n参数可输入英雄ID、英雄名、英雄常用别名").option("random", "-r 随机选择英雄").example("-查询英雄 15").example("-查询英雄 雷泽").example("-查询英雄 电魂").action(async ({ session, options }, input_data) => {
1472
+ ctx.command("查询英雄 <input_data>", "查询英雄技能/面板信息").usage("查询英雄的技能说明与各项数据,生成图片发布。\n参数可输入英雄ID、英雄名、英雄常用别名").option("random", "-r 随机选择英雄").example("查询英雄 15").example("查询英雄 雷泽").example("查询英雄 电魂").action(async ({ session, options }, input_data) => {
1473
1473
  if (options.random)
1474
1474
  input_data = random.pick(Object.keys(HEROES_CHINESE));
1475
1475
  if (input_data) {
@@ -1558,7 +1558,7 @@ async function apply(ctx, config) {
1558
1558
  session.send("请输入参数。");
1559
1559
  }
1560
1560
  });
1561
- ctx.command("查询英雄对战 <input_data:string>", "查询英雄近一周的最佳搭档与最佳克星英雄").usage("根据输入英雄查询最近一周比赛数据(传奇~万古分段)中与该英雄组合胜率最高英雄和与该英雄对抗胜率最低英雄。\n参数可输入英雄ID、英雄名、英雄常用别名").option("limit", "-l <value:number> 返回英雄个数(默认值 5)", { fallback: 5 }).option("filter", "-f <value:number> 过滤场数过低的组合(单位:%,默认值0.75)", { fallback: 0.5 }).example("-查询英雄对战 敌法师 (无额外参数默认返回5个英雄,过滤舍弃场次占比0.75%以下)").example("-查询英雄对战 敌法师 -l=10 -f=1 (返回10个英雄,过滤舍弃场次占比1%以下)").example("-查询英雄对战 敌法师 -l 10 -f 1 (等同于上例,参数接空格也可使用)").action(async ({ session, options }, input_data) => {
1561
+ ctx.command("查询英雄对战 <input_data:string>", "查询英雄近一周的最佳搭档与最佳克星英雄").usage("根据输入英雄查询最近一周比赛数据(传奇~万古分段)中与该英雄组合胜率最高英雄和与该英雄对抗胜率最低英雄。\n参数可输入英雄ID、英雄名、英雄常用别名").option("limit", "-l <value:number> 返回英雄个数(默认值 5)", { fallback: 5 }).option("filter", "-f <value:number> 过滤场数过低的组合(单位:%,默认值0.75)", { fallback: 0.5 }).example("查询英雄对战 敌法师 (无额外参数默认返回5个英雄,过滤舍弃场次占比0.75%以下)").example("查询英雄对战 敌法师 -l=10 -f=1 (返回10个英雄,过滤舍弃场次占比1%以下)").example("查询英雄对战 敌法师 -l 10 -f 1 (等同于上例,参数接空格也可使用)").action(async ({ session, options }, input_data) => {
1562
1562
  if (input_data) {
1563
1563
  let hero = findingHero(input_data);
1564
1564
  if (!hero) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sjtdev/koishi-plugin-dota2tracker",
3
3
  "description": "koishi插件-追踪群友的DOTA2对局",
4
- "version": "1.2.2",
4
+ "version": "1.2.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -47,4 +47,4 @@
47
47
  "zh"
48
48
  ]
49
49
  }
50
- }
50
+ }
@@ -242,7 +242,10 @@
242
242
  .player > .titles {
243
243
  grid-row: 4;
244
244
  grid-column: 1 / span 3;
245
- text-shadow: 1px 1px 0 #333; /* 设置阴影颜色及偏移 */
245
+ /* text-shadow: 1px 1px 0 #333; 设置阴影颜色及偏移 */
246
+ }
247
+ .player > .titles > span {
248
+ margin-right: 1.5px;
246
249
  }
247
250
 
248
251
  .player > .player_name {
@@ -398,6 +401,33 @@
398
401
  </head>
399
402
  <body>
400
403
  <% const match = data; %>
404
+ <% function darkenHexColor(hex, percentage) {
405
+ // 移除前缀 #
406
+ hex = hex.replace(/^#/, '');
407
+
408
+ // 处理三位 hex 颜色值
409
+ if (hex.length === 3) {
410
+ hex = hex.split('').map(char => char + char).join('');
411
+ }
412
+
413
+ // 将 hex 转换为 RGB
414
+ let r = parseInt(hex.substring(0, 2), 16);
415
+ let g = parseInt(hex.substring(2, 4), 16);
416
+ let b = parseInt(hex.substring(4, 6), 16);
417
+
418
+ // 将 RGB 变暗
419
+ r = Math.floor(r * (1 - percentage / 100));
420
+ g = Math.floor(g * (1 - percentage / 100));
421
+ b = Math.floor(b * (1 - percentage / 100));
422
+
423
+ // 将 RGB 转换回 hex
424
+ const darkenedHex = `#${((1 << 24) + (r << 16) + (g << 8) + b)
425
+ .toString(16)
426
+ .slice(1)
427
+ .toUpperCase()}`;
428
+
429
+ return darkenedHex;
430
+ } %>
401
431
  <nav>
402
432
  <div class="match_id">
403
433
  <p>比赛 <%-match.id%></p>
@@ -456,7 +486,7 @@
456
486
  <img src="${utils.getImageUrl('star_' + player.rank.star)}" class="stars" />
457
487
  <p>${player.steamAccount.seasonLeaderboardRank??""}</p>
458
488
  </div>
459
- <div class="titles">${player.titles.map((item) => `<span style="color: ${item.color};">${item.name}</span>`).join('&nbsp;')}</div>
489
+ <div class="titles">${player.titles.map((item) => `<span style="color: ${darkenHexColor(item.color, 25)};">${item.name}</span>`).join('')}</div>
460
490
  <div class="player_name row-1">
461
491
  <span class="rank">${`[${d2a.rank[player.rank.medal]}${player.rank.star||""}]`}</span>
462
492
  <span class="name">${player.steamAccount.name}</span>