mat_competitors.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import annotations
  2. import collections
  3. import json
  4. import sys
  5. import typing
  6. import cache
  7. import company
  8. import integration
  9. import planet_bases
  10. def main() -> None:
  11. cx, ticker = sys.argv[1:]
  12. (expertise,) = iter_expertise(ticker)
  13. with open('www/closest.json') as f:
  14. planet_ids = {planet_id for planet_id, closest_cx in json.load(f).items() if closest_cx == cx}
  15. all_planets: typing.Collection[company.Planet] = cache.get('https://universemap.taiyibureau.de/planet_data.json')
  16. planets = []
  17. for planet in all_planets:
  18. if planet['PlanetId'] not in planet_ids:
  19. continue
  20. if len(cogcs := planet['COGCPrograms']) > 1:
  21. cogcs.sort(key=lambda c: c['StartEpochMs'], reverse=True)
  22. cogc = cogcs[1]['ProgramType']
  23. if cogc is not None and cogc.removeprefix('ADVERTISING_') == expertise:
  24. planets.append(planet['PlanetName'])
  25. print(len(planets), expertise, 'planets near', cx)
  26. coid_code: dict[str, str] = {}
  27. coid_bases = collections.defaultdict(list)
  28. for planet in planets:
  29. print('\t' + planet)
  30. bases = planet_bases.get_bases(planet)
  31. for base in bases:
  32. if (code := base['OwnerCode']) is None:
  33. continue
  34. coid_code[base['OwnerId']] = code
  35. coid_bases[base['OwnerId']].append(planet)
  36. coid_users: dict[str, str] = {company_id: d['Username']
  37. for company_id, d in cache.get('https://pmmg-products.github.io/reports/data/knownCompanies.json').items()}
  38. for company_id, co_production in integration.pmmg_monthly_report().items():
  39. if (mat_production := co_production.get(ticker)) is None:
  40. continue
  41. if bases := coid_bases.get(company_id):
  42. code = coid_code[company_id]
  43. username = coid_users[company_id]
  44. print(f'{code}\t{username}')
  45. print(f'{mat_production["amount"]:10.1f}', ', '.join(bases))
  46. def iter_expertise(ticker: str) -> typing.Iterator[str]:
  47. buildings: typing.Sequence[company.Building] = cache.get('https://rest.fnar.net/building/allbuildings')
  48. for building in buildings:
  49. for recipe in building['Recipes']:
  50. for output in recipe['Outputs']:
  51. if output['CommodityTicker'] == ticker:
  52. print(ticker, 'requires', building['Expertise'])
  53. yield building['Expertise']
  54. if __name__ == '__main__':
  55. main()