koishi-plugin-warframe 0.0.3 → 0.0.5
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/README.md +18 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.js +179 -51
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,4 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/koishi-plugin-warframe)
|
|
4
4
|
|
|
5
|
-
Toolkit for warframe.
|
|
5
|
+
Toolkit for warframe. **(In development)**
|
|
6
|
+
|
|
7
|
+
## Commands
|
|
8
|
+
|
|
9
|
+
| Command Name | Default Alias | Description |
|
|
10
|
+
| ------------------------ | ---------------------- | ------------------------------------------------------------------------------------------- |
|
|
11
|
+
| wmi | | Warframe market orders. |
|
|
12
|
+
| wmr | | Warframe market orders. |
|
|
13
|
+
| arbitration [day:number] | arbi, 仲裁, 仲裁表 | High-value arbitration schedule. The arg decide how long in days to display, defaults to 3. |
|
|
14
|
+
| fissure | 裂缝, 裂隙 | Current fissures. |
|
|
15
|
+
| spfissure | 钢铁裂缝, 钢铁裂隙 | Current steelpath fissures. |
|
|
16
|
+
| rjfissure | 九重天裂缝, 九重天裂隙 | Current railjack fissures. |
|
|
17
|
+
| circuit | 灵化, 灵化之源 | Weekly rewards of circuit, both warframe parts and incarnons. |
|
|
18
|
+
| about | 关于 | About information. |
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
Search `koishi-plugin-warframe` in koishi dependency manager, not in plugin market.
|
package/lib/index.d.ts
CHANGED
|
@@ -49,8 +49,9 @@ export const getHtmlImageBase64: (puppe: Puppeteer, html: string, type?: "png" |
|
|
|
49
49
|
export const OutputImage: (imgBase64: string) => Element;
|
|
50
50
|
export const ItemOrderOutput: (item: ItemShort, orders: OrderWithUser[]) => Element;
|
|
51
51
|
export const RivenOrderOutput: (item: RivenItem, orders: RivenOrder[]) => Element;
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
export var globalRivenAttributeDict: {
|
|
53
|
+
[key: string]: RivenAttribute;
|
|
54
|
+
};
|
|
54
55
|
export const wmOnReady: () => Promise<void>;
|
|
55
56
|
export const getItemOrders: (itemName: string) => Promise<{
|
|
56
57
|
item: ItemShort;
|
package/lib/index.js
CHANGED
|
@@ -79,6 +79,18 @@ var fullWidthToHalfWidth = /* @__PURE__ */ __name((str) => {
|
|
|
79
79
|
return String.fromCharCode(char.charCodeAt(0) - 65248);
|
|
80
80
|
}).replace(/\u3000/g, " ");
|
|
81
81
|
}, "fullWidthToHalfWidth");
|
|
82
|
+
var transformListIntoDict = /* @__PURE__ */ __name((dict, predict) => {
|
|
83
|
+
const result = {};
|
|
84
|
+
for (const obj of dict) {
|
|
85
|
+
const keys = predict(obj);
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
if (typeof key === "string" && key.length > 0) {
|
|
88
|
+
result[key] = obj;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}, "transformListIntoDict");
|
|
82
94
|
var dictToKeyDict = /* @__PURE__ */ __name((dict, predict) => {
|
|
83
95
|
const result = {};
|
|
84
96
|
for (const obj in dict) {
|
|
@@ -480,9 +492,7 @@ var RivenOrderComponent = /* @__PURE__ */ __name((item, order) => {
|
|
|
480
492
|
] });
|
|
481
493
|
}, "RivenOrderComponent");
|
|
482
494
|
var RivenAttributeComponent = /* @__PURE__ */ __name((attr, index) => {
|
|
483
|
-
const attrInfo =
|
|
484
|
-
(e) => e.slug == attr.url_name
|
|
485
|
-
);
|
|
495
|
+
const attrInfo = globalRivenAttributeDict[attr.url_name];
|
|
486
496
|
const attrName = attrInfo.i18n["zh-hans"].name;
|
|
487
497
|
const attrValuePrefix = attrInfo.unit === "multiply" ? "x" : "";
|
|
488
498
|
const unitSuffixMap = {
|
|
@@ -523,34 +533,46 @@ var RivenAttributeComponent = /* @__PURE__ */ __name((attr, index) => {
|
|
|
523
533
|
}, "RivenAttributeComponent");
|
|
524
534
|
|
|
525
535
|
// src/services/wfm-service.ts
|
|
536
|
+
var globalItemDict = {};
|
|
526
537
|
var globalItemList = [];
|
|
538
|
+
var globalRivenItemDict = {};
|
|
527
539
|
var globalRivenItemList = [];
|
|
528
|
-
var
|
|
540
|
+
var globalRivenAttributeDict = {};
|
|
529
541
|
var wmOnReady = /* @__PURE__ */ __name(async () => {
|
|
530
542
|
const data = await getWFMItemList();
|
|
531
543
|
if (!data) {
|
|
532
544
|
throw new Error("Failed to fetch items from Warframe Market API.");
|
|
533
545
|
}
|
|
534
|
-
globalItemList = data.data;
|
|
535
546
|
const rivenData = await getWFMRivenItemList();
|
|
536
547
|
if (!rivenData) {
|
|
537
548
|
throw new Error("Failed to fetch riven items from Warframe Market API.");
|
|
538
549
|
}
|
|
539
|
-
globalRivenItemList = rivenData.data;
|
|
540
550
|
const rivenAttributeData = await getWFMRivenAttributeList();
|
|
541
551
|
if (!rivenAttributeData) {
|
|
542
552
|
throw new Error(
|
|
543
553
|
"Failed to fetch riven attributes from Warframe Market API."
|
|
544
554
|
);
|
|
545
555
|
}
|
|
546
|
-
|
|
556
|
+
globalItemList = data.data;
|
|
557
|
+
globalItemDict = transformListIntoDict(data.data, (i) => [
|
|
558
|
+
normalizeOrderName(i.i18n["en"].name),
|
|
559
|
+
normalizeOrderName(i.i18n["zh-hans"].name)
|
|
560
|
+
]);
|
|
561
|
+
globalRivenItemList = rivenData.data;
|
|
562
|
+
globalRivenItemDict = transformListIntoDict(
|
|
563
|
+
rivenData.data,
|
|
564
|
+
(i) => [
|
|
565
|
+
normalizeOrderName(i.i18n["en"].name),
|
|
566
|
+
normalizeOrderName(i.i18n["zh-hans"].name)
|
|
567
|
+
]
|
|
568
|
+
);
|
|
569
|
+
globalRivenAttributeDict = transformListIntoDict(
|
|
570
|
+
rivenAttributeData.data,
|
|
571
|
+
(a) => [a.slug]
|
|
572
|
+
);
|
|
547
573
|
}, "wmOnReady");
|
|
548
574
|
var getItemOrders = /* @__PURE__ */ __name(async (itemName) => {
|
|
549
|
-
const targetItem =
|
|
550
|
-
(item) => compareCNOrderName(itemName, item.i18n["zh-hans"].name)
|
|
551
|
-
) ?? globalItemList.find(
|
|
552
|
-
(item) => compareENOrderName(itemName, item.i18n["en"].name)
|
|
553
|
-
);
|
|
575
|
+
const targetItem = inputToItem(itemName);
|
|
554
576
|
if (!targetItem) {
|
|
555
577
|
return null;
|
|
556
578
|
}
|
|
@@ -596,45 +618,140 @@ var generateRivenOrderOutput = /* @__PURE__ */ __name(async (puppe, item, orders
|
|
|
596
618
|
const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
|
|
597
619
|
return OutputImage(imgBase64);
|
|
598
620
|
}, "generateRivenOrderOutput");
|
|
599
|
-
var
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
621
|
+
var warframeAlias = {
|
|
622
|
+
Volt: ["电", "电男", "伏特"],
|
|
623
|
+
Trinity: ["奶妈", "奶"],
|
|
624
|
+
Rhino: ["犀牛", "牛", "铁甲犀牛"],
|
|
625
|
+
Mag: ["磁妹", "磁力"],
|
|
626
|
+
Loki: ["洛基"],
|
|
627
|
+
Excalibur: ["咖喱棒", "圣剑", "咖喱"],
|
|
628
|
+
Ember: ["火鸡"],
|
|
629
|
+
Ash: ["灰烬", "灰烬之刃"],
|
|
630
|
+
Nyx: ["脑溢血"],
|
|
631
|
+
Frost: ["冰男", "冰雪寒霜", "冰队", "冰"],
|
|
632
|
+
Saryn: ["毒妈", "毒"],
|
|
633
|
+
Banshee: ["女妖", "女高音"],
|
|
634
|
+
Vauban: ["工程"],
|
|
635
|
+
Nova: ["诺娃", "加速", "加速娃"],
|
|
636
|
+
Nekros: ["摸尸", "摸"],
|
|
637
|
+
Valkyr: ["瓦尔基里", "瓦喵", "瓦"],
|
|
638
|
+
Oberon: ["奶爸", "龙王", "奥伯龙"],
|
|
639
|
+
Zephyr: ["鸟姐", "鸟"],
|
|
640
|
+
Hydroid: ["水男"],
|
|
641
|
+
Mirage: ["小丑", "丑"],
|
|
642
|
+
Limbo: ["小明", "李明博", "明"],
|
|
643
|
+
Mesa: ["女枪"],
|
|
644
|
+
Chroma: ["龙甲", "龙"],
|
|
645
|
+
Equinox: ["阴阳", "双子"],
|
|
646
|
+
Atlas: ["土石魔像", "土"],
|
|
647
|
+
Wukong: ["猴子", "齐天大圣", "悟空", "猴"],
|
|
648
|
+
Ivara: ["弓妹", "弓"],
|
|
649
|
+
Nezha: ["哪吒", "三太子"],
|
|
650
|
+
Inaros: ["沙"],
|
|
651
|
+
Titania: ["蝶妹"],
|
|
652
|
+
Nidus: ["蛆甲", "蛆"],
|
|
653
|
+
Octavia: ["DJ", "音乐"],
|
|
654
|
+
Harrow: ["主教"],
|
|
655
|
+
Gara: ["玻璃"],
|
|
656
|
+
Khora: ["猫"],
|
|
657
|
+
Revenant: ["夜灵"],
|
|
658
|
+
Garuda: ["血妈", "血"],
|
|
659
|
+
Baruuk: ["武僧"],
|
|
660
|
+
Hildryn: ["母牛"],
|
|
661
|
+
Wisp: ["花"],
|
|
662
|
+
Gauss: ["高斯"],
|
|
663
|
+
Grendel: ["肥宅"],
|
|
664
|
+
Protea: ["茶", "茶妹"],
|
|
665
|
+
Xaku: ["骨"],
|
|
666
|
+
Lavos: ["炼金", "药水", "药水哥", "蛇"],
|
|
667
|
+
Sevagoth: ["鬼", "鲨鱼"],
|
|
668
|
+
Yareli: ["水妹"],
|
|
669
|
+
Caliban: ["卡利班"],
|
|
670
|
+
Gyre: ["电妹"],
|
|
671
|
+
Styanax: ["斯巴达"],
|
|
672
|
+
Voruna: ["狼", "狼妹"],
|
|
673
|
+
Citrine: ["水晶", "宝石"],
|
|
674
|
+
Kullervo: ["刀哥"],
|
|
675
|
+
Dagath: ["马", "赛马娘", "马娘"],
|
|
676
|
+
Qorvex: ["暖气片"],
|
|
677
|
+
Dante: ["但丁"],
|
|
678
|
+
Jade: ["翡翠", "天使"],
|
|
679
|
+
Koumei: [],
|
|
680
|
+
"Cyte-09": ["Cyte09", "老九", "9", "九"],
|
|
681
|
+
Temple: ["吉他"],
|
|
682
|
+
Nokko: ["蘑菇"]
|
|
683
|
+
};
|
|
684
|
+
var warframeAliasDict = ((aliasObject) => {
|
|
685
|
+
const transformedObject = {};
|
|
686
|
+
for (const [key, aliases] of Object.entries(aliasObject)) {
|
|
687
|
+
for (const alias of aliases) {
|
|
688
|
+
if (typeof alias === "string" && alias.length > 0) {
|
|
689
|
+
transformedObject[alias] = key;
|
|
690
|
+
const warframeNameWithSuffix = `${alias}甲`;
|
|
691
|
+
transformedObject[warframeNameWithSuffix] = key;
|
|
692
|
+
}
|
|
693
|
+
transformedObject[key] = key;
|
|
694
|
+
}
|
|
616
695
|
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
const
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
696
|
+
return transformedObject;
|
|
697
|
+
})(warframeAlias);
|
|
698
|
+
var inputToItem = /* @__PURE__ */ __name((input) => {
|
|
699
|
+
const compareCNOrderName = /* @__PURE__ */ __name((input2, standard) => {
|
|
700
|
+
if (!input2 || !standard || typeof input2 !== "string" || typeof standard !== "string") {
|
|
701
|
+
return false;
|
|
702
|
+
}
|
|
703
|
+
const normalizedInput = normalizeOrderName(input2);
|
|
704
|
+
const normalizedStandard = normalizeOrderName(standard);
|
|
705
|
+
if (!normalizedInput || !normalizedStandard) return false;
|
|
706
|
+
const normalizedStandardNoSet = normalizedStandard.replace(/一套/g, "");
|
|
707
|
+
const normalizedStandardNoSetSimplifiedPrime = normalizedStandardNoSet.replace(/prime/g, "p");
|
|
708
|
+
const normalizedStandardNoBlueprint = normalizedStandard.replace(
|
|
709
|
+
/蓝图/g,
|
|
710
|
+
""
|
|
711
|
+
);
|
|
712
|
+
const normalizedStandardNoBlueprintSimplifiedPrime = normalizedStandardNoBlueprint.replace(/prime/g, "p");
|
|
713
|
+
const normalizedStandardNoNeu = normalizedStandardNoBlueprintSimplifiedPrime.replace(
|
|
714
|
+
/头部神经光元/g,
|
|
715
|
+
"头"
|
|
716
|
+
);
|
|
717
|
+
return normalizedInput === normalizedStandard || normalizedInput === normalizedStandardNoSet || normalizedInput === normalizedStandardNoSetSimplifiedPrime || normalizedInput === normalizedStandardNoBlueprintSimplifiedPrime || normalizedInput === normalizedStandardNoNeu;
|
|
718
|
+
}, "compareCNOrderName");
|
|
719
|
+
const compareENOrderName = /* @__PURE__ */ __name((input2, standard) => {
|
|
720
|
+
if (!input2 || !standard || typeof input2 !== "string" || typeof standard !== "string") {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
const endWithSet = standard.toLowerCase().endsWith(" set");
|
|
724
|
+
const standardNoSet = endWithSet ? standard.slice(0, -4) : standard;
|
|
725
|
+
const endWithBlueprint = standard.toLocaleLowerCase().endsWith("blueprint");
|
|
726
|
+
const standardNoBlueprint = endWithBlueprint ? standard.slice(0, -10) : standard;
|
|
727
|
+
const standardSimplifiedPrime = standardNoSet.replace(/ Prime/g, "p");
|
|
728
|
+
const standardNoBlueprintSimplifiedPrime = standardNoBlueprint.replace(
|
|
729
|
+
/ Prime/g,
|
|
730
|
+
"p"
|
|
731
|
+
);
|
|
732
|
+
const normalizedInput = normalizeOrderName(input2);
|
|
733
|
+
const normalizedStandard = normalizeOrderName(standard);
|
|
734
|
+
if (!normalizedInput || !normalizedStandard) return false;
|
|
735
|
+
const normalizedStandardNoSet = normalizeOrderName(standardNoSet);
|
|
736
|
+
const normalizedStandardSimplifiedPrime = normalizeOrderName(
|
|
737
|
+
standardSimplifiedPrime
|
|
738
|
+
);
|
|
739
|
+
const normalizedStandardNoBlueprint = normalizeOrderName(
|
|
740
|
+
standardNoBlueprintSimplifiedPrime
|
|
741
|
+
);
|
|
742
|
+
return normalizedInput === normalizedStandard || normalizedInput === normalizedStandardNoSet || normalizedInput === normalizedStandardSimplifiedPrime || normalizedInput === normalizedStandardNoBlueprint;
|
|
743
|
+
}, "compareENOrderName");
|
|
744
|
+
const old = globalItemList.find(
|
|
745
|
+
(item) => compareCNOrderName(input, item.i18n["zh-hans"].name)
|
|
746
|
+
) ?? globalItemList.find(
|
|
747
|
+
(item) => compareENOrderName(input, item.i18n["en"].name)
|
|
635
748
|
);
|
|
636
|
-
|
|
637
|
-
|
|
749
|
+
const direct = globalItemList[normalizeOrderName(input)];
|
|
750
|
+
if (direct) {
|
|
751
|
+
return direct;
|
|
752
|
+
}
|
|
753
|
+
return old;
|
|
754
|
+
}, "inputToItem");
|
|
638
755
|
var compareRivenItemName = /* @__PURE__ */ __name((input, standard) => {
|
|
639
756
|
if (!input || !standard || typeof input !== "string" || typeof standard !== "string") {
|
|
640
757
|
return false;
|
|
@@ -44980,6 +45097,7 @@ var arbitrationSchedule = arbys_default.split("\n").map((line) => line.split(","
|
|
|
44980
45097
|
});
|
|
44981
45098
|
var worldState = null;
|
|
44982
45099
|
var worldStateLastUpdatedAt = null;
|
|
45100
|
+
var worldstateUpdating = false;
|
|
44983
45101
|
var fissures = [];
|
|
44984
45102
|
var spFissures = [];
|
|
44985
45103
|
var rjFissures = [];
|
|
@@ -45065,9 +45183,16 @@ var generateFissureOutput = /* @__PURE__ */ __name(async (puppe, fissures2, type
|
|
|
45065
45183
|
return OutputImage(imgBase64);
|
|
45066
45184
|
}, "generateFissureOutput");
|
|
45067
45185
|
var updateWorldState = /* @__PURE__ */ __name(async () => {
|
|
45068
|
-
if (
|
|
45186
|
+
if (worldstateUpdating) return true;
|
|
45187
|
+
if (worldState && worldStateLastUpdatedAt && Date.now() - worldStateLastUpdatedAt.getTime() < 12e4)
|
|
45188
|
+
return true;
|
|
45189
|
+
try {
|
|
45069
45190
|
worldState = await getWorldState();
|
|
45070
45191
|
worldStateLastUpdatedAt = /* @__PURE__ */ new Date();
|
|
45192
|
+
worldstateUpdating = true;
|
|
45193
|
+
fissures = [];
|
|
45194
|
+
rjFissures = [];
|
|
45195
|
+
spFissures = [];
|
|
45071
45196
|
for (const fissure of worldState.fissures) {
|
|
45072
45197
|
const nodeKey = await getSolNodeKey(fissure.nodeKey);
|
|
45073
45198
|
const obj = {
|
|
@@ -45090,8 +45215,11 @@ var updateWorldState = /* @__PURE__ */ __name(async () => {
|
|
|
45090
45215
|
fissures.sort((a, b) => a.tierNum - b.tierNum);
|
|
45091
45216
|
spFissures.sort((a, b) => a.tierNum - b.tierNum);
|
|
45092
45217
|
rjFissures.sort((a, b) => a.tierNum - b.tierNum);
|
|
45218
|
+
} catch {
|
|
45219
|
+
} finally {
|
|
45220
|
+
worldstateUpdating = false;
|
|
45221
|
+
return worldState && worldStateLastUpdatedAt && Date.now() - worldStateLastUpdatedAt.getTime() < 12e4;
|
|
45093
45222
|
}
|
|
45094
|
-
return worldState && Date.now() - worldStateLastUpdatedAt.getTime() < 12e4;
|
|
45095
45223
|
}, "updateWorldState");
|
|
45096
45224
|
|
|
45097
45225
|
// src/commands/wfm/wm.ts
|