supply.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from __future__ import annotations
  2. import sys
  3. import tomllib
  4. import typing
  5. import httpx
  6. def main() -> None:
  7. planet = sys.argv[1].casefold()
  8. burn = planet_burn(planet)
  9. inventory = {item['MaterialTicker']: item['MaterialAmount'] for item in burn['Inventory']}
  10. producing = frozenset(item['MaterialTicker'] for item in burn['OrderProduction'])
  11. for consumption in burn['OrderConsumption'] + burn['WorkforceConsumption']:
  12. ticker = consumption['MaterialTicker']
  13. if ticker in producing:
  14. continue
  15. avail = inventory.get(ticker, 0)
  16. days = avail / consumption['DailyAmount']
  17. print(f'{ticker}: {avail} ({consumption['DailyAmount']:.2f}/d) → {days:.2f} d')
  18. def planet_burn(planet: str) -> PlanetData:
  19. with open('config.toml', 'rb') as f:
  20. config = tomllib.load(f)
  21. client = httpx.Client(headers={'Authorization': config['fio_api_key']})
  22. r = client.get('https://rest.fnar.net/fioweb/burn/user/' + config['username'])
  23. r.raise_for_status()
  24. planets: list[PlanetData] = r.json()
  25. for planet_data in planets:
  26. name = planet_data['PlanetName']
  27. if name.casefold() == planet:
  28. assert planet_data['Error'] is None
  29. return planet_data
  30. raise ValueError(planet + ' not found')
  31. class PlanetData(typing.TypedDict):
  32. PlanetName: str
  33. Error: typing.Any
  34. OrderConsumption: list[Amount]
  35. WorkforceConsumption: list[Amount]
  36. Inventory: list[Inventory]
  37. OrderProduction: list[Amount]
  38. class Amount(typing.TypedDict):
  39. MaterialTicker: str
  40. DailyAmount: float
  41. class Inventory(typing.TypedDict):
  42. MaterialTicker: str
  43. MaterialAmount: int
  44. if __name__ == '__main__':
  45. main()