mat_competitors.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from __future__ import annotations
  2. import collections
  3. import dataclasses
  4. import json
  5. import sys
  6. import typing
  7. import cache
  8. import company
  9. import integration
  10. import planet_bases
  11. def main() -> None:
  12. cx, ticker = sys.argv[1:]
  13. (expertise,) = iter_expertise(ticker)
  14. with open('www/closest.json') as f:
  15. planet_ids = {planet_id for planet_id, closest_cx in json.load(f).items() if closest_cx == cx}
  16. planets = []
  17. for planet, cogc in company.iter_planet_cogc():
  18. if planet['PlanetId'] in planet_ids and cogc == expertise:
  19. planets.append(planet['PlanetName'])
  20. print(len(planets), expertise, 'planets near', cx)
  21. coid_code_name: dict[str, tuple[str, str]] = {}
  22. coid_bases = collections.defaultdict(list)
  23. for planet in planets:
  24. print('\t' + planet)
  25. bases = planet_bases.get_bases(planet)
  26. for base in bases:
  27. if (code := base['OwnerCode']) is None:
  28. continue
  29. coid_code_name[base['OwnerId']] = code, base['OwnerName']
  30. coid_bases[base['OwnerId']].append(planet)
  31. coid_users: dict[str, str] = {company_id: d['Username']
  32. for company_id, d in cache.get('https://pmmg-products.github.io/reports/data/knownCompanies.json', expiry=cache.ONE_DAY).items()}
  33. competitors: list[Competitor] = []
  34. for company_id, co_production in integration.pmmg_monthly_report().items():
  35. if (mat_production := co_production.get(ticker)) is None:
  36. continue
  37. if bases := coid_bases.get(company_id):
  38. code, co_name = coid_code_name[company_id]
  39. username = coid_users[company_id]
  40. competitors.append(Competitor(code, co_name, username, mat_production['amount'], bases))
  41. competitors.sort(reverse=True)
  42. total = 0.0
  43. for c in competitors:
  44. print(f'{c.code:4} {c.company_name:30} {c.username:20} {c.production:9,.1f}', ', '.join(c.bases))
  45. total += c.production
  46. print(f'total: {total:,.1f}')
  47. def iter_expertise(ticker: str) -> typing.Iterator[str]:
  48. buildings: typing.Sequence[company.Building] = cache.get('https://rest.fnar.net/building/allbuildings', expiry=cache.ONE_DAY)
  49. for building in buildings:
  50. for recipe in building['Recipes']:
  51. for output in recipe['Outputs']:
  52. if output['CommodityTicker'] == ticker:
  53. print(ticker, 'requires', building['Expertise'])
  54. yield building['Expertise']
  55. @dataclasses.dataclass(eq=False, frozen=True, slots=True)
  56. class Competitor:
  57. code: str
  58. company_name: str
  59. username: str
  60. production: float
  61. bases: typing.Sequence[str]
  62. def __lt__(self, other: Competitor) -> bool:
  63. return self.production < other.production
  64. if __name__ == '__main__':
  65. main()