From d668eac4a63a9aa98c3efff395faa23cfcea1c1b Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 21 Mar 2024 17:08:37 +0100 Subject: [node] begin the great typescript rewrite --- nodejs/automation/contracting.ts | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 nodejs/automation/contracting.ts (limited to 'nodejs/automation/contracting.ts') diff --git a/nodejs/automation/contracting.ts b/nodejs/automation/contracting.ts new file mode 100644 index 0000000..2857778 --- /dev/null +++ b/nodejs/automation/contracting.ts @@ -0,0 +1,72 @@ +import { Contract } from '../model/contract.ts'; +import { Ship } from '../model/ship.ts'; +import * as mining from './mining.js'; +import * as selling from './selling.js'; +import * as dbContracts from '../database/contracts.ts'; +import * as dbShips from '../database/ships.ts'; +import * as api from '../lib/api.ts'; +import * as contracts from '../lib/contracts.ts'; +import * as libShips from '../lib/ships.ts'; +import * as systems from '../lib/systems.ts'; +import * as utils from '../lib/utils.ts'; + +export async function init() { + const cs = dbContracts.getContracts(); + cs.forEach(contract => run(contract)); +} + +async function run(contract: Contract) { + await contracts.accept(contract); + const contractSystem = utils.systemFromWaypoint(contract.terms.deliver[0].destinationSymbol); + let ships = dbShips.getShipsAt(contractSystem); + ships = ships.filter(ship => ship.registration.role !== 'SATELLITE'); // filter out probes + + switch(contract.type) { + case 'PROCUREMENT': + await runProcurement(contract, ships); + break; + default: + throw `Handling of contract type ${contract.type} is not implemented yet`; + } +} + +async function runProcurement(contract: Contract, ships: Array) { + // TODO check if contract is fulfilled! + const wantedCargo = contract.terms.deliver[0].tradeSymbol; + const deliveryPoint = contract.terms.deliver[0].destinationSymbol; + const asteroids = await systems.type({symbol: ships[0].nav.systemSymbol, type: 'ENGINEERED_ASTEROID'}); + const asteroidSymbol = asteroids[0].symbol; + ships.forEach(async function(ship) { + while (!contract.fulfilled) { + ship = dbShips.getShip(ship.symbol) as Ship; + let goodCargo = ship.cargo.inventory.filter(i => i.symbol === wantedCargo)[0] + // If we are in transit, we wait until we arrive + const delay = new Date(ship.nav.route.arrival).getTime() - new Date().getTime(); + if (delay > 0) await api.sleep(delay); + // Then it depends on where we are + switch (ship.nav.waypointSymbol) { + case asteroidSymbol: + await mining.mineUntilFullOf({ + asteroidSymbol: asteroidSymbol, + good: wantedCargo, + symbol: ship.symbol + }); + await libShips.navigate(ship, deliveryPoint); + break; + case deliveryPoint: + if (goodCargo !== undefined) { // we could be here if a client restart happens right after selling before we navigate away + console.log(`delivering ${goodCargo.units} of ${wantedCargo}`); + contract = await contracts.deliver(contract, ship); + if (contract.fulfilled) break; + } + await libShips.navigate(ship, asteroidSymbol); + break; + default: + // we were either selling or started contracting + await selling.sell(ship, wantedCargo); + await libShips.navigate(ship, asteroidSymbol); + } + } + // TODO repurpose the ship + }); +} -- cgit v1.2.3