warframe-worldstate-parser
Version:
An Open parser for Warframe's Worldstate in Javascript
104 lines (103 loc) • 3.41 kB
JavaScript
import { n as __decorateMetadata, t as __decorate } from "../../decorate-BCC26nnB.mjs";
import { ExternalMission } from "../supporting/ExternalMission.mjs";
import "../supporting/index.mjs";
import { createHash } from "node:crypto";
import { Type } from "class-transformer";
import { IsArray, IsOptional, ValidateNested } from "class-validator";
import { node, nodeMissionType } from "warframe-worldstate-data/utilities";
//#region lib/models/Kuva.ts
const HOURS_2 = 72e5;
/**
* Truncate time for a semlar-provided mission
* @param mission parsed mission with re-aligned field names
*/
const truncateTime = (mission) => {
mission.expiry.setHours(mission.activation.getHours() + 1);
mission.expiry.setMinutes(4);
mission.expiry.setSeconds(0);
mission.expiry.setMilliseconds(0);
mission.activation.setMinutes(mission.activation.getMinutes() + 5.1);
};
/**
* Scrub unnecessary details from the mission
* @param mission parsed mission with re-aligned field names
*/
const scrub = (mission) => {
delete mission.solnode;
delete mission.name;
delete mission.node_type;
delete mission.tile;
delete mission.planet;
};
const hash = (str) => createHash("md5").update(str, "utf8").digest("hex");
/**
* Parse kuva & arbitration data
* @param data Data to split for kuva/arbitration
* @param locale locale to translate
* @returns Split parsed data
*/
const parse = (data, locale) => {
const parsed = {
kuva: [],
arbitration: {}
};
const now = /* @__PURE__ */ new Date();
if (!data) return void 0;
data?.forEach?.((mission) => {
const p = {
id: "",
activation: new Date(mission.start),
expiry: new Date(mission.end),
...mission.solnodedata,
node: node(mission.solnode, locale),
nodeKey: node(mission.solnode, "en"),
type: nodeMissionType(mission.solnode, locale),
typeKey: nodeMissionType(mission.solnode, "en"),
expired: false,
archwing: mission.solnodedata?.archwing ?? false,
sharkwing: mission.solnodedata?.sharkwing ?? false
};
truncateTime(p);
p.id = hash(JSON.stringify(p));
p.expired = Date.now() - p.expiry.getTime() < 0;
if (p.activation < now && now < p.expiry && new Date(p.activation.getTime() + HOURS_2) > now && /* @__PURE__ */ new Date(p.expiry.getTime() - HOURS_2) < now) {
if (mission.missiontype === "EliteAlertMission") parsed.arbitration = p;
if (mission.missiontype?.startsWith("KuvaMission")) parsed.kuva.push(p);
}
scrub(p);
});
parsed.kuva = Array.from(new Set(parsed.kuva));
return parsed;
};
/**
* Stores and parses kuva data from https://10o.io/kuvalog.json
* @property {ExternalMission[]} kuva currently active kuva missions
* @property {ExternalMission} arbitration current arbitration
*/
var Kuva = class {
kuva;
arbitration;
constructor({ kuvaData, locale, logger }) {
if (!kuvaData) logger?.debug("No defined kuva data, skipping data");
else {
const parsed = parse(kuvaData, locale);
this.kuva = parsed?.kuva;
this.arbitration = parsed?.arbitration;
}
}
};
__decorate([
IsOptional(),
IsArray(),
ValidateNested({ each: true }),
Type(() => ExternalMission),
__decorateMetadata("design:type", Array)
], Kuva.prototype, "kuva", void 0);
__decorate([
IsOptional(),
ValidateNested(),
Type(() => ExternalMission),
__decorateMetadata("design:type", typeof ExternalMission === "undefined" ? Object : ExternalMission)
], Kuva.prototype, "arbitration", void 0);
//#endregion
export { Kuva };