historical marketprices
api.py
This commit is contained in:
parent
08ab3f0999
commit
188ef320cc
@ -3,6 +3,7 @@ from nullptr.models.jumpgate import Jumpgate
|
||||
from nullptr.models.system import System
|
||||
from nullptr.models.waypoint import Waypoint
|
||||
from dataclasses import dataclass
|
||||
from nullptr.util import pprint
|
||||
from copy import copy
|
||||
|
||||
class AnalyzerException(Exception):
|
||||
@ -109,6 +110,7 @@ class Analyzer:
|
||||
mkts = [m.waypoint for m in self.store.all_members(orig.system, Marketplace)]
|
||||
cur = orig
|
||||
if orig == to:
|
||||
|
||||
return []
|
||||
while cur != to:
|
||||
best = cur
|
||||
@ -157,8 +159,8 @@ class Analyzer:
|
||||
prices[r] = []
|
||||
prices[r].append({
|
||||
'wp': m.waypoint,
|
||||
'buy': p['buy'],
|
||||
'sell': p['sell']
|
||||
'buy': p.buy,
|
||||
'sell': p.sell
|
||||
})
|
||||
return prices
|
||||
|
||||
|
@ -121,6 +121,7 @@ class Api:
|
||||
units = min(units, fuel_avail)
|
||||
data = {'fromCargo': from_cargo, 'units': units }
|
||||
data = self.request('post', f'my/ships/{ship}/refuel', data)
|
||||
self.log_transaction(data)
|
||||
if from_cargo:
|
||||
boxes = ceil(float(units) / 100)
|
||||
ship.take_cargo('FUEL', boxes)
|
||||
@ -236,7 +237,18 @@ class Api:
|
||||
result = self.store.update_list('Survey', mg(data, 'surveys'))
|
||||
return result
|
||||
|
||||
|
||||
######## Commerce #########
|
||||
def log_transaction(self, data):
|
||||
if not 'transaction' in data: return
|
||||
typ = mg(data, 'transaction.tradeSymbol')
|
||||
ppu = mg(data, 'transaction.pricePerUnit')
|
||||
shipsym = mg(data, 'transaction.shipSymbol')
|
||||
ship = self.store.get('Ship', shipsym)
|
||||
units = mg(data, 'transaction.units')
|
||||
act = mg(data,'transaction.type')
|
||||
ship.log(f'{act} {units} of {typ} for {ppu} at {ship.location}')
|
||||
|
||||
def sell(self, ship, typ,units=None):
|
||||
if units is None:
|
||||
units = ship.get_cargo(typ)
|
||||
@ -245,7 +257,7 @@ class Api:
|
||||
'units': units
|
||||
}
|
||||
data = self.request('post', f'my/ships/{ship}/sell', data)
|
||||
ship.log(f'sell {units} of {typ}')
|
||||
self.log_transaction(data)
|
||||
if 'cargo' in data:
|
||||
ship.update(data)
|
||||
if 'agent' in data:
|
||||
@ -258,7 +270,7 @@ class Api:
|
||||
'units': amt
|
||||
}
|
||||
data = self.request('post', f'my/ships/{ship}/purchase', data)
|
||||
ship.log(f'buy {amt} of {typ} at {ship.location}')
|
||||
self.log_transaction(data)
|
||||
if 'cargo' in data:
|
||||
ship.update(data)
|
||||
if 'agent' in data:
|
||||
|
@ -184,7 +184,7 @@ class Commander(CommandLine):
|
||||
for w in r:
|
||||
|
||||
wname = w.symbol.split('-')[2]
|
||||
traits = ", ".join(w.traits())
|
||||
traits = ", ".join(w.itraits())
|
||||
typ = w.type[0]
|
||||
if typ not in ['F','J'] and len(traits) == 0:
|
||||
continue
|
||||
@ -542,3 +542,9 @@ class Commander(CommandLine):
|
||||
pprint(prices[resource.upper()])
|
||||
else:
|
||||
pprint(prices)
|
||||
|
||||
def do_path(self, waypoint_str):
|
||||
if not self.has_ship(): return
|
||||
w = self.resolve('Waypoint', waypoint_str)
|
||||
p = self.analyzer.find_nav_path(self.ship.location, w, self.ship.fuel_capacity)
|
||||
pprint(p)
|
||||
|
@ -36,6 +36,9 @@ class Base:
|
||||
def __getstate__(self):
|
||||
return {k:v for k,v in self.__dict__.items() if not k.startswith('_')}
|
||||
|
||||
def dirty(self):
|
||||
self.store.dirty(self)
|
||||
|
||||
@classmethod
|
||||
def ext(cls):
|
||||
raise NotImplementedError('no ext')
|
||||
|
@ -2,8 +2,28 @@
|
||||
from .base import Base
|
||||
from time import time
|
||||
from nullptr.util import *
|
||||
from dataclasses import field
|
||||
from dataclasses import field, dataclass
|
||||
from nullptr.models import Waypoint
|
||||
from typing import List, Tuple
|
||||
|
||||
SUPPLY = ['SCARCE','LIMITED','MODERATE','HIGH','ABUNDANT']
|
||||
ACTIVITY =['RESTRICTED','WEAK','GROWING','STRONG']
|
||||
class MarketEntry:
|
||||
buy: int
|
||||
sell: int
|
||||
volume: int
|
||||
supply: int
|
||||
activity: int
|
||||
history: List[Tuple[int, int, int, int, int, int]] = []
|
||||
|
||||
def add(self, buy, sell, volume, supply, activity):
|
||||
self.buy = buy
|
||||
self.sell = sell
|
||||
self.volume = volume
|
||||
self.supply = supply
|
||||
self.activity = activity
|
||||
self.history.append((int(time()), buy, sell, volume, supply, activity))
|
||||
|
||||
|
||||
class Marketplace(Base):
|
||||
def define(self):
|
||||
@ -22,22 +42,28 @@ class Marketplace(Base):
|
||||
def is_fuel(self):
|
||||
return self.imports + self.exports + self.exchange == ['FUEL']
|
||||
|
||||
def record_prices(self, data):
|
||||
for g in data:
|
||||
symbol= mg(g, 'symbol')
|
||||
if symbol in self.prices:
|
||||
e = self.prices[symbol]
|
||||
else:
|
||||
e = self.prices[symbol] = MarketEntry()
|
||||
buy = mg(g, 'purchasePrice')
|
||||
sell = mg(g, 'sellPrice')
|
||||
volume = mg(g, 'tradeVolumes')
|
||||
supply = SUPPLY.index(mg(g, 'supply'))
|
||||
activity = ACTIVITY.index(sg(g, 'activity','STRONG'))
|
||||
e.add(buy, sell, volume, supply, activity)
|
||||
self.dirty()
|
||||
|
||||
def update(self, d):
|
||||
self.setlst('imports', d, 'imports', 'symbol')
|
||||
self.setlst('exports', d, 'exports', 'symbol')
|
||||
self.setlst('exchange', d, 'exchange', 'symbol')
|
||||
if 'tradeGoods' in d:
|
||||
self.last_prices = time()
|
||||
prices = {}
|
||||
for g in mg(d, 'tradeGoods'):
|
||||
price = {}
|
||||
symbol= mg(g, 'symbol')
|
||||
price['symbol'] = symbol
|
||||
price['buy'] = mg(g, 'purchasePrice')
|
||||
price['sell'] = mg(g, 'sellPrice')
|
||||
price['volume'] = mg(g, 'tradeVolume')
|
||||
prices[symbol] = price
|
||||
self.prices = prices
|
||||
self.record_prices(mg(d, 'tradeGoods'))
|
||||
|
||||
def buy_price(self, resource):
|
||||
if resource not in self.prices:
|
||||
|
@ -32,7 +32,7 @@ class Waypoint(Base):
|
||||
def ext(self):
|
||||
return 'way'
|
||||
|
||||
def traits(self):
|
||||
def itraits(self):
|
||||
traits = []
|
||||
if self.type == 'JUMP_GATE':
|
||||
traits.append('JUMP')
|
||||
@ -55,3 +55,8 @@ class Waypoint(Base):
|
||||
traits.append('STRIPPED')
|
||||
return traits
|
||||
|
||||
def f(self, detail=1):
|
||||
r = self.symbol
|
||||
if detail > 3:
|
||||
r += f'\n{self.x} {self.y}'
|
||||
return r
|
Loading…
Reference in New Issue
Block a user