from __future__ import annotations import collections import json import math import sys import typing import cache from config import config import market import supply if typing.TYPE_CHECKING: import supply def main() -> None: (ship,) = sys.argv[1:] ship_inventory = get_ship_storage(ship) warehouse_inventory = supply.warehouse_inventory() raw_prices: typing.Mapping[str, market.RawPrice] = {p['MaterialTicker']: p for p in cache.get('https://refined-prun.github.io/refined-prices/all.json') if p['ExchangeCode'] == 'IC1'} consumption = get_consumption() to_sell: dict[str, int] = {} price_limits: dict[str, int] = {} for item in ship_inventory: if item['Type'] == 'SHIPMENT': continue ticker = item['MaterialTicker'] print(f'{item["MaterialAmount"]:5} {ticker:3}:', end=' ') have = item['MaterialAmount'] + warehouse_inventory.get(ticker, 0) need = math.ceil(consumption.get(ticker, 0) * 14) sell = min(have - need, item['MaterialAmount']) keep = item['MaterialAmount'] - sell if sell > 0: print('sell', sell, end=' ') to_sell[ticker] = sell ask = raw_prices[ticker]['Ask'] if ask is None: print('(NO ASK)', end=' ') else: epsilon = 10 ** (int(math.log10(ask)) - 2) price_limits[ticker] = ask - 2 * epsilon if keep > 0: print('keep', keep, end= ' ') print() print('\n' + json.dumps({ 'global': {'name': 'sell ' + ship}, 'groups': [{'type': 'Manual', 'name': 'A1', 'materials': to_sell}], 'actions': [ {'name': 'sell', 'type': 'CX Sell', 'group': 'A1', 'exchange': 'IC1', 'origin': ship + ' Cargo', 'priceLimits': price_limits, 'sellPartial': True, 'allowUnfilled': True}, ], })) def get_ship_storage(ship_name: str) -> typing.Sequence[market.StorageItem]: ship_name = ship_name.casefold() stores: typing.Sequence[market.Storage] = cache.get('https://rest.fnar.net/storage/' + config.username, headers={'Authorization': config.fio_rest_key}) for store in stores: if store['Type'] == 'SHIP_STORE' and store['Name'].casefold() == ship_name: return store['StorageItems'] raise Exception(f'ship storage {ship_name} not found') def get_consumption() -> typing.Mapping[str, float]: '''get consumption on planets that consume each mat''' planets = [supply.Planet(fio_burn) for fio_burn in cache.get('https://rest.fnar.net/fioweb/burn/user/' + config.username, headers={'Authorization': config.fio_rest_key})] consumption: dict[str, float] = collections.defaultdict(float) for planet in planets: supply_config = config.supply_config(planet.name) for mat, amount in planet.net_consumption.items(): if mat not in supply_config.ignore_materials and amount > 0: consumption[mat] += amount return consumption if __name__ == '__main__': main()