popi_reimbursement.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from __future__ import annotations
  2. import sys
  3. import typing
  4. import cache
  5. from config import config
  6. def main() -> None:
  7. planet = sys.argv[1]
  8. print('getting prices...')
  9. prices = get_prices()
  10. print('\r')
  11. infras: typing.Sequence[Infrastructure] = cache.get(
  12. 'https://api.fnar.net/infrastructure?include_contributions=true&infrastructure=' + planet)
  13. for infra in infras:
  14. print(infra['Type'])
  15. for contribution in infra['Contributions']:
  16. if contribution['ContributerName'] != config.username:
  17. continue
  18. print('\t' + contribution['Time'])
  19. for mat in contribution['Materials']:
  20. price = prices[mat['Ticker']]
  21. print(f'\t\t{mat["Ticker"]} {mat["Amount"]} @ {price} = {mat["Amount"] * price}')
  22. def get_prices() -> typing.Mapping[str, float]:
  23. cxos_users: typing.Mapping = cache.get('https://api.fnar.net/cx/cxos/?username=' + config.username,
  24. headers={'Authorization': 'FIOAPIKey ' + config.fio_api_key})
  25. (cxos_user,) = cxos_users['UserNameToData'].values()
  26. cxos: list[CXOSOrder] = cxos_user['Data']
  27. cxos.reverse()
  28. prices: dict[str, float] = {}
  29. for order in cxos:
  30. if order['OrderType'] == 'BUYING' and order['Status'] == 'FILLED':
  31. prices[order['MaterialTicker']] = order['LimitAmount']
  32. return prices
  33. class Infrastructure(typing.TypedDict):
  34. Type: str
  35. Contributions: typing.Sequence[Contribution]
  36. class Contribution(typing.TypedDict):
  37. ContributerName: str
  38. Time: str
  39. Materials: typing.Sequence[Material]
  40. class Material(typing.TypedDict):
  41. Ticker: str
  42. Amount: int
  43. class CXOSOrder(typing.TypedDict):
  44. OrderType: typing.Literal['BUYING', 'SELLING']
  45. Status: typing.Literal['PLACED', 'PARTIALLY_FILLED', 'FILLED']
  46. MaterialTicker: str
  47. LimitAmount: float
  48. if __name__ == '__main__':
  49. main()