warframe-worldstate-parser
Version:
An Open parser for Warframe's Worldstate in Javascript
135 lines (114 loc) • 3.98 kB
JavaScript
import { fromNow, parseDate, timeDeltaToString, node, insist } from 'warframe-worldstate-data/utilities';
import mdConfig from '../supporting/MarkdownSettings.js';
import WorldstateObject from './WorldstateObject.js';
import VoidTraderItem from './VoidTraderItem.js';
import VoidTraderSchedule from './VoidTraderSchedule.js';
/**
* Represents a void trader
* @augments {WorldstateObject}
*/
export default class VoidTrader extends WorldstateObject {
/**
* @param {object} data The Void trader data
* @param {object} deps The dependencies object
* @param {string} deps.locale Locale to use for translations
*/
constructor(data, { locale = 'en' } = { locale: 'en' }) {
super(data);
insist(data, 'Activation', 'Expiry');
/**
* The date and time at which the void trader arrives
* @type {Date}
*/
this.activation = parseDate(data.Activation);
/**
* The date and time at which the void trader leaves
* @type {Date}
*/
this.expiry = parseDate(data.Expiry);
/**
* The void trader's name
* @type {string}
*/
this.character = data.Character ? data.Character.replace("Baro'Ki Teel", "Baro Ki'Teer") : '';
/**
* The node at which the Void Trader appears
* @type {string}
*/
this.location = node(data.Node, locale);
/**
* The trader's inventory
* @type {VoidTraderItem[]}
*/
this.inventory = data.Manifest ? data.Manifest.map((i) => new VoidTraderItem(i, { locale })) : [];
/**
* Pseudo Identifier for identifying changes in inventory
* @type {string}
*/
this.psId = `${this.id}${this.inventory.length}`;
/**
* Whether or not the void trader is active (at time of object creation)
* @type {boolean}
*/
this.active = this.isActive();
/**
* A string indicating how long it will take for the trader to arrive
* (at time of object creation)
* @type {string}
*/
this.startString = this.getStartString();
/**
* A string indicating how long it will take for the trader to leave
* (at time of object creation)
* @type {string}
*/
this.endString = this.getEndString();
this.initialStart = parseDate(data.InitialStartDate);
this.completed = data.Completed;
this.schedule = data.ScheduleInfo ? data.ScheduleInfo.map((i) => new VoidTraderSchedule(i, { locale })) : [];
}
/**
* Get whether or not the trader is currently active
* @returns {boolean} whether the trader is active
*/
isActive() {
return fromNow(this.activation) < 0 && fromNow(this.expiry) > 0;
}
/**
* Get a string indicating how long it will take for the trader to arrive
* @returns {string} time delta string from now to the start
*/
getStartString() {
return timeDeltaToString(fromNow(this.activation));
}
/**
* Get a string indicating how long it will take for the trader to leave
* @returns {string} time delta string from now to the end
*/
getEndString() {
return timeDeltaToString(fromNow(this.expiry));
}
/**
* Returns a string representation of the trader
* @returns {string} string representation
*/
toString() {
if (!this.isActive()) {
const timeDelta = fromNow(this.activation);
const nextArrivalTime = timeDeltaToString(timeDelta);
return (
`${mdConfig.codeBlock}${this.character} is not here yet, he will arrive in ` +
`${nextArrivalTime} at ${this.location}${mdConfig.blockEnd}`
);
}
const inventoryString = this.inventory
.map((i) => ` ${i.item} - ${i.ducats} ducats + ${i.credits}cr%s`)
.join(mdConfig.lineEnd);
const lines = [
`${mdConfig.codeBlock}Void Trader at ${this.location}`,
inventoryString,
`Trader departing in ${this.getEndString()}${mdConfig.blockEnd}`,
];
return lines.join(mdConfig.lineEnd);
}
}