summaryrefslogtreecommitdiff
path: root/lib/agent.js
blob: ca9da0d1baa556ea3abf1aabc4bdc0f4752002b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { registerAgent } from '../database/config.js';
import * as api from './api.js';
import * as ships from './ships.js';

// This starts an extraction loop with a ship which ends when the ship's cargo is at least 90% full with only one desired good
// ctx must must have two attributes: `ship` and `good`
export function extract(ctx, response) {
	if (response !== undefined) {
		if (response.error !== undefined) {
			switch(response.error.code) {
			case 4000: // ship is on cooldown
				setTimeout(extract, response.error.data.cooldown.remainingSeconds  * 1000, ctx);
				return;
			case 4228: // ship is full. Running the ship inventory function to list the cargo so that know if we need to sell
				ships.ship({ship: ctx.ship, next:{action: extract, ship: ctx.ship, good: ctx.good}});
				return;
			default:
				throw response;
			}
		}
		if (response.data.extraction !== undefined && response.data.extraction.yield !== undefined) { // yield won't be defined if we reached this point from an inventory request
			console.log(`${ctx.ship}: extracted ${response.data.extraction.yield.units} of ${response.data.extraction.yield.symbol}`);
		}
		if (response.data.cargo !== undefined && response.data.cargo.capacity * 0.9 <= response.data.cargo.units) { // > 90% full
			const good = response.data.cargo.inventory.filter(i => i.symbol === ctx.good)[0];
			const inventory = response.data.cargo.inventory.filter(i => i.symbol !== ctx.good);
			if (good?.units >= response.data.cargo.capacity * 0.9) { // > 90% full
				console.log(`ship's cargo is full with ${response.data.cargo.units} of ${ctx.good}!`);
				return;
			}
			let actions = [{ action: ships.dock, ship: ctx.ship }];
			inventory.forEach(i => actions.push({action: ships.sell, ship: ctx.ship, good: i.symbol, units: i.units}));
			actions.push({action: ships.orbit, ship: ctx.ship});
			actions.push({action: extract, ship: ctx.ship, good: ctx.good});
			api.chain(actions);
			return;
		} else { // we need to mine more
			if (response.data.cooldown) { // we are on cooldown, call ourselves again in a moment
				setTimeout(extract, response.data.cooldown.remainingSeconds  * 1000, ctx);
				return;
			}
		}
	}
	ships.extract({ship: ctx.ship, good: ctx.good, next: { action: extract, ship: ctx.ship, good: ctx.good }});
}

// This function inits the database in case we have an already registered game
export function init(symbol, faction, token) {
	registerAgent(symbol, faction, token);
}

// This function registers then inits the database
export function register(symbol, faction) {
	fetch(
		'https://api.spacetraders.io/v2/register',
		{
			method: 'POST',
			headers: {
				'Content-Type': 'application/json',
			},
			body: JSON.stringify({
				symbol: symbol,
				faction: faction,
			}),
		})
		.then(response => response.json())
		.then(response => {
			console.log(JSON.stringify(response, null, 2));
			init(symbol, faction, response.data.token);
		})
		.catch(err => console.error(err));
}