output.py 2.1 KB

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