warframe-worldstate-parser 5.2.15 → 5.2.17
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/dist/lib/WorldState.d.mts +35 -19
- package/dist/lib/WorldState.mjs +31 -45
- package/dist/lib/models/Alert.d.mts +45 -17
- package/dist/lib/models/Alert.mjs +49 -5
- package/dist/lib/models/Archimedea.d.mts +86 -17
- package/dist/lib/models/Archimedea.mjs +88 -2
- package/dist/lib/models/Calendar.d.mts +77 -2
- package/dist/lib/models/Calendar.mjs +79 -2
- package/dist/lib/models/CambionCycle.d.mts +21 -3
- package/dist/lib/models/CambionCycle.mjs +28 -2
- package/dist/lib/models/CetusCycle.d.mts +48 -2
- package/dist/lib/models/CetusCycle.mjs +87 -2
- package/dist/lib/models/ChallengeInstance.d.mts +53 -17
- package/dist/lib/models/ChallengeInstance.mjs +46 -1
- package/dist/lib/models/ConclaveChallenge.d.mts +76 -17
- package/dist/lib/models/ConclaveChallenge.mjs +77 -2
- package/dist/lib/models/ConstructionProgress.d.mts +17 -2
- package/dist/lib/models/ConstructionProgress.mjs +23 -2
- package/dist/lib/models/DailyDeal.d.mts +66 -17
- package/dist/lib/models/DailyDeal.mjs +64 -2
- package/dist/lib/models/DarkSector.d.mts +142 -17
- package/dist/lib/models/DarkSector.mjs +136 -6
- package/dist/lib/models/DarkSectorBattle.d.mts +52 -2
- package/dist/lib/models/DarkSectorBattle.mjs +49 -1
- package/dist/lib/models/DuviriCycle.d.mts +23 -17
- package/dist/lib/models/DuviriCycle.mjs +55 -2
- package/dist/lib/models/EarthCycle.d.mts +59 -2
- package/dist/lib/models/EarthCycle.mjs +73 -2
- package/dist/lib/models/Fissure.d.mts +78 -17
- package/dist/lib/models/Fissure.mjs +83 -2
- package/dist/lib/models/FlashSale.d.mts +71 -17
- package/dist/lib/models/FlashSale.mjs +73 -2
- package/dist/lib/models/GlobalUpgrade.d.mts +55 -17
- package/dist/lib/models/GlobalUpgrade.mjs +56 -2
- package/dist/lib/models/Invasion.d.mts +113 -17
- package/dist/lib/models/Invasion.mjs +106 -4
- package/dist/lib/models/Kinepage.d.mts +21 -1
- package/dist/lib/models/Kinepage.mjs +22 -1
- package/dist/lib/models/Kuva.d.mts +20 -17
- package/dist/lib/models/Kuva.mjs +85 -1
- package/dist/lib/models/MidrathCycle.d.mts +24 -2
- package/dist/lib/models/MidrathCycle.mjs +66 -2
- package/dist/lib/models/Mission.d.mts +138 -17
- package/dist/lib/models/Mission.mjs +138 -3
- package/dist/lib/models/News.d.mts +100 -2
- package/dist/lib/models/News.mjs +116 -2
- package/dist/lib/models/Nightwave.d.mts +58 -3
- package/dist/lib/models/Nightwave.mjs +58 -3
- package/dist/lib/models/NightwaveChallenge.d.mts +50 -2
- package/dist/lib/models/NightwaveChallenge.mjs +51 -2
- package/dist/lib/models/PersistentEnemy.d.mts +78 -2
- package/dist/lib/models/PersistentEnemy.mjs +74 -2
- package/dist/lib/models/Reward.d.mts +67 -17
- package/dist/lib/models/Reward.mjs +71 -2
- package/dist/lib/models/SentientOutpost.d.mts +46 -17
- package/dist/lib/models/SentientOutpost.mjs +63 -1
- package/dist/lib/models/Simaris.d.mts +36 -17
- package/dist/lib/models/Simaris.mjs +33 -1
- package/dist/lib/models/Sortie.d.mts +60 -17
- package/dist/lib/models/Sortie.mjs +71 -6
- package/dist/lib/models/SortieVariant.d.mts +49 -17
- package/dist/lib/models/SortieVariant.mjs +49 -1
- package/dist/lib/models/SteelPathOffering.d.mts +36 -1
- package/dist/lib/models/SteelPathOffering.mjs +81 -1
- package/dist/lib/models/SyndicateJob.d.mts +92 -17
- package/dist/lib/models/SyndicateJob.mjs +161 -5
- package/dist/lib/models/SyndicateMission.d.mts +58 -17
- package/dist/lib/models/SyndicateMission.mjs +64 -6
- package/dist/lib/models/Tmp.d.mts +34 -17
- package/dist/lib/models/Tmp.mjs +28 -2
- package/dist/lib/models/VallisCycle.d.mts +29 -2
- package/dist/lib/models/VallisCycle.mjs +72 -2
- package/dist/lib/models/VoidTrader.d.mts +76 -17
- package/dist/lib/models/VoidTrader.mjs +76 -4
- package/dist/lib/models/VoidTraderItem.d.mts +43 -17
- package/dist/lib/models/VoidTraderItem.mjs +36 -1
- package/dist/lib/models/VoidTraderSchedule.d.mts +16 -17
- package/dist/lib/models/VoidTraderSchedule.mjs +12 -1
- package/dist/lib/models/WeeklyChallenge.d.mts +19 -17
- package/dist/lib/models/WeeklyChallenge.mjs +19 -3
- package/dist/lib/models/WorldEvent.d.mts +204 -17
- package/dist/lib/models/WorldEvent.mjs +211 -7
- package/dist/lib/models/WorldStateObject.d.mts +47 -1
- package/dist/lib/models/WorldStateObject.mjs +52 -1
- package/dist/lib/models/ZarimanCycle.d.mts +44 -2
- package/dist/lib/models/ZarimanCycle.mjs +77 -2
- package/dist/lib/models/index.d.mts +42 -18
- package/dist/lib/models/index.mjs +42 -45
- package/dist/lib/supporting/Dependency.d.mts +40 -1
- package/dist/lib/supporting/DuviriChoice.d.mts +18 -17
- package/dist/lib/supporting/DuviriChoice.mjs +23 -1
- package/dist/lib/supporting/ExternalMission.d.mts +48 -1
- package/dist/lib/supporting/FetchProxy.d.mts +9 -1
- package/dist/lib/supporting/FetchProxy.mjs +44 -1
- package/dist/lib/supporting/ImgCdn.d.mts +5 -1
- package/dist/lib/supporting/ImgCdn.mjs +5 -1
- package/dist/lib/supporting/KuvaLogEntry.d.mts +20 -1
- package/dist/lib/supporting/RewardData.d.mts +10 -1
- package/dist/lib/supporting/RewardData.mjs +74 -1
- package/dist/lib/supporting/RewardTypes.d.mts +33 -1
- package/dist/lib/supporting/RewardTypes.mjs +326 -1
- package/dist/lib/supporting/index.d.mts +8 -23
- package/dist/lib/supporting/index.mjs +5 -6
- package/dist/main.d.mts +52 -24
- package/dist/main.mjs +47 -48
- package/package.json +1 -1
- package/dist/Alert-CPT2sBmd.mjs +0 -51
- package/dist/Archimedea-Vo36QE99.mjs +0 -90
- package/dist/Calendar-CRM0XhAy.d.mts +0 -78
- package/dist/Calendar-_gEQ9BEd.mjs +0 -81
- package/dist/CambionCycle-B1pqIgks.mjs +0 -30
- package/dist/CambionCycle-OI3v1knd.d.mts +0 -22
- package/dist/CetusCycle-Ct51M2pd.mjs +0 -89
- package/dist/CetusCycle-DQ4n05vO.d.mts +0 -49
- package/dist/ChallengeInstance-BOu_e7ML.mjs +0 -48
- package/dist/ConclaveChallenge-BTN6UyV6.mjs +0 -79
- package/dist/ConstructionProgress-BoF2P9fx.mjs +0 -25
- package/dist/ConstructionProgress-DG2KzS0X.d.mts +0 -18
- package/dist/DailyDeal-aoNeCFWT.mjs +0 -66
- package/dist/DarkSector-D0uJWCg7.mjs +0 -138
- package/dist/DarkSectorBattle-CiSe3kFm.d.mts +0 -53
- package/dist/DarkSectorBattle-CqRYeNpe.mjs +0 -51
- package/dist/Dependency-BR-dAeHI.mjs +0 -1
- package/dist/Dependency-CNqXngHD.d.mts +0 -41
- package/dist/DuviriChoice-BEBiWA-g.mjs +0 -25
- package/dist/DuviriCycle-Do7mMnoC.mjs +0 -57
- package/dist/EarthCycle-BOAlcAuQ.mjs +0 -75
- package/dist/EarthCycle-CxtijnVV.d.mts +0 -60
- package/dist/ExternalMission-C82w4uMq.d.mts +0 -49
- package/dist/ExternalMission-D3MSZgnN.mjs +0 -1
- package/dist/FetchProxy-Bkdk15SX.mjs +0 -46
- package/dist/FetchProxy-DfSTUgkf.d.mts +0 -10
- package/dist/Fissure-diM4hyi3.mjs +0 -85
- package/dist/FlashSale-CNfRaZhM.mjs +0 -75
- package/dist/GlobalUpgrade-CUtZw05z.mjs +0 -58
- package/dist/ImgCdn-BJOdWAbU.mjs +0 -7
- package/dist/ImgCdn-D0hSGSB1.d.mts +0 -6
- package/dist/Invasion-Corx1lxf.mjs +0 -108
- package/dist/Kinepage-B-Ym_VW5.d.mts +0 -22
- package/dist/Kinepage-CbSzge67.mjs +0 -24
- package/dist/Kuva-Ijy2ZGBL.mjs +0 -87
- package/dist/KuvaLogEntry-D_VzIT3W.mjs +0 -1
- package/dist/KuvaLogEntry-cftxhjfU.d.mts +0 -21
- package/dist/MidrathCycle-E0gMF3AR.d.mts +0 -25
- package/dist/MidrathCycle-XD2T8Dx5.mjs +0 -68
- package/dist/Mission-b8KP-YDf.mjs +0 -140
- package/dist/News-DxEm-q6V.d.mts +0 -101
- package/dist/News-zAK-sYRg.mjs +0 -118
- package/dist/Nightwave-CPqMSqGK.d.mts +0 -59
- package/dist/Nightwave-cTRmlbwH.mjs +0 -60
- package/dist/NightwaveChallenge-C8ARG7LC.mjs +0 -53
- package/dist/NightwaveChallenge-CG3uychc.d.mts +0 -51
- package/dist/PersistentEnemy-3Sw5E8AN.mjs +0 -76
- package/dist/PersistentEnemy-DnnnreSz.d.mts +0 -79
- package/dist/Reward-3FBJF_hS.mjs +0 -73
- package/dist/RewardData-C_9b8Yhi.mjs +0 -76
- package/dist/RewardData-DWCgJ3UT.d.mts +0 -11
- package/dist/RewardTypes-DUrR7H3G.mjs +0 -328
- package/dist/RewardTypes-Y3tHrtIJ.d.mts +0 -34
- package/dist/SentientOutpost-Cadk-pIW.mjs +0 -65
- package/dist/Simaris-D6etEQp_.mjs +0 -35
- package/dist/Sortie-rSBgJc6U.mjs +0 -73
- package/dist/SortieVariant-CnuLkkNZ.mjs +0 -51
- package/dist/SteelPathOffering--wm-7hwb.mjs +0 -83
- package/dist/SteelPathOffering-CQkoKi5T.d.mts +0 -37
- package/dist/SyndicateJob-R89tWqvT.mjs +0 -162
- package/dist/SyndicateMission-CKZDWNyf.mjs +0 -66
- package/dist/Tmp-BYL_mYIG.mjs +0 -30
- package/dist/VallisCycle-6DCaWFoR.d.mts +0 -30
- package/dist/VallisCycle-C5JCM2ia.mjs +0 -74
- package/dist/VoidTrader-DtjtVUgR.mjs +0 -78
- package/dist/VoidTraderItem-Cz6x1KTF.mjs +0 -38
- package/dist/VoidTraderSchedule-BsJLu50V.mjs +0 -14
- package/dist/WeeklyChallenge-Dl2ekl6X.mjs +0 -21
- package/dist/WorldEvent-C-LaV2ug.mjs +0 -213
- package/dist/WorldStateObject-45dbRgp7.mjs +0 -54
- package/dist/WorldStateObject-C1HEDkH7.d.mts +0 -48
- package/dist/ZarimanCycle-BrSLIWhD.d.mts +0 -45
- package/dist/ZarimanCycle-DoAPwgaM.mjs +0 -79
- package/dist/index-Bgx8kIDy.d.mts +0 -1671
- package/dist/supporting-BLSXhlWM.mjs +0 -1
|
@@ -1,6 +1,108 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import "
|
|
3
|
-
import "
|
|
4
|
-
import { t as Invasion } from "../../Invasion-Corx1lxf.mjs";
|
|
1
|
+
import { Reward } from "./Reward.mjs";
|
|
2
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
3
|
+
import { faction, languageString, node, timeDeltaToString, toNow } from "warframe-worldstate-data/utilities";
|
|
5
4
|
|
|
5
|
+
//#region lib/models/Invasion.ts
|
|
6
|
+
/**
|
|
7
|
+
* Represents an invasion
|
|
8
|
+
*/
|
|
9
|
+
var Invasion = class extends WorldStateObject {
|
|
10
|
+
/**
|
|
11
|
+
* The node where the invasion is taking place
|
|
12
|
+
*/
|
|
13
|
+
node;
|
|
14
|
+
/**
|
|
15
|
+
* The node key where the invasion is taking place
|
|
16
|
+
*/
|
|
17
|
+
nodeKey;
|
|
18
|
+
/**
|
|
19
|
+
* The invasion's description
|
|
20
|
+
*/
|
|
21
|
+
desc;
|
|
22
|
+
/**
|
|
23
|
+
* Invasion attacker
|
|
24
|
+
*/
|
|
25
|
+
attacker;
|
|
26
|
+
/**
|
|
27
|
+
* Invasion defender
|
|
28
|
+
*/
|
|
29
|
+
defender;
|
|
30
|
+
/**
|
|
31
|
+
* Whether this invasion is against the infestation
|
|
32
|
+
*/
|
|
33
|
+
vsInfestation;
|
|
34
|
+
/**
|
|
35
|
+
* The signed count of completed runs. Supporting the attackers makes the count go up,
|
|
36
|
+
* supporting the defenders makes it go down
|
|
37
|
+
*/
|
|
38
|
+
count;
|
|
39
|
+
/**
|
|
40
|
+
* The number of runs that one side needs to win
|
|
41
|
+
*/
|
|
42
|
+
requiredRuns;
|
|
43
|
+
/**
|
|
44
|
+
* The invasion's completion percentage. Defenders win if it gets to 0
|
|
45
|
+
* Grineer vs. Corpus invasions start at 50, Infested invasions start at 100
|
|
46
|
+
*/
|
|
47
|
+
completion;
|
|
48
|
+
/**
|
|
49
|
+
* Whether the invasion has finished
|
|
50
|
+
*/
|
|
51
|
+
completed;
|
|
52
|
+
/**
|
|
53
|
+
* An array containing the types of all of the invasions's rewards
|
|
54
|
+
*/
|
|
55
|
+
rewardTypes;
|
|
56
|
+
/**
|
|
57
|
+
* @param {object} data The invasion data
|
|
58
|
+
* @param {Dependency} deps The dependencies object
|
|
59
|
+
* @param {string} deps.locale Locale to use for translations
|
|
60
|
+
*/
|
|
61
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
62
|
+
super(data);
|
|
63
|
+
const opts = { locale };
|
|
64
|
+
this.node = node(data.Node, locale);
|
|
65
|
+
this.nodeKey = node(data.Node);
|
|
66
|
+
this.desc = languageString(data.LocTag, locale);
|
|
67
|
+
this.attacker = {
|
|
68
|
+
reward: Object.keys(data?.AttackerReward || {})?.length ? new Reward(data.AttackerReward, opts) : void 0,
|
|
69
|
+
faction: faction(data.DefenderMissionInfo.faction, locale),
|
|
70
|
+
factionKey: faction(data.DefenderMissionInfo.faction, "en")
|
|
71
|
+
};
|
|
72
|
+
this.defender = {
|
|
73
|
+
reward: Object.keys(data?.DefenderReward || {})?.length ? new Reward(data.DefenderReward, opts) : void 0,
|
|
74
|
+
faction: faction(data.AttackerMissionInfo.faction, locale),
|
|
75
|
+
factionKey: faction(data.AttackerMissionInfo.faction, "en")
|
|
76
|
+
};
|
|
77
|
+
this.vsInfestation = /infest/i.test(data.DefenderMissionInfo.faction);
|
|
78
|
+
this.count = data.Count;
|
|
79
|
+
this.requiredRuns = data.Goal;
|
|
80
|
+
this.completion = (1 + data.Count / data.Goal) * (this.vsInfestation ? 100 : 50);
|
|
81
|
+
this.completed = data.Completed;
|
|
82
|
+
this.rewardTypes = [...this.attacker.reward?.getTypes() ?? [], ...this.defender.reward?.getTypes() ?? []];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Whether or not the attackers are winning.
|
|
86
|
+
* This is always false when the infestation is attacking
|
|
87
|
+
*/
|
|
88
|
+
get isAttackerWinning() {
|
|
89
|
+
return this.count > 0;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* ETA string (at time of object creation)
|
|
93
|
+
*/
|
|
94
|
+
get eta() {
|
|
95
|
+
return timeDeltaToString(this.getRemainingTime());
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get an estimation of how much time is left before the invasion ends in milliseconds
|
|
99
|
+
*/
|
|
100
|
+
getRemainingTime() {
|
|
101
|
+
const completedRuns = Math.abs(this.count);
|
|
102
|
+
const elapsedMillis = toNow(this.activation);
|
|
103
|
+
return (this.requiredRuns - completedRuns) * (elapsedMillis / completedRuns);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
6
108
|
export { Invasion };
|
|
@@ -1,2 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
//#region lib/models/Kinepage.d.ts
|
|
2
|
+
declare class Kinepage {
|
|
3
|
+
/**
|
|
4
|
+
* Timestamp of when the message appeared on
|
|
5
|
+
*/
|
|
6
|
+
timestamp: Date;
|
|
7
|
+
/**
|
|
8
|
+
* The message itself
|
|
9
|
+
*/
|
|
10
|
+
message: string;
|
|
11
|
+
/**
|
|
12
|
+
* Message translations
|
|
13
|
+
*/
|
|
14
|
+
translations: {
|
|
15
|
+
[k: string]: unknown;
|
|
16
|
+
};
|
|
17
|
+
constructor(data: {
|
|
18
|
+
[k: string]: string | number;
|
|
19
|
+
}, locale?: string);
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
2
22
|
export { Kinepage };
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
//#region lib/models/Kinepage.ts
|
|
2
|
+
var Kinepage = class {
|
|
3
|
+
/**
|
|
4
|
+
* Timestamp of when the message appeared on
|
|
5
|
+
*/
|
|
6
|
+
timestamp;
|
|
7
|
+
/**
|
|
8
|
+
* The message itself
|
|
9
|
+
*/
|
|
10
|
+
message;
|
|
11
|
+
/**
|
|
12
|
+
* Message translations
|
|
13
|
+
*/
|
|
14
|
+
translations;
|
|
15
|
+
constructor(data, locale = "en") {
|
|
16
|
+
this.timestamp = /* @__PURE__ */ new Date(Number(data.ts) * 1e3);
|
|
17
|
+
const translations = Object.fromEntries(Object.entries(data).filter(([key]) => key !== "ts"));
|
|
18
|
+
this.message = String(translations[locale] || data.en);
|
|
19
|
+
this.translations = Object.fromEntries(Object.entries(translations).filter(([key]) => key !== locale));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
2
22
|
|
|
23
|
+
//#endregion
|
|
3
24
|
export { Kinepage };
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
3
|
-
import "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { Dependency } from "../supporting/Dependency.mjs";
|
|
2
|
+
import { ExternalMission } from "../supporting/ExternalMission.mjs";
|
|
3
|
+
import "../supporting/index.mjs";
|
|
4
|
+
|
|
5
|
+
//#region lib/models/Kuva.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Stores and parses kuva data from https://10o.io/kuvalog.json
|
|
8
|
+
* @property {ExternalMission[]} kuva currently active kuva missions
|
|
9
|
+
* @property {ExternalMission} arbitration current arbitration
|
|
10
|
+
*/
|
|
11
|
+
declare class Kuva {
|
|
12
|
+
kuva?: ExternalMission[];
|
|
13
|
+
arbitration?: ExternalMission;
|
|
14
|
+
constructor({
|
|
15
|
+
kuvaData,
|
|
16
|
+
locale,
|
|
17
|
+
logger
|
|
18
|
+
}: Dependency);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
18
21
|
export { Kuva };
|
package/dist/lib/models/Kuva.mjs
CHANGED
|
@@ -1,3 +1,87 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { node, nodeMissionType } from "warframe-worldstate-data/utilities";
|
|
2
3
|
|
|
4
|
+
//#region lib/models/Kuva.ts
|
|
5
|
+
const HOURS_2 = 72e5;
|
|
6
|
+
/**
|
|
7
|
+
* Truncate time for a semlar-provided mission
|
|
8
|
+
* @param mission parsed mission with re-aligned field names
|
|
9
|
+
*/
|
|
10
|
+
const truncateTime = (mission) => {
|
|
11
|
+
mission.expiry.setHours(mission.activation.getHours() + 1);
|
|
12
|
+
mission.expiry.setMinutes(4);
|
|
13
|
+
mission.expiry.setSeconds(0);
|
|
14
|
+
mission.expiry.setMilliseconds(0);
|
|
15
|
+
mission.activation.setMinutes(mission.activation.getMinutes() + 5.1);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Scrub unnecessary details from the mission
|
|
19
|
+
* @param mission parsed mission with re-aligned field names
|
|
20
|
+
*/
|
|
21
|
+
const scrub = (mission) => {
|
|
22
|
+
delete mission.solnode;
|
|
23
|
+
delete mission.name;
|
|
24
|
+
delete mission.node_type;
|
|
25
|
+
delete mission.tile;
|
|
26
|
+
delete mission.planet;
|
|
27
|
+
};
|
|
28
|
+
const hash = (str) => createHash("md5").update(str, "utf8").digest("hex");
|
|
29
|
+
/**
|
|
30
|
+
* Parse kuva & arbitration data
|
|
31
|
+
* @param data Data to split for kuva/arbitration
|
|
32
|
+
* @param locale locale to translate
|
|
33
|
+
* @returns Split parsed data
|
|
34
|
+
*/
|
|
35
|
+
const parse = (data, locale) => {
|
|
36
|
+
const parsed = {
|
|
37
|
+
kuva: [],
|
|
38
|
+
arbitration: {}
|
|
39
|
+
};
|
|
40
|
+
const now = /* @__PURE__ */ new Date();
|
|
41
|
+
if (!data) return void 0;
|
|
42
|
+
data?.forEach?.((mission) => {
|
|
43
|
+
const p = {
|
|
44
|
+
id: "",
|
|
45
|
+
activation: new Date(mission.start),
|
|
46
|
+
expiry: new Date(mission.end),
|
|
47
|
+
...mission.solnodedata,
|
|
48
|
+
node: node(mission.solnode, locale),
|
|
49
|
+
nodeKey: node(mission.solnode, "en"),
|
|
50
|
+
type: nodeMissionType(mission.solnode, locale),
|
|
51
|
+
typeKey: nodeMissionType(mission.solnode, "en"),
|
|
52
|
+
expired: false,
|
|
53
|
+
archwing: mission.solnodedata?.archwing ?? false,
|
|
54
|
+
sharkwing: mission.solnodedata?.sharkwing ?? false
|
|
55
|
+
};
|
|
56
|
+
truncateTime(p);
|
|
57
|
+
p.id = hash(JSON.stringify(p));
|
|
58
|
+
p.expired = Date.now() - p.expiry.getTime() < 0;
|
|
59
|
+
if (p.activation < now && now < p.expiry && new Date(p.activation.getTime() + HOURS_2) > now && new Date(p.expiry.getTime() - HOURS_2) < now) {
|
|
60
|
+
if (mission.missiontype === "EliteAlertMission") parsed.arbitration = p;
|
|
61
|
+
if (mission.missiontype?.startsWith("KuvaMission")) parsed.kuva.push(p);
|
|
62
|
+
}
|
|
63
|
+
scrub(p);
|
|
64
|
+
});
|
|
65
|
+
parsed.kuva = Array.from(new Set(parsed.kuva));
|
|
66
|
+
return parsed;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Stores and parses kuva data from https://10o.io/kuvalog.json
|
|
70
|
+
* @property {ExternalMission[]} kuva currently active kuva missions
|
|
71
|
+
* @property {ExternalMission} arbitration current arbitration
|
|
72
|
+
*/
|
|
73
|
+
var Kuva = class {
|
|
74
|
+
kuva;
|
|
75
|
+
arbitration;
|
|
76
|
+
constructor({ kuvaData, locale, logger }) {
|
|
77
|
+
if (!kuvaData) logger?.debug("No defined kuva data, skipping data");
|
|
78
|
+
else {
|
|
79
|
+
const parsed = parse(kuvaData, locale);
|
|
80
|
+
this.kuva = parsed?.kuva;
|
|
81
|
+
this.arbitration = parsed?.arbitration;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
3
87
|
export { Kuva };
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
-
import "
|
|
2
|
-
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
|
|
3
|
+
//#region lib/models/MidrathCycle.d.ts
|
|
4
|
+
declare class MidrathCycle extends WorldStateObject {
|
|
5
|
+
#private;
|
|
6
|
+
/**
|
|
7
|
+
* Whether it's day or not
|
|
8
|
+
*/
|
|
9
|
+
isDay: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* The current state
|
|
12
|
+
*/
|
|
13
|
+
state: string;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Get whether or not the event has expired
|
|
17
|
+
*/
|
|
18
|
+
get expired(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The amount of time left as a string
|
|
21
|
+
*/
|
|
22
|
+
get timeLeft(): string;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
3
25
|
export { MidrathCycle };
|
|
@@ -1,4 +1,68 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import {
|
|
1
|
+
import { WorldStateObject } from "./WorldStateObject.mjs";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { fromNow, timeDeltaToString } from "warframe-worldstate-data/utilities";
|
|
3
4
|
|
|
5
|
+
//#region lib/models/MidrathCycle.ts
|
|
6
|
+
/**
|
|
7
|
+
* Get the current Midrath cycle time
|
|
8
|
+
*/
|
|
9
|
+
function getCurrentMidrathCycle() {
|
|
10
|
+
const dayDuration = 1920 * 1e3;
|
|
11
|
+
const nightDuration = 960 * 1e3;
|
|
12
|
+
const totalDuration = dayDuration + nightDuration;
|
|
13
|
+
const refPoint = Date.parse("2025-08-07T16:05:29Z");
|
|
14
|
+
const now = Date.now();
|
|
15
|
+
const elapsedInCycle = (now - refPoint) % totalDuration;
|
|
16
|
+
const isDay = elapsedInCycle < dayDuration;
|
|
17
|
+
let phase = {
|
|
18
|
+
name: "night",
|
|
19
|
+
remaining: totalDuration - elapsedInCycle,
|
|
20
|
+
duration: nightDuration
|
|
21
|
+
};
|
|
22
|
+
if (isDay) phase = {
|
|
23
|
+
name: "day",
|
|
24
|
+
remaining: dayDuration - elapsedInCycle,
|
|
25
|
+
duration: dayDuration
|
|
26
|
+
};
|
|
27
|
+
const activation = new Date(now - (phase.duration - phase.remaining));
|
|
28
|
+
return {
|
|
29
|
+
activation,
|
|
30
|
+
expiry: new Date(activation.getTime() + phase.duration),
|
|
31
|
+
state: phase.name,
|
|
32
|
+
isDay
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
var MidrathCycle = class extends WorldStateObject {
|
|
36
|
+
#cycle = getCurrentMidrathCycle();
|
|
37
|
+
/**
|
|
38
|
+
* Whether it's day or not
|
|
39
|
+
*/
|
|
40
|
+
isDay;
|
|
41
|
+
/**
|
|
42
|
+
* The current state
|
|
43
|
+
*/
|
|
44
|
+
state;
|
|
45
|
+
constructor() {
|
|
46
|
+
super({ _id: { $oid: "midrathCycle0" } });
|
|
47
|
+
this.activation = this.#cycle.activation;
|
|
48
|
+
this.expiry = this.#cycle.expiry;
|
|
49
|
+
this.isDay = this.#cycle.isDay;
|
|
50
|
+
this.state = this.#cycle.state;
|
|
51
|
+
this.id = createHash("md5").update(JSON.stringify(this.expiry), "utf8").digest("hex");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get whether or not the event has expired
|
|
55
|
+
*/
|
|
56
|
+
get expired() {
|
|
57
|
+
return fromNow(this.expiry) < 0;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The amount of time left as a string
|
|
61
|
+
*/
|
|
62
|
+
get timeLeft() {
|
|
63
|
+
return timeDeltaToString(fromNow(this.expiry));
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
4
68
|
export { MidrathCycle };
|
|
@@ -1,18 +1,139 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import
|
|
3
|
-
import "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { Dependency } from "../supporting/Dependency.mjs";
|
|
2
|
+
import "../supporting/index.mjs";
|
|
3
|
+
import { RawReward, Reward } from "./Reward.mjs";
|
|
4
|
+
|
|
5
|
+
//#region lib/models/Mission.d.ts
|
|
6
|
+
interface RawMission {
|
|
7
|
+
descText: string;
|
|
8
|
+
location: string;
|
|
9
|
+
node?: string;
|
|
10
|
+
missionType: string;
|
|
11
|
+
faction: string;
|
|
12
|
+
missionReward: RawReward;
|
|
13
|
+
minEnemyLevel: number;
|
|
14
|
+
maxEnemyLevel: number;
|
|
15
|
+
maxWaveNum?: number;
|
|
16
|
+
nightmare?: boolean;
|
|
17
|
+
archwingRequired?: boolean;
|
|
18
|
+
isSharkwingMission?: boolean;
|
|
19
|
+
levelOverride: string;
|
|
20
|
+
enemySpec: string;
|
|
21
|
+
advancedSpawners?: string[];
|
|
22
|
+
requiredItems?: string[];
|
|
23
|
+
consumeRequiredItems?: boolean;
|
|
24
|
+
vipAgent?: string;
|
|
25
|
+
leadersAlwaysAllowed?: boolean;
|
|
26
|
+
goalTag?: string;
|
|
27
|
+
levelAuras?: string[];
|
|
28
|
+
exclusiveWeapon: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Represents an in-game mission
|
|
32
|
+
*/
|
|
33
|
+
declare class Mission {
|
|
34
|
+
/**
|
|
35
|
+
* The mission's description
|
|
36
|
+
*/
|
|
37
|
+
description: string;
|
|
38
|
+
/**
|
|
39
|
+
* The node where the mission takes place
|
|
40
|
+
*/
|
|
41
|
+
node: string;
|
|
42
|
+
/**
|
|
43
|
+
* Unlocalized node
|
|
44
|
+
*/
|
|
45
|
+
nodeKey: string;
|
|
46
|
+
/**
|
|
47
|
+
* The mission's type
|
|
48
|
+
*/
|
|
49
|
+
type: string;
|
|
50
|
+
/**
|
|
51
|
+
* The mission's type
|
|
52
|
+
*/
|
|
53
|
+
typeKey: string;
|
|
54
|
+
/**
|
|
55
|
+
* The factions that the players must fight in the mission
|
|
56
|
+
*/
|
|
57
|
+
faction: string;
|
|
58
|
+
/**
|
|
59
|
+
* The factions that the players must fight in the mission
|
|
60
|
+
*/
|
|
61
|
+
factionKey: string;
|
|
62
|
+
/**
|
|
63
|
+
* The mission's reward
|
|
64
|
+
*/
|
|
65
|
+
reward?: Reward;
|
|
66
|
+
/**
|
|
67
|
+
* The minimum level of the enemies in the mission
|
|
68
|
+
*/
|
|
69
|
+
minEnemyLevel: number;
|
|
70
|
+
/**
|
|
71
|
+
* The maximum level of the enemies in the mission
|
|
72
|
+
*/
|
|
73
|
+
maxEnemyLevel: number;
|
|
74
|
+
/**
|
|
75
|
+
* The number of waves that the players need to complete (undefined if not applicable)
|
|
76
|
+
*/
|
|
77
|
+
maxWaveNum?: number;
|
|
78
|
+
/**
|
|
79
|
+
* The Mission's nightmare boolean
|
|
80
|
+
*/
|
|
81
|
+
nightmare: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* The Mission's archwing requirement
|
|
84
|
+
*/
|
|
85
|
+
archwingRequired: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* The Mission's sharkwing requirement
|
|
88
|
+
*/
|
|
89
|
+
isSharkwing: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Override for the map on this mission
|
|
92
|
+
*/
|
|
93
|
+
levelOverride: string;
|
|
94
|
+
/**
|
|
95
|
+
* Enemy specification for the mission
|
|
96
|
+
*/
|
|
97
|
+
enemySpec: string;
|
|
98
|
+
/**
|
|
99
|
+
* Array of strings denoting extra spawners for a mission
|
|
100
|
+
*/
|
|
101
|
+
advancedSpawners: string[];
|
|
102
|
+
/**
|
|
103
|
+
* Items required to enter the mission
|
|
104
|
+
*/
|
|
105
|
+
requiredItems: string[];
|
|
106
|
+
/**
|
|
107
|
+
* Whether or not the required items are consumed
|
|
108
|
+
*/
|
|
109
|
+
consumeRequiredItems?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Target for the mission
|
|
112
|
+
*/
|
|
113
|
+
target?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Whether or not leaders are always allowed
|
|
116
|
+
*/
|
|
117
|
+
leadersAlwaysAllowed?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* A tag for the event that this corresponds to
|
|
120
|
+
*/
|
|
121
|
+
goalTag?: string;
|
|
122
|
+
/**
|
|
123
|
+
* Affectors for this mission
|
|
124
|
+
*/
|
|
125
|
+
levelAuras: string[];
|
|
126
|
+
/**
|
|
127
|
+
* Only weapon allowed for the mission
|
|
128
|
+
*/
|
|
129
|
+
exclusiveWeapon: string;
|
|
130
|
+
/**
|
|
131
|
+
* @param data The mission data
|
|
132
|
+
* @param locale Locale to use for translations
|
|
133
|
+
*/
|
|
134
|
+
constructor(data: RawMission, {
|
|
135
|
+
locale
|
|
136
|
+
}?: Dependency);
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
18
139
|
export { Mission, RawMission };
|
|
@@ -1,5 +1,140 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import "
|
|
3
|
-
import { t as Mission } from "../../Mission-b8KP-YDf.mjs";
|
|
1
|
+
import { Reward } from "./Reward.mjs";
|
|
2
|
+
import { faction, insist, languageString, missionType, node } from "warframe-worldstate-data/utilities";
|
|
4
3
|
|
|
4
|
+
//#region lib/models/Mission.ts
|
|
5
|
+
/**
|
|
6
|
+
* Represents an in-game mission
|
|
7
|
+
*/
|
|
8
|
+
var Mission = class {
|
|
9
|
+
/**
|
|
10
|
+
* The mission's description
|
|
11
|
+
*/
|
|
12
|
+
description;
|
|
13
|
+
/**
|
|
14
|
+
* The node where the mission takes place
|
|
15
|
+
*/
|
|
16
|
+
node;
|
|
17
|
+
/**
|
|
18
|
+
* Unlocalized node
|
|
19
|
+
*/
|
|
20
|
+
nodeKey;
|
|
21
|
+
/**
|
|
22
|
+
* The mission's type
|
|
23
|
+
*/
|
|
24
|
+
type;
|
|
25
|
+
/**
|
|
26
|
+
* The mission's type
|
|
27
|
+
*/
|
|
28
|
+
typeKey;
|
|
29
|
+
/**
|
|
30
|
+
* The factions that the players must fight in the mission
|
|
31
|
+
*/
|
|
32
|
+
faction;
|
|
33
|
+
/**
|
|
34
|
+
* The factions that the players must fight in the mission
|
|
35
|
+
*/
|
|
36
|
+
factionKey;
|
|
37
|
+
/**
|
|
38
|
+
* The mission's reward
|
|
39
|
+
*/
|
|
40
|
+
reward;
|
|
41
|
+
/**
|
|
42
|
+
* The minimum level of the enemies in the mission
|
|
43
|
+
*/
|
|
44
|
+
minEnemyLevel;
|
|
45
|
+
/**
|
|
46
|
+
* The maximum level of the enemies in the mission
|
|
47
|
+
*/
|
|
48
|
+
maxEnemyLevel;
|
|
49
|
+
/**
|
|
50
|
+
* The number of waves that the players need to complete (undefined if not applicable)
|
|
51
|
+
*/
|
|
52
|
+
maxWaveNum;
|
|
53
|
+
/**
|
|
54
|
+
* The Mission's nightmare boolean
|
|
55
|
+
*/
|
|
56
|
+
nightmare;
|
|
57
|
+
/**
|
|
58
|
+
* The Mission's archwing requirement
|
|
59
|
+
*/
|
|
60
|
+
archwingRequired;
|
|
61
|
+
/**
|
|
62
|
+
* The Mission's sharkwing requirement
|
|
63
|
+
*/
|
|
64
|
+
isSharkwing;
|
|
65
|
+
/**
|
|
66
|
+
* Override for the map on this mission
|
|
67
|
+
*/
|
|
68
|
+
levelOverride;
|
|
69
|
+
/**
|
|
70
|
+
* Enemy specification for the mission
|
|
71
|
+
*/
|
|
72
|
+
enemySpec;
|
|
73
|
+
/**
|
|
74
|
+
* Array of strings denoting extra spawners for a mission
|
|
75
|
+
*/
|
|
76
|
+
advancedSpawners;
|
|
77
|
+
/**
|
|
78
|
+
* Items required to enter the mission
|
|
79
|
+
*/
|
|
80
|
+
requiredItems;
|
|
81
|
+
/**
|
|
82
|
+
* Whether or not the required items are consumed
|
|
83
|
+
*/
|
|
84
|
+
consumeRequiredItems;
|
|
85
|
+
/**
|
|
86
|
+
* Target for the mission
|
|
87
|
+
*/
|
|
88
|
+
target;
|
|
89
|
+
/**
|
|
90
|
+
* Whether or not leaders are always allowed
|
|
91
|
+
*/
|
|
92
|
+
leadersAlwaysAllowed;
|
|
93
|
+
/**
|
|
94
|
+
* A tag for the event that this corresponds to
|
|
95
|
+
*/
|
|
96
|
+
goalTag;
|
|
97
|
+
/**
|
|
98
|
+
* Affectors for this mission
|
|
99
|
+
*/
|
|
100
|
+
levelAuras;
|
|
101
|
+
/**
|
|
102
|
+
* Only weapon allowed for the mission
|
|
103
|
+
*/
|
|
104
|
+
exclusiveWeapon;
|
|
105
|
+
/**
|
|
106
|
+
* @param data The mission data
|
|
107
|
+
* @param locale Locale to use for translations
|
|
108
|
+
*/
|
|
109
|
+
constructor(data, { locale = "en" } = { locale: "en" }) {
|
|
110
|
+
const deps = { locale };
|
|
111
|
+
insist({ ...data });
|
|
112
|
+
this.description = languageString(data.descText, locale);
|
|
113
|
+
this.node = node(data.node || data.location, locale);
|
|
114
|
+
this.nodeKey = node(data.node || data.location, "en");
|
|
115
|
+
this.type = missionType(data.missionType, locale);
|
|
116
|
+
this.typeKey = missionType(data.missionType, "en");
|
|
117
|
+
this.faction = faction(data.faction, locale);
|
|
118
|
+
this.factionKey = faction(data.faction, "en");
|
|
119
|
+
this.reward = data.missionReward ? new Reward(data.missionReward, deps) : void 0;
|
|
120
|
+
this.minEnemyLevel = data.minEnemyLevel;
|
|
121
|
+
this.maxEnemyLevel = data.maxEnemyLevel;
|
|
122
|
+
this.maxWaveNum = data.maxWaveNum;
|
|
123
|
+
this.nightmare = data.nightmare || false;
|
|
124
|
+
this.archwingRequired = data.archwingRequired || false;
|
|
125
|
+
this.isSharkwing = data.isSharkwingMission || false;
|
|
126
|
+
this.levelOverride = languageString(data.levelOverride, locale);
|
|
127
|
+
this.enemySpec = languageString(data.enemySpec, locale);
|
|
128
|
+
this.advancedSpawners = (data.advancedSpawners || []).map((spawner) => languageString(spawner, locale));
|
|
129
|
+
this.requiredItems = (data.requiredItems || []).map((reqItem) => languageString(reqItem, locale));
|
|
130
|
+
this.consumeRequiredItems = data.consumeRequiredItems;
|
|
131
|
+
this.target = data.vipAgent ? languageString(data.vipAgent, locale) : void 0;
|
|
132
|
+
this.leadersAlwaysAllowed = data.leadersAlwaysAllowed;
|
|
133
|
+
this.goalTag = data.goalTag;
|
|
134
|
+
this.levelAuras = (data.levelAuras || []).map((aura) => languageString(aura, locale));
|
|
135
|
+
this.exclusiveWeapon = languageString(data.exclusiveWeapon, locale);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
//#endregion
|
|
5
140
|
export { Mission };
|