liars-dice/pirate_names_generator.py

59 lines
1.7 KiB
Python

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]