import sys from dataclasses import dataclass import random import requests @dataclass(frozen=True) class PirateName: first_name: str last_name: str nickname: str def __str__(self): return f'{self.first_name} "{self.nickname}" {self.last_name}' def _get_local_names(num_names: int) -> list[str]: return [f"Bot #{n}" for n in range(1, num_names + 1)] def get_names(num_names: int, prefer_local: bool) -> list[str]: if prefer_local: return _get_local_names(num_names) num_female = random.randint(1, num_names) num_male = num_names - num_female pirate_names = [] for is_male in (True, False): gender = "male" if is_male else "female" url = f"https://story-shack-cdn-v2.glitch.me/generators/pirate-name-generator/{gender}" count = num_male if is_male else num_female if count == 0: continue # Seems like the API doesn't handle the case "count == 1" too well and crashes. Just generate 2 if only is # needed. resp = requests.get(url=url, params={"count": count if count != 1 else 2}) if not resp.ok: print(f"Failed to generate bot names:\n\n{resp.text}\n", file=sys.stderr) return [f"Bot #{n}" for n in range(1, num_names + 1)] for i, n in enumerate(resp.json()["data"]): if i == count: break pirate_names.append( PirateName( first_name=n["name"], last_name=n["lastName"], nickname=n["nicknameMale"].strip("'") if is_male else n["nicknameFemale"].strip("'"), ), ) return [str(p) for p in pirate_names]