| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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()
|