59 lines
1.7 KiB
Python
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]
|