Implemented a basic extraction loop
This commit is contained in:
parent
f190aea975
commit
efdf50a55a
12 changed files with 2022 additions and 0 deletions
72
lib/agent.js
Normal file
72
lib/agent.js
Normal file
|
@ -0,0 +1,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));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue