@sjtdev/koishi-plugin-dota2tracker 1.2.20-pre.2 → 1.2.20-pre.3

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/index.js CHANGED
@@ -5,6 +5,9 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
8
11
  var __export = (target, all) => {
9
12
  for (var name2 in all)
10
13
  __defProp(target, name2, { get: all[name2], enumerable: true });
@@ -27,6 +30,20 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
30
  ));
28
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
32
 
33
+ // src/locales/zh-CN.yml
34
+ var require_zh_CN = __commonJS({
35
+ "src/locales/zh-CN.yml"(exports2, module2) {
36
+ module2.exports = { dota2tracker: { position: { "1": "优势路", "2": "中路", "3": "烈士路", "4": "采灵芝", "5": "工具人" }, heroes: { "0": '请严格遵循 "", "" 格式填写(如下方默认数据,注意是英文半角符号),如果格式有误将仅使用英雄默认名称。可以不包含英雄默认名称。', "1": '"敌法师", "敌法", "AM"', "2": '"斧王"', "3": '"祸乱之源", "祸乱", "水桶腰"', "4": '"血魔"', "5": '"水晶室女", "冰女", "CM"', "6": '"卓尔游侠", "小黑"', "7": '"撼地者", "小牛", "牛头"', "8": '"主宰", "剑圣", "jugg", "奶棒人"', "9": '"米拉娜", "白虎", "pom"', "10": '"变体精灵", "水人"', "11": '"影魔", "影魔王", "SF", "影儿魔儿"', "12": '"幻影长矛手", "PL"', "13": '"帕克"', "14": '"帕吉", "屠夫", "扒鸡", "啪唧"', "15": '"雷泽", "电魂", "电棍"', "16": '"沙王", "SK"', "17": '"风暴之灵", "蓝猫"', "18": '"斯温", "流浪剑客", "流浪"', "19": '"小小"', "20": '"复仇之魂", "复仇", "VS"', "21": '"风行者", "风行", "WR"', "22": '"宙斯"', "23": '"昆卡", "船长"', "25": '"莉娜", "火女"', "26": '"莱恩", "恶魔巫师", "Lion"', "27": '"暗影萨满", "小Y", "小歪"', "28": '"斯拉达", "大鱼", "大鱼人"', "29": '"潮汐猎人", "潮汐", "西瓜皮"', "30": '"巫医"', "31": '"巫妖"', "32": '"力丸", "隐形刺客", "隐刺"', "33": '"谜团"', "34": '"修补匠", "TK", "Tinker"', "35": '"狙击手", "矮人火枪手", "火枪", "传说哥"', "36": '"瘟疫法师", "死灵法", "NEC"', "37": '"术士", "Warlock"', "38": '"兽王"', "39": '"痛苦女王", "女王", "QOP"', "40": '"剧毒术士", "剧毒"', "41": '"虚空假面", "虚空", "JB脸"', "42": '"冥魂大帝", "骷髅王"', "43": '"死亡先知", "DP"', "44": '"幻影刺客", "幻刺", "PA"', "45": '"帕格纳", "骨法", "湮灭法师"', "46": '"圣堂刺客", "圣堂", "TA"', "47": '"冥界亚龙", "毒龙", "Viper"', "48": '"露娜", "月骑", "Luna"', "49": '"龙骑士", "龙骑"', "50": '"戴泽", "暗影牧师", "暗牧"', "51": '"发条技师", "发条"', "52": '"拉席克", "老鹿"', "53": '"先知"', "54": '"噬魂鬼", "小狗"', "55": '"黑暗贤者", "黑贤"', "56": '"克林克兹", "小骷髅"', "57": '"全能骑士", "全能"', "58": '"魅惑魔女", "小鹿"', "59": '"哈斯卡", "神灵", "神灵武士"', "60": '"暗夜魔王", "夜魔"', "61": '"育母蜘蛛", "蜘蛛"', "62": '"赏金猎人", "赏金"', "63": '"编织者", "蚂蚁"', "64": '"杰奇洛", "双头龙"', "65": '"蝙蝠骑士", "蝙蝠"', "66": '"陈", "老陈"', "67": '"幽鬼", "SPE", "UG"', "68": '"远古冰魄", "冰魂"', "69": '"末日使者", "末日", "Doom"', "70": '"熊战士", "拍拍", "拍拍熊"', "71": '"裂魂人", "白牛", "sb"', "72": '"矮人直升机", "飞机"', "73": '"炼金术士", "炼金"', "74": '"祈求者", "卡尔"', "75": '"沉默术士", "沉默"', "76": '"殁境神蚀者", "黑鸟"', "77": '"狼人"', "78": '"酒仙", "熊猫", "熊猫酒仙"', "79": '"暗影恶魔", "毒狗"', "80": '"德鲁伊", "熊德"', "81": '"混沌骑士", "混沌", "CK"', "82": '"米波"', "83": '"树精卫士", "大树", "树精"', "84": '"食人魔魔法师", "蓝胖"', "85": '"不朽尸王", "尸王"', "86": '"拉比克"', "87": '"干扰者", "萨尔"', "88": '"司夜刺客", "小强"', "89": '"娜迦海妖", "小娜迦"', "90": '"光之守卫", "光法"', "91": '"艾欧", "小精灵", "精灵", "IO"', "92": '"维萨吉", "死灵龙", "死灵飞龙"', "93": '"斯拉克", "小鱼", "小鱼人"', "94": '"美杜莎", "一姐", "美杜莎"', "95": '"巨魔战将", "巨魔", "巨馍蘸酱"', "96": '"半人马战行者", "人马", "半人马"', "97": '"马格纳斯", "猛犸"', "98": '"伐木机", "花母鸡"', "99": '"钢背兽", "钢背"', "100": '"巨牙海民", "海民"', "101": '"天怒法师", "天怒"', "102": '"亚巴顿"', "103": '"上古巨神", "大牛"', "104": '"军团指挥官", "军团"', "105": '"工程师", "炸弹", "炸弹人"', "106": '"灰烬之灵", "火猫"', "107": '"大地之灵", "土猫"', "108": '"孽主", "大屁股"', "109": '"恐怖利刃", "TB"', "110": '"凤凰", "烧鸡"', "111": '"神谕者", "神谕"', "112": '"寒冬飞龙", "冰龙"', "113": '"天穹守望者", "电狗"', "114": '"齐天大圣", "大圣"', "119": '"邪影芳灵", "小仙女", "花仙子"', "120": '"石鳞剑士", "滚滚"', "121": '"天涯墨客", "墨客"', "123": '"森海飞霞", "松鼠", "小松鼠", "小松许"', "126": '"虚无之灵", "紫猫"', "128": '"电炎绝手", "老奶奶"', "129": '"玛尔斯"', "131": '"百戏大王"', "135": '"破晓辰星", "大锤"', "136": '"玛西"', "137": '"獸", "畜"', "138": '"琼英碧灵", "奶绿", "绿奶奶"', "145": '"凯", "鸟人"' } } };
37
+ }
38
+ });
39
+
40
+ // src/locales/en-US.yml
41
+ var require_en_US = __commonJS({
42
+ "src/locales/en-US.yml"(exports2, module2) {
43
+ module2.exports = { dota2tracker: { position: { "1": "Safe Lane", "2": "Mid Lane", "3": "Off Lane", "4": "Soft Support", "5": "Hard Support" }, heroes: { "0": 'Please strictly follow the format of "", "" when filling out, if the format is incorrect, only the default name of the hero will be used. The default name of the hero may be omitted.', "1": '"Anti-Mage"', "2": '"Axe"', "3": '"Bane"', "4": '"Bloodseeker"', "5": '"Crystal Maiden"', "6": '"Drow Ranger"', "7": '"Earthshaker"', "8": '"Juggernaut"', "9": '"Mirana"', "10": '"Morphling"', "11": '"Shadow Fiend"', "12": '"Phantom Lancer"', "13": '"Puck"', "14": '"Pudge"', "15": '"Razor"', "16": '"Sand King"', "17": '"Storm Spirit"', "18": '"Sven"', "19": '"Tiny"', "20": '"Vengeful Spirit"', "21": '"Windranger"', "22": '"Zeus"', "23": '"Kunkka"', "25": '"Lina"', "26": '"Lion"', "27": '"Shadow Shaman"', "28": '"Slardar"', "29": '"Tidehunter"', "30": '"Witch Doctor"', "31": '"Lich"', "32": '"Riki"', "33": '"Enigma"', "34": '"Tinker"', "35": '"Sniper"', "36": '"Necrophos"', "37": '"Warlock"', "38": '"Beastmaster"', "39": '"Queen of Pain"', "40": '"Venomancer"', "41": '"Faceless Void"', "42": '"Wraith King"', "43": '"Death Prophet"', "44": '"Phantom Assassin"', "45": '"Pugna"', "46": '"Templar Assassin"', "47": '"Viper"', "48": '"Luna"', "49": '"Dragon Knight"', "50": '"Dazzle"', "51": '"Clockwerk"', "52": '"Leshrac"', "53": `"Nature's Prophet"`, "54": '"Lifestealer"', "55": '"Dark Seer"', "56": '"Clinkz"', "57": '"Omniknight"', "58": '"Enchantress"', "59": '"Huskar"', "60": '"Night Stalker"', "61": '"Broodmother"', "62": '"Bounty Hunter"', "63": '"Weaver"', "64": '"Jakiro"', "65": '"Batrider"', "66": '"Chen"', "67": '"Spectre"', "68": '"Ancient Apparition"', "69": '"Doom"', "70": '"Ursa"', "71": '"Spirit Breaker"', "72": '"Gyrocopter"', "73": '"Alchemist"', "74": '"Invoker"', "75": '"Silencer"', "76": '"Outworld Devourer"', "77": '"Lycan"', "78": '"Brewmaster"', "79": '"Shadow Demon"', "80": '"Lone Druid"', "81": '"Chaos Knight"', "82": '"Meepo"', "83": '"Treant Protector"', "84": '"Ogre Magi"', "85": '"Undying"', "86": '"Rubick"', "87": '"Disruptor"', "88": '"Nyx Assassin"', "89": '"Naga Siren"', "90": '"Keeper of the Light"', "91": '"Io"', "92": '"Visage"', "93": '"Slark"', "94": '"Medusa"', "95": '"Troll Warlord"', "96": '"Centaur Warrunner"', "97": '"Magnus"', "98": '"Timbersaw"', "99": '"Bristleback"', "100": '"Tusk"', "101": '"Skywrath Mage"', "102": '"Abaddon"', "103": '"Elder Titan"', "104": '"Legion Commander"', "105": '"Techies"', "106": '"Ember Spirit"', "107": '"Earth Spirit"', "108": '"Underlord"', "109": '"Terrorblade"', "110": '"Phoenix"', "111": '"Oracle"', "112": '"Winter Wyvern"', "113": '"Arc Warden"', "114": '"Monkey King"', "119": '"Dark Willow"', "120": '"Pangolier"', "121": '"Grimstroke"', "123": '"Hoodwink"', "126": '"Void Spirit"', "128": '"Snapfire"', "129": '"Mars"', "131": '"Ring Master"', "135": '"Dawnbreaker"', "136": '"Marci"', "137": '"Primal Beast"', "138": '"Muerta"', "145": '"Kez"' } } };
44
+ }
45
+ });
46
+
30
47
  // src/index.ts
