output.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from __future__ import annotations
  2. import collections
  3. import dataclasses
  4. import sys
  5. import typing
  6. import httpx
  7. from config import config
  8. def main():
  9. (username,) = sys.argv[1:]
  10. prod = httpx.get('https://api.punoted.net/v1/production/user?username=' + username,
  11. headers={'X-Data-Token': config.punoted_api_key}).raise_for_status().json()
  12. ms_in_day = 24 * 60 * 60 * 1000
  13. for line in prod:
  14. print(line['PlanetName'], f'{line["Capacity"]}×{line["Type"]}', line['Efficiency'], line['Condition'])
  15. production: dict[str, Production] = {}
  16. for order in line['Orders']:
  17. if order['CompletedPercentage'] is not None:
  18. continue
  19. for output in order['Outputs']:
  20. production[output['ProductionLineOutputId']] = Production(
  21. ticker=output['MaterialTicker'],
  22. amount=output['MaterialAmount'],
  23. duration_ms=order['DurationMs']
  24. )
  25. line_queued_time = sum(p.duration_ms for p in production.values())
  26. line_outputs: dict[str, float] = collections.defaultdict(float)
  27. for p in production.values():
  28. amount = p.amount * ms_in_day / line_queued_time * line['Capacity']
  29. line_outputs[p.ticker] += amount
  30. for ticker, amount in line_outputs.items():
  31. print(f'\t{amount}×{ticker}')
  32. @dataclasses.dataclass
  33. class Production:
  34. ticker: str
  35. amount: float
  36. duration_ms: int
  37. class ProductionLine(typing.TypedDict):
  38. PlanetName: str
  39. Type: str
  40. Capacity: int
  41. Efficiency: float
  42. Condition: float
  43. Orders: typing.Sequence[ProductionOrder]
  44. class ProductionOrder(typing.TypedDict):
  45. CompletedPercentage: float | None
  46. DurationMs: int
  47. Outputs: typing.Sequence[ProductionOutput]
  48. class ProductionOutput(typing.TypedDict):
  49. ProductionLineOutputId: str
  50. MaterialTicker: str
  51. MaterialAmount: float
  52. if __name__ == '__main__':
  53. main()