planet_bases.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from __future__ import annotations
  2. import concurrent.futures
  3. import typing
  4. import tap
  5. import cache
  6. class Args(tap.Tap):
  7. planets: list[str]
  8. sector: tuple[str, ...] = ()
  9. def configure(self) -> None:
  10. self.add_argument('planets', nargs='+', metavar='planet') # take planets as positional args instead of flag
  11. def main() -> None:
  12. args = Args().parse_args()
  13. if args.sector:
  14. all_planets: typing.Sequence[Planet] = cache.get('https://rest.fnar.net/planet/allplanets')
  15. for planet in all_planets:
  16. if planet['PlanetNaturalId'].startswith(args.sector):
  17. args.planets.append(planet['PlanetName'])
  18. with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
  19. for planet, bases in zip(args.planets, executor.map(get_bases, args.planets)):
  20. print(planet)
  21. for base in bases:
  22. if base['OwnerCode'] is None:
  23. continue
  24. print(f'\t{base["OwnerCode"]}\t{base["OwnerName"]}')
  25. def get_bases(planet: str) -> typing.Sequence[Site]:
  26. return cache.get('https://rest.fnar.net/planet/sites/' + planet)
  27. class Planet(typing.TypedDict):
  28. PlanetNaturalId: str
  29. PlanetName: str
  30. class Site(typing.TypedDict):
  31. OwnerName: int
  32. OwnerCode: str | None
  33. if __name__ == '__main__':
  34. main()