31
48
  var src_exports = {};
32
49
  __export(src_exports, {
@@ -110,8 +127,13 @@ function loadGraphqlFile(queryName) {
110
127
  return import_fs.default.readFileSync(filepath, { encoding: "utf-8" }).replace(/[\r\n]+/g, " ");
111
128
  }
112
129
  __name(loadGraphqlFile, "loadGraphqlFile");
113
- async function queryHeroFromValve(heroId) {
114
- return (await http.get(`https://www.dota2.com/datafeed/herodata?language=schinese&hero_id=${heroId}`)).result.data.heroes[0];
130
+ async function queryHeroFromValve(heroId, languageTag = "zh-CN") {
131
+ let language;
132
+ ((language2) => {
133
+ language2["zh-CN"] = "schinese";
134
+ language2["en-US"] = "english";
135
+ })(language || (language = {}));
136
+ return (await http.get(`https://www.dota2.com/datafeed/herodata?language=${language[languageTag]}&hero_id=${heroId}`)).result.data.heroes[0];
115
137
  }
116
138
  __name(queryHeroFromValve, "queryHeroFromValve");
117
139
  var HeroDescType = /* @__PURE__ */ ((HeroDescType2) => {
@@ -525,10 +547,10 @@ var import_path2 = __toESM(require("path"));
525
547
  var import_moment = __toESM(require("moment"));
526
548
  var dotaconstants2 = __toESM(require("dotaconstants"));
527
549
 
528
- // src/dotaconstants_add.json
550
+ // src/data/dotaconstants_add.json
529
551
  var dotaconstants_add_exports = {};
530
552
  __export(dotaconstants_add_exports, {
531
- HEROES_CHINESE: () => HEROES_CHINESE,
553
+ HEROES_NAMES: () => HEROES_NAMES,
532
554
  LOSE_NEGATIVE: () => LOSE_NEGATIVE,
533
555
  LOSE_POSITIVE: () => LOSE_POSITIVE,
534
556
  WIN_NEGATIVE: () => WIN_NEGATIVE,
@@ -644,133 +666,263 @@ var behavior = {
644
666
  AOE: "范围生效"
645
667
  };
646
668
  var target_team = { Enemy: "敌方单位", Both: "单位", Friendly: "友方单位" };
647
- var HEROES_CHINESE = {
648
- "1": ["敌法师", "敌法", "AM"],
649
- "2": ["斧王"],
650
- "3": ["祸乱之源", "祸乱", "水桶腰"],
651
- "4": ["血魔"],
652
- "5": ["水晶室女", "冰女", "CM"],
653
- "6": ["卓尔游侠", "小黑"],
654
- "7": ["撼地者", "小牛", "牛头"],
655
- "8": ["主宰", "剑圣", "jugg", "奶棒人"],
656
- "9": ["米拉娜", "白虎", "pom"],
657
- "10": ["变体精灵", "水人"],
658
- "11": ["影魔", "影魔王", "SF", "影儿魔儿"],
659
- "12": ["幻影长矛手", "PL"],
660
- "13": ["帕克"],
661
- "14": ["帕吉", "屠夫", "扒鸡", "啪唧"],
662
- "15": ["雷泽", "电魂", "电棍"],
663
- "16": ["沙王", "SK"],
664
- "17": ["风暴之灵", "蓝猫"],
665
- "18": ["斯温", "流浪剑客", "流浪"],
666
- "19": ["小小"],
667
- "20": ["复仇之魂", "复仇", "VS"],
668
- "21": ["风行者", "风行", "WR"],
669
- "22": ["宙斯"],
670
- "23": ["昆卡", "船长"],
671
- "25": ["莉娜", "火女"],
672
- "26": ["莱恩", "恶魔巫师", "Lion"],
673
- "27": ["暗影萨满", "小Y", "小歪"],
674
- "28": ["斯拉达", "大鱼", "大鱼人"],
675
- "29": ["潮汐猎人", "潮汐", "西瓜皮"],
676
- "30": ["巫医"],
677
- "31": ["巫妖"],
678
- "32": ["力丸", "隐形刺客", "隐刺"],
679
- "33": ["谜团"],
680
- "34": ["修补匠", "TK", "Tinker"],
681
- "35": ["狙击手", "矮人火枪手", "火枪", "传说哥"],
682
- "36": ["瘟疫法师", "死灵法", "NEC"],
683
- "37": ["术士", "Warlock"],
684
- "38": ["兽王"],
685
- "39": ["痛苦女王", "女王", "QOP"],
686
- "40": ["剧毒术士", "剧毒"],
687
- "41": ["虚空假面", "虚空", "JB脸"],
688
- "42": ["冥魂大帝", "骷髅王"],
689
- "43": ["死亡先知", "DP"],
690
- "44": ["幻影刺客", "幻刺", "PA"],
691
- "45": ["帕格纳", "骨法", "湮灭法师"],
692
- "46": ["圣堂刺客", "圣堂", "TA"],
693
- "47": ["冥界亚龙", "毒龙", "Viper"],
694
- "48": ["露娜", "月骑", "Luna"],
695
- "49": ["龙骑士", "龙骑"],
696
- "50": ["戴泽", "暗影牧师", "暗牧"],
697
- "51": ["发条技师", "发条"],
698
- "52": ["拉席克", "老鹿"],
699
- "53": ["先知"],
700
- "54": ["噬魂鬼", "小狗"],
701
- "55": ["黑暗贤者", "黑贤"],
702
- "56": ["克林克兹", "小骷髅"],
703
- "57": ["全能骑士", "全能"],
704
- "58": ["魅惑魔女", "小鹿"],
705
- "59": ["哈斯卡", "神灵", "神灵武士"],
706
- "60": ["暗夜魔王", "夜魔"],
707
- "61": ["育母蜘蛛", "蜘蛛"],
708
- "62": ["赏金猎人", "赏金"],
709
- "63": ["编织者", "蚂蚁"],
710
- "64": ["杰奇洛", "双头龙"],
711
- "65": ["蝙蝠骑士", "蝙蝠"],
712
- "66": ["", "老陈"],
713
- "67": ["幽鬼", "SPE", "UG"],
714
- "68": ["远古冰魄", "冰魂"],
715
- "69": ["末日使者", "末日", "Doom"],
716
- "70": ["熊战士", "拍拍", "拍拍熊"],
717
- "71": ["裂魂人", "白牛", "sb"],
718
- "72": ["矮人直升机", "飞机"],
719
- "73": ["炼金术士", "炼金"],
720
- "74": ["祈求者", "卡尔"],
721
- "75": ["沉默术士", "沉默"],
722
- "76": ["殁境神蚀者", "黑鸟"],
723
- "77": ["狼人"],
724
- "78": ["酒仙", "熊猫", "熊猫酒仙"],
725
- "79": ["暗影恶魔", "毒狗"],
726
- "80": ["德鲁伊", "熊德"],
727
- "81": ["混沌骑士", "混沌", "CK"],
728
- "82": ["米波"],
729
- "83": ["树精卫士", "大树", "树精"],
730
- "84": ["食人魔魔法师", "蓝胖"],
731
- "85": ["不朽尸王", "尸王"],
732
- "86": ["拉比克"],
733
- "87": ["干扰者", "萨尔"],
734
- "88": ["司夜刺客", "小强"],
735
- "89": ["娜迦海妖", "小娜迦"],
736
- "90": ["光之守卫", "光法"],
737
- "91": ["艾欧", "小精灵", "精灵", "IO"],
738
- "92": ["维萨吉", "死灵龙", "死灵飞龙"],
739
- "93": ["斯拉克", "小鱼", "小鱼人"],
740
- "94": ["美杜莎", "一姐", "美杜莎"],
741
- "95": ["巨魔战将", "巨魔", "巨馍蘸酱"],
742
- "96": ["半人马战行者", "人马", "半人马"],
743
- "97": ["马格纳斯", "猛犸"],
744
- "98": ["伐木机", "花母鸡"],
745
- "99": ["钢背兽", "钢背"],
746
- "100": ["巨牙海民", "海民"],
747
- "101": ["天怒法师", "天怒"],
748
- "102": ["亚巴顿"],
749
- "103": ["上古巨神", "大牛"],
750
- "104": ["军团指挥官", "军团"],
751
- "105": ["工程师", "炸弹", "炸弹人"],
752
- "106": ["灰烬之灵", "火猫"],
753
- "107": ["大地之灵", "土猫"],
754
- "108": ["孽主", "大屁股"],
755
- "109": ["恐怖利刃", "TB"],
756
- "110": ["凤凰", "烧鸡"],
757
- "111": ["神谕者", "神谕"],
758
- "112": ["寒冬飞龙", "冰龙"],
759
- "113": ["天穹守望者", "电狗"],
760
- "114": ["齐天大圣", "大圣"],
761
- "119": ["邪影芳灵", "小仙女", "花仙子"],
762
- "120": ["石鳞剑士", "滚滚"],
763
- "121": ["天涯墨客", "墨客"],
764
- "123": ["森海飞霞", "松鼠", "小松鼠", "小松许"],
765
- "126": ["虚无之灵", "紫猫"],
766
- "128": ["电炎绝手", "老奶奶"],
767
- "129": ["玛尔斯"],
768
- "131": ["百戏大王"],
769
- "135": ["破晓辰星", "大锤"],
770
- "136": ["玛西"],
771
- "137": ["", "畜"],
772
- "138": ["琼英碧灵", "奶绿", "绿奶奶"],
773
- "145": [""]
669
+ var HEROES_NAMES = {
670
+ "zh-CN": {
671
+ "1": "敌法师",
672
+ "2": "斧王",
673
+ "3": "祸乱之源",
674
+ "4": "血魔",
675
+ "5": "水晶室女",
676
+ "6": "卓尔游侠",
677
+ "7": "撼地者",
678
+ "8": "主宰",
679
+ "9": "米拉娜",
680
+ "10": "变体精灵",
681
+ "11": "影魔",
682
+ "12": "幻影长矛手",
683
+ "13": "帕克",
684
+ "14": "帕吉",
685
+ "15": "雷泽",
686
+ "16": "沙王",
687
+ "17": "风暴之灵",
688
+ "18": "斯温",
689
+ "19": "小小",
690
+ "20": "复仇之魂",
691
+ "21": "风行者",
692
+ "22": "宙斯",
693
+ "23": "昆卡",
694
+ "25": "莉娜",
695
+ "26": "莱恩",
696
+ "27": "暗影萨满",
697
+ "28": "斯拉达",
698
+ "29": "潮汐猎人",
699
+ "30": "巫医",
700
+ "31": "巫妖",
701
+ "32": "力丸",
702
+ "33": "谜团",
703
+ "34": "修补匠",
704
+ "35": "狙击手",
705
+ "36": "瘟疫法师",
706
+ "37": "术士",
707
+ "38": "兽王",
708
+ "39": "痛苦女王",
709
+ "40": "剧毒术士",
710
+ "41": "虚空假面",
711
+ "42": "冥魂大帝",
712
+ "43": "死亡先知",
713
+ "44": "幻影刺客",
714
+ "45": "帕格纳",
715
+ "46": "圣堂刺客",
716
+ "47": "冥界亚龙",
717
+ "48": "露娜",
718
+ "49": "龙骑士",
719
+ "50": "戴泽",
720
+ "51": "发条技师",
721
+ "52": "拉席克",
722
+ "53": "先知",
723
+ "54": "噬魂鬼",
724
+ "55": "黑暗贤者",
725
+ "56": "克林克兹",
726
+ "57": "全能骑士",
727
+ "58": "魅惑魔女",
728
+ "59": "哈斯卡",
729
+ "60": "暗夜魔王",
730
+ "61": "育母蜘蛛",
731
+ "62": "赏金猎人",
732
+ "63": "编织者",
733
+ "64": "杰奇洛",
734
+ "65": "蝙蝠骑士",
735
+ "66": "",
736
+ "67": "幽鬼",
737
+ "68": "远古冰魄",
738
+ "69": "末日使者",
739
+ "70": "熊战士",
740
+ "71": "裂魂人",
741
+ "72": "矮人直升机",
742
+ "73": "炼金术士",
743
+ "74": "祈求者",
744
+ "75": "沉默术士",
745
+ "76": "殁境神蚀者",
746
+ "77": "狼人",
747
+ "78": "酒仙",
748
+ "79": "暗影恶魔",
749
+ "80": "德鲁伊",
750
+ "81": "混沌骑士",
751
+ "82": "米波",
752
+ "83": "树精卫士",
753
+ "84": "食人魔魔法师",
754
+ "85": "不朽尸王",
755
+ "86": "拉比克",
756
+ "87": "干扰者",
757
+ "88": "司夜刺客",
758
+ "89": "娜迦海妖",
759
+ "90": "光之守卫",
760
+ "91": "艾欧",
761
+ "92": "维萨吉",
762
+ "93": "斯拉克",
763
+ "94": "美杜莎",
764
+ "95": "巨魔战将",
765
+ "96": "半人马战行者",
766
+ "97": "马格纳斯",
767
+ "98": "伐木机",
768
+ "99": "钢背兽",
769
+ "100": "巨牙海民",
770
+ "101": "天怒法师",
771
+ "102": "亚巴顿",
772
+ "103": "上古巨神",
773
+ "104": "军团指挥官",
774
+ "105": "工程师",
775
+ "106": "灰烬之灵",
776
+ "107": "大地之灵",
777
+ "108": "孽主",
778
+ "109": "恐怖利刃",
779
+ "110": "凤凰",
780
+ "111": "神谕者",
781
+ "112": "寒冬飞龙",
782
+ "113": "天穹守望者",
783
+ "114": "齐天大圣",
784
+ "119": "邪影芳灵",
785
+ "120": "石鳞剑士",
786
+ "121": "天涯墨客",
787
+ "123": "森海飞霞",
788
+ "126": "虚无之灵",
789
+ "128": "电炎绝手",
790
+ "129": "玛尔斯",
791
+ "131": "百戏大王",
792
+ "135": "破晓辰星",
793
+ "136": "玛西",
794
+ "137": "",
795
+ "138": "琼英碧灵",
796
+ "145": "凯"
797
+ },
798
+ "en-US": {
799
+ "1": "Anti-Mage",
800
+ "2": "Axe",
801
+ "3": "Bane",
802
+ "4": "Bloodseeker",
803
+ "5": "Crystal Maiden",
804
+ "6": "Drow Ranger",
805
+ "7": "Earthshaker",
806
+ "8": "Juggernaut",
807
+ "9": "Mirana",
808
+ "10": "Morphling",
809
+ "11": "Shadow Fiend",
810
+ "12": "Phantom Lancer",
811
+ "13": "Puck",
812
+ "14": "Pudge",
813
+ "15": "Razor",
814
+ "16": "Sand King",
815
+ "17": "Storm Spirit",
816
+ "18": "Sven",
817
+ "19": "Tiny",
818
+ "20": "Vengeful Spirit",
819
+ "21": "Windranger",
820
+ "22": "Zeus",
821
+ "23": "Kunkka",
822
+ "25": "Lina",
823
+ "26": "Lion",
824
+ "27": "Shadow Shaman",
825
+ "28": "Slardar",
826
+ "29": "Tidehunter",
827
+ "30": "Witch Doctor",
828
+ "31": "Lich",
829
+ "32": "Riki",
830
+ "33": "Enigma",
831
+ "34": "Tinker",
832
+ "35": "Sniper",
833
+ "36": "Necrophos",
834
+ "37": "Warlock",
835
+ "38": "Beastmaster",
836
+ "39": "Queen of Pain",
837
+ "40": "Venomancer",
838
+ "41": "Faceless Void",
839
+ "42": "Wraith King",
840
+ "43": "Death Prophet",
841
+ "44": "Phantom Assassin",
842
+ "45": "Pugna",
843
+ "46": "Templar Assassin",
844
+ "47": "Viper",
845
+ "48": "Luna",
846
+ "49": "Dragon Knight",
847
+ "50": "Dazzle",
848
+ "51": "Clockwerk",
849
+ "52": "Leshrac",
850
+ "53": "Nature's Prophet",
851
+ "54": "Lifestealer",
852
+ "55": "Dark Seer",
853
+ "56": "Clinkz",
854
+ "57": "Omniknight",
855
+ "58": "Enchantress",
856
+ "59": "Huskar",
857
+ "60": "Night Stalker",
858
+ "61": "Broodmother",
859
+ "62": "Bounty Hunter",
860
+ "63": "Weaver",
861
+ "64": "Jakiro",
862
+ "65": "Batrider",
863
+ "66": "Chen",
864
+ "67": "Spectre",
865
+ "68": "Ancient Apparition",
866
+ "69": "Doom",
867
+ "70": "Ursa",
868
+ "71": "Spirit Breaker",
869
+ "72": "Gyrocopter",
870
+ "73": "Alchemist",
871
+ "74": "Invoker",
872
+ "75": "Silencer",
873
+ "76": "Outworld Devourer",
874
+ "77": "Lycan",
875
+ "78": "Brewmaster",
876
+ "79": "Shadow Demon",
877
+ "80": "Lone Druid",
878
+ "81": "Chaos Knight",
879
+ "82": "Meepo",
880
+ "83": "Treant Protector",
881
+ "84": "Ogre Magi",
882
+ "85": "Undying",
883
+ "86": "Rubick",
884
+ "87": "Disruptor",
885
+ "88": "Nyx Assassin",
886
+ "89": "Naga Siren",
887
+ "90": "Keeper of the Light",
888
+ "91": "Io",
889
+ "92": "Visage",
890
+ "93": "Slark",
891
+ "94": "Medusa",
892
+ "95": "Troll Warlord",
893
+ "96": "Centaur Warrunner",
894
+ "97": "Magnus",
895
+ "98": "Timbersaw",
896
+ "99": "Bristleback",
897
+ "100": "Tusk",
898
+ "101": "Skywrath Mage",
899
+ "102": "Abaddon",
900
+ "103": "Elder Titan",
901
+ "104": "Legion Commander",
902
+ "105": "Techies",
903
+ "106": "Ember Spirit",
904
+ "107": "Earth Spirit",
905
+ "108": "Underlord",
906
+ "109": "Terrorblade",
907
+ "110": "Phoenix",
908
+ "111": "Oracle",
909
+ "112": "Winter Wyvern",
910
+ "113": "Arc Warden",
911
+ "114": "Monkey King",
912
+ "119": "Dark Willow",
913
+ "120": "Pangolier",
914
+ "121": "Grimstroke",
915
+ "123": "Hoodwink",
916
+ "126": "Void Spirit",
917
+ "128": "Snapfire",
918
+ "129": "Mars",
919
+ "131": "Ring Master",
920
+ "135": "Dawnbreaker",
921
+ "136": "Marci",
922
+ "137": "Primal Beast",
923
+ "138": "Muerta",
924
+ "145": "Kez"
925
+ }
774
926
  };
775
927
  var WIN_NEGATIVE = ["侥幸赢得了比赛", "走狗屎运赢得了比赛", "躺赢了比赛", "打团都没来, 队友4V5赢得了比赛"];
776
928
  var WIN_POSITIVE = ["带领团队走向了胜利", "暴打对面后赢得了胜利", " CARRY全场赢得了胜利", "把对面当猪宰了, 赢得了胜利", "又赢了, 这游戏就是这么枯燥, 且乏味", "直接进行一个比赛的赢"];
@@ -786,7 +938,7 @@ var dotaconstants_add_default = {
786
938
  primary_attrs,
787
939
  behavior,
788
940
  target_team,
789
- HEROES_CHINESE,
941
+ HEROES_NAMES,
790
942
  WIN_NEGATIVE,
791
943
  WIN_POSITIVE,
792
944
  LOSE_NEGATIVE,
@@ -799,6 +951,7 @@ var ejs = __toESM(require("ejs"));
799
951
  var name = "dota2tracker";
800
952
  var usage = `
801
953
  DOTA2Bot插件-提供自动追踪群友的最新对局的功能(需群友绑定),以及一系列查询功能。
954
+ [本地化/dota2tracker](../../locales/dota2tracker)可以自定义英雄别名和位置代称
802
955
  **更多信息请进入[插件主页](https://github.com/sjtdev/koishi-plugin-dota2tracker)与[更新日志](https://github.com/sjtdev/koishi-plugin-dota2tracker/blob/master/changelog.md)查看。**`;
803
956
  var inject = ["http", "database", "cron", "puppeteer"];
804
957
  var Config = import_koishi.Schema.intersect([
@@ -862,6 +1015,14 @@ var random = new import_koishi2.Random(() => Math.random());
862
1015
  async function apply(ctx, config) {
863
1016
  CONFIGS.STRATZ_API.TOKEN = config.STRATZ_API_TOKEN;
864
1017
  init(ctx.http, ctx.setTimeout);
1018
+ ctx.i18n.define("zh-CN", require_zh_CN());
1019
+ ctx.i18n.define("en-US", require_en_US());
1020
+ const koishiLanguageTag = ctx.i18n.fallback(void 0).at(2);
1021
+ const getLanguageTag = /* @__PURE__ */ __name(async function(session, channel) {
1022
+ if (!session && !channel) return koishiLanguageTag;
1023
+ const resolvedChannel = channel ?? await session?.getChannel(session.event.channel.id);
1024
+ return resolvedChannel?.locales?.at(0) ?? koishiLanguageTag;
1025
+ }, "getLanguageTag");
865
1026
  ctx.command("订阅本群", "订阅后还需玩家在本群绑定SteamID").usage("订阅后还需玩家在本群绑定SteamID,BOT将订阅本群中已绑定玩家的新比赛数据,在STRATZ比赛解析完成后将比赛数据生成为图片战报发布至本群中。").action(async ({ session }) => {
866
1027
  if (session.guild) {
867
1028
  let currentGuild = (await ctx.database.get("dt_subscribed_guilds", { guildId: session.event.channel.id, platform: session.event.platform }))[0];
@@ -964,7 +1125,7 @@ async function apply(ctx, config) {
964
1125
  }
965
1126
  async function getUsers(subscribedPlayers2, memberList2) {
966
1127
  const playerSteamIds = { steamAccountIds: subscribedPlayers2.map((player) => player.steamId) };
967
- const queryResult = await query("PlayersInfoWith10MatchesForGuild", { steamAccountIds: playerSteamIds });
1128
+ const queryResult = await query("PlayersInfoWith10MatchesForGuild", playerSteamIds);
968
1129
  const playersInfo = queryResult.players;
969
1130
  const users2 = [];
970
1131
  for (const subscribedPlayer of subscribedPlayers2) {
@@ -1065,16 +1226,16 @@ async function apply(ctx, config) {
1065
1226
  return;
1066
1227
  }
1067
1228
  session.send("正在获取玩家数据,请稍后...");
1068
- let hero = findingHero(options.hero);
1229
+ let heroId = findingHero(options.hero);
1069
1230
  let steamId = flagBindedPlayer?.steamId ?? input_data;
1070
1231
  let player;
1071
1232
  try {
1072
- player = (await query("PlayerInfoWith25Matches", { steamAccountId: steamId, heroIds: hero?.id })).player;
1233
+ player = (await query("PlayerInfoWith25Matches", { steamAccountId: steamId, heroIds: heroId })).player;
1073
1234
  let playerExtra = (await query("PlayerExtraInfo", {
1074
1235
  steamAccountId: steamId,
1075
1236
  matchCount: player.matchCount,
1076
1237
  totalHeroCount: Object.keys(dotaconstants2.heroes).length,
1077
- heroIds: hero?.id
1238
+ heroIds: heroId
1078
1239
  })).player;
1079
1240
  let filteredDotaPlus = {};
1080
1241
  playerExtra.dotaPlus.forEach((item) => {
@@ -1085,11 +1246,11 @@ async function apply(ctx, config) {
1085
1246
  };
1086
1247
  }
1087
1248
  });
1088
- playerExtra.heroesPerformance.forEach((hero2) => {
1089
- if (filteredDotaPlus[hero2.hero.id]) {
1090
- filteredDotaPlus[hero2.hero.id].shortName = hero2.hero.shortName;
1091
- filteredDotaPlus[hero2.hero.id].winCount = hero2.winCount;
1092
- filteredDotaPlus[hero2.hero.id].matchCount = hero2.matchCount;
1249
+ playerExtra.heroesPerformance.forEach((hero) => {
1250
+ if (filteredDotaPlus[hero.hero.id]) {
1251
+ filteredDotaPlus[hero.hero.id].shortName = hero.hero.shortName;
1252
+ filteredDotaPlus[hero.hero.id].winCount = hero.winCount;
1253
+ filteredDotaPlus[hero.hero.id].matchCount = hero.matchCount;
1093
1254
  }
1094
1255
  });
1095
1256
  player.rank = {
@@ -1106,14 +1267,14 @@ async function apply(ctx, config) {
1106
1267
  return a.heroId - b.heroId;
1107
1268
  });
1108
1269
  player.heroesPerformanceTop10 = playerExtra.heroesPerformance.slice(0, 10);
1109
- if (hero) {
1270
+ if (heroId) {
1110
1271
  const { matchCount, winCount, imp } = player.heroesPerformanceTop10[0];
1111
1272
  player.matchCount = matchCount;
1112
1273
  player.winCount = winCount;
1113
1274
  player.performance.imp = imp;
1114
- player.dotaPlus = player.dotaPlus.filter((dpHero) => dpHero.heroId == hero.id);
1275
+ player.dotaPlus = player.dotaPlus.filter((dpHero) => dpHero.heroId == heroId);
1115
1276
  }
1116
- player.genHero = hero;
1277
+ player.genHero = { name: HEROES_NAMES[(await session.getChannel(session.event.channel.id)).locales?.at(0) ?? "zh-CN"][heroId] };
1117
1278
  session.send(
1118
1279
  (ctx.config.urlInMessageType.some((type) => type == "player") ? "https://stratz.com/players/" + player.steamAccount.id : "") + await ctx.puppeteer.render(genImageHTML(player, config.template_player, "player" /* Player */))
1119
1280
  );
@@ -1126,17 +1287,17 @@ async function apply(ctx, config) {
1126
1287
  }
1127
1288
  });
1128
1289
  ctx.command("查询英雄 <input_data>", "查询英雄技能/面板信息").usage("查询英雄的技能说明与各项数据,生成图片发布。\n参数可输入英雄ID、英雄名、英雄常用别名").option("random", "-r 随机选择英雄").example("查询英雄 15").example("查询英雄 雷泽").example("查询英雄 电魂").action(async ({ session, options }, input_data) => {
1129
- if (options.random) input_data = random.pick(Object.keys(HEROES_CHINESE));
1290
+ const languageTag = await getLanguageTag(session);
1291
+ if (options.random) input_data = random.pick(Object.keys(HEROES_NAMES[languageTag]));
1130
1292
  if (input_data) {
1131
- let hero = findingHero(input_data);
1132
- if (!hero) {
1293
+ let heroId = findingHero(input_data);
1294
+ if (!heroId) {
1133
1295
  session.send("未找到输入的英雄,请确认后重新输入。");
1134
1296
  return;
1135
1297
  }
1136
1298
  await session.send("正在获取英雄数据,请稍后...");
1137
1299
  try {
1138
- const queryHero = await queryHeroFromValve(hero.id);
1139
- Object.assign(hero, queryHero);
1300
+ let hero = await queryHeroFromValve(heroId, languageTag);
1140
1301
  hero.facet_abilities.forEach((fa, i) => {
1141
1302
  if (fa.abilities.length) {
1142
1303
  fa.abilities.forEach((ab) => {
@@ -1217,13 +1378,14 @@ async function apply(ctx, config) {
1217
1378
  });
1218
1379
  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) => {
1219
1380
  if (input_data) {
1220
- let hero = findingHero(input_data);
1221
- if (!hero) {
1381
+ const languageTag = await getLanguageTag(session);
1382
+ let heroId = findingHero(input_data);
1383
+ if (!heroId) {
1222
1384
  session.send("未找到输入的英雄,请确认后重新输入。");
1223
1385
  return;
1224
1386
  }
1225
1387
  try {
1226
- let heroStats = (await query("HeroMatchupWinrate", { heroId: hero.id, take: Object.keys(dotaconstants2.heroes).length - 1 })).heroStats;
1388
+ let heroStats = (await query("HeroMatchupWinrate", { heroId, take: Object.keys(dotaconstants2.heroes).length - 1 })).heroStats;
1227
1389
  let withTopFive = heroStats.matchUp[0].with.filter((item) => item.matchCount / heroStats.matchUp[0].matchCountWith > Math.max(0, Math.min(5, options.filter)) / 100).map((item) => {
1228
1390
  const winRate = item.winCount / item.matchCount;
1229
1391
  return { ...item, winRate: winRate.toFixed(3) };
@@ -1233,10 +1395,10 @@ async function apply(ctx, config) {
1233
1395
  return { ...item, winRate: winRate.toFixed(3) };
1234
1396
  }).sort((a, b) => a.winRate - b.winRate).slice(0, Math.max(1, Math.min(Object.keys(dotaconstants2.heroes).length - 1, options.limit)));
1235
1397
  session.send(
1236
- `你查询的英雄是${HEROES_CHINESE[heroStats.matchUp[0].heroId][0]}(ID:${heroStats.matchUp[0].heroId}),
1398
+ `你查询的英雄是${HEROES_NAMES[heroStats.matchUp[0].heroId][0]}(ID:${heroStats.matchUp[0].heroId}),
1237
1399
  以下是7天内传奇-万古分段比赛数据总结而来的搭档与克制关系
1238
- 最佳搭档(组合胜率前${options.limit}):${withTopFive.map((item) => `${HEROES_CHINESE[item.heroId2][0]}(胜率${(item.winRate * 100).toFixed(1)}%)`).join("、")}
1239
- 最佳克星(对抗胜率倒${options.limit}):${vsBottomFive.map((item) => `${HEROES_CHINESE[item.heroId2][0]}(胜率${(item.winRate * 100).toFixed(1)}%)`).join("、")}`
1400
+ 最佳搭档(组合胜率前${options.limit}):${withTopFive.map((item) => `${HEROES_NAMES[languageTag][item.heroId2][0]}(胜率${(item.winRate * 100).toFixed(1)}%)`).join("、")}
1401
+ 最佳克星(对抗胜率倒${options.limit}):${vsBottomFive.map((item) => `${HEROES_NAMES[languageTag][item.heroId2][0]}(胜率${(item.winRate * 100).toFixed(1)}%)`).join("、")}`
1240
1402
  );
1241
1403
  } catch (error) {
1242
1404
  ctx.logger.error(error);
@@ -1246,28 +1408,48 @@ async function apply(ctx, config) {
1246
1408
  }
1247
1409
  });
1248
1410
  function findingHero(input) {
1249
- if (!input) return;
1250
- let dc_heroes = Object.values(dotaconstants2.heroes).map((hero) => ({
1251
- id: hero["id"],
1252
- name: hero["name"],
1253
- shortName: hero["name"].match(/^npc_dota_hero_(.+)$/)[1]
1254
- }));
1255
- let cn_heroes = Object.keys(HEROES_CHINESE).map((key) => ({
1256
- id: parseInt(key),
1257
- names_cn: HEROES_CHINESE[key]
1258
- }));
1259
- const mergedMap = /* @__PURE__ */ new Map();
1260
- [dc_heroes, cn_heroes].forEach((array) => {
1261
- array.forEach((item) => {
1262
- const existingItem = mergedMap.get(item.id);
1263
- if (existingItem) mergedMap.set(item.id, { ...existingItem, ...item });
1264
- else mergedMap.set(item.id, item);
1265
- });
1266
- });
1267
- let heroes2 = Array.from(mergedMap.values());
1268
- return heroes2.find((hero) => hero.names_cn.some((cn) => cn.toLowerCase() == input.toLowerCase()) || hero.shortName === input.toLowerCase() || hero.id == input);
1411
+ const heroIds = Object.keys(dotaconstants2.heroes).map((id) => parseInt(id));
1412
+ let tid;
1413
+ for (const loc of Object.keys(HEROES_NAMES)) {
1414
+ for (const id_nicknames of getHeroNicknames(heroIds, loc)) {
1415
+ for (const [id, nicknames] of Object.entries(id_nicknames)) {
1416
+ try {
1417
+ for (const nickname of nicknames) {
1418
+ if (input == nickname) return Number(id);
1419
+ }
1420
+ } catch {
1421
+ continue;
1422
+ }
1423
+ }
1424
+ }
1425
+ }
1426
+ for (const names of Object.values(HEROES_NAMES)) {
1427
+ for (const [id, name2] of Object.entries(names)) {
1428
+ if (input == name2) return Number(id);
1429
+ if (input == id) tid = input;
1430
+ }
1431
+ }
1432
+ return tid;
1269
1433
  }
1270
1434
  __name(findingHero, "findingHero");
1435
+ function getHeroNicknames(heroIds, languageTag = koishiLanguageTag) {
1436
+ if (heroIds === void 0) return [];
1437
+ const heroIdArray = Array.isArray(heroIds) ? heroIds : [heroIds];
1438
+ const result = [];
1439
+ for (const heroId of heroIdArray) {
1440
+ let content = [];
1441
+ try {
1442
+ const rawContent = ctx.i18n.render([languageTag], [`dota2tracker.heroes.${heroId}`], {}).at(0)?.attrs?.content ?? "";
1443
+ content = JSON.parse(`[${rawContent}]`);
1444
+ } catch (error) {
1445
+ ctx.logger.error(`Failed to parse heroId ${heroId} content: ${error.message}`);
1446
+ content = [];
1447
+ }
1448
+ result.push({ [heroId]: content });
1449
+ }
1450
+ return Array.isArray(heroIds) ? result : result[0][heroIds];
1451
+ }
1452
+ __name(getHeroNicknames, "getHeroNicknames");
1271
1453
  ctx.on("ready", async () => {
1272
1454
  ctx.model.extend("dt_subscribed_guilds", { id: "unsigned", guildId: "string", platform: "string" }, { autoInc: true });
1273
1455
  ctx.model.extend("dt_subscribed_players", { id: "unsigned", userId: "string", guildId: "string", platform: "string", steamId: "integer", nickName: "string", rank: "json" }, { autoInc: true });
@@ -1312,7 +1494,9 @@ async function apply(ctx, config) {
1312
1494
  });
1313
1495
  });
1314
1496
  pendingMatches.push({ matchId: match.id, guilds: tempGuilds });
1315
- query("RequestMatchDataAnalysis", { matchId: match.id });
1497
+ query("RequestMatchDataAnalysis", { matchId: match.id }).then(
1498
+ (response) => ctx.logger.info(response.stratz.matchRetry ? "解析请求已成功发送至服务器。" : "解析请求发送失败。")
1499
+ );
1316
1500
  ctx.logger.info(
1317
1501
  tempGuilds.map((guild) => `追踪到来自群组${guild.platform}:${guild.guildId}的用户${guild.players.map((player) => `[${player.nickName ?? ""}(${player.steamId})]`).join("、")}的尚未播报过的最新比赛 ${match.id}。`).join("")
1318
1502
  );
@@ -1372,6 +1556,7 @@ async function apply(ctx, config) {
1372
1556
  const now = (0, import_moment.default)();
1373
1557
  const pendingMatch = pendingMatches[(now.hours() * 60 + now.minutes()) % pendingMatches.length];
1374
1558
  try {
1559
+ const languageTag = await getLanguageTag();
1375
1560
  let matchQuery;
1376
1561
  let queryLocal = await ctx.database.get("dt_previous_query_results", pendingMatch.matchId, ["data"]);
1377
1562
  if (queryLocal.length > 0) {
@@ -1390,7 +1575,7 @@ async function apply(ctx, config) {
1390
1575
  let broadPlayers = match.players.filter((item) => idsToFind.includes(item.steamAccountId));
1391
1576
  for (let player of broadPlayers) {
1392
1577
  const random2 = new import_koishi2.Random(() => enhancedSimpleHashToSeed(`${match.id}-${player.steamAccountId}-${player.playerSlot}`));
1393
- let broadPlayerMessage = `${player.steamAccount.name}的${random2.pick(HEROES_CHINESE[player.hero.id])}`;
1578
+ let broadPlayerMessage = `${player.steamAccount.name}的${random2.pick(getHeroNicknames(player.hero.id, languageTag))}`;
1394
1579
  if (player.isRadiant == match.didRadiantWin) {
1395
1580
  if (player.deathContribution < 0.2 || player.killContribution > 0.75 || player.heroDamage / player.networth > 1.5 || player.towerDamage > 1e4 || player.imp > 0)
1396
1581
  broadPlayerMessage += random2.pick(WIN_POSITIVE);
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.20-pre.2",
4
+ "version": "1.2.20-pre.3",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -46,7 +46,8 @@
46
46
  "cron"
47
47
  ],
48
48
  "locales": [
49
- "zh"
49
+ "zh-CN",
50
+ "en-US"
50
51
  ]
51
52
  }
52
53
  }
@@ -570,7 +570,7 @@
570
570
  <div class="wrapper">
571
571
  <%- `
572
572
  <div class="hero" id="${hero.id}">
573
- <img src="${utils.getImageUrl(hero.shortName, ImageType.Heroes)}"/>
573
+ <img src="${utils.getImageUrl(hero["name"].match(/^npc_dota_hero_(.+)$/)[1], ImageType.Heroes)}"/>
574
574
  <img class="pri_attr" src="${utils.getImageUrl(d2a.primary_attrs[hero.primary_attr], ImageType.Icons)}"/>
575
575
  <div class="info">
576
576
  <p class="name">${hero.name_loc}</p>
@@ -409,7 +409,7 @@
409
409
  <%- `
410
410
  <div class="avatar"><img src="${player.steamAccount?.avatar}" alt="" /></div>
411
411
  <div class="info">
412
- <p class="name">${escapeHTML(player.steamAccount.name)}${player.guildMember ? ` <span class="guild ${guildLevel(player.guildMember.guild.currentPercentile)}">[${escapeHTML(player.guildMember.guild.tag)}]</span>${player.genHero?` >${player.genHero.names_cn[0]}<`:""}</p>` : ""}
412
+ <p class="name">${escapeHTML(player.steamAccount.name)}${player.guildMember ? ` <span class="guild ${guildLevel(player.guildMember.guild.currentPercentile)}">[${escapeHTML(player.guildMember.guild.tag)}]</span>${player.genHero?` >${player.genHero.name}<`:""}</p>` : ""}
413
413
  <p class="matches"><span>场次:${player.matchCount}(<span class="win">${player.winCount}</span>/<span class="lose">${player.matchCount - player.winCount}</span>)</span>胜率:<span style="color:${utils.winRateColor(player.winCount / player.matchCount)};">${((player.winCount / player.matchCount) * 100).toFixed(2)}%</span></p>
414
414
  <p class="matches"><span>最近25场:<span class="win">${nearWinCount}</span>/<span class="lose">${nearMatchCount - nearWinCount}</span></span><span>胜率:<span style="color:${utils.winRateColor(nearWinCount / nearMatchCount)};">${(
415
415
  (nearWinCount / nearMatchCount) * 100).toFixed(2)}%</span></span><span>评分:${(player.performance.imp > 0 ? "+" : "") + player.performance.imp}</span></span></p>