from .base import Base, Reference from time import time from nullptr.util import * 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): self.imports:list = [] self.exports:list = [] self.exchange:list = [] self.prices:dict = {} self.last_prices:int = 0 def get_waypoint(self): return self.store.get('Waypoint', self.symbol, create=True) 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, 'tradeVolume') 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() self.record_prices(mg(d, 'tradeGoods')) def buy_price(self, resource): if resource not in self.prices: return None return self.prices[resource].buy def volume(self, resource): if resource not in self.prices: return None return self.prices[resource].volume def sellable_items(self, resources): return [r for r in resources if r in self.prices] @classmethod def ext(self): return 'mkt' def rtype(self, r): if r in self.imports: return 'I' if r in self.exports: return 'E' if r in self.exchange: return 'X' return '?' def f(self, detail=1): r = super().f(detail) if detail > 2: r += '\n' if len(self.imports) > 0: r += 'I: ' + ', '.join(self.imports) + '\n' if len(self.exports) > 0: r += 'E: ' + ', '.join(self.exports) + '\n' if len(self.exchange) > 0: r += 'X: ' + ', '.join(self.exchange) + '\n' r += '\n' for p in self.prices.values(): t = self.rtype(p['symbol']) r += f'{t} {p["symbol"]:25s} {p["sell"]:5d} {p["buy"]:5d}\n' return r