"""Utils to load bots and names""" import random from copy import copy from dataclasses import dataclass from .csv_utils import read_csv @dataclass() class Bot: """A record for a bot""" id: str race: str gender: str name: str rating: int = None @property def imagepath(self): """creates (relative) image name for bots avatar""" return f"bots/{self.id}.png" def __str__(self): return f"{self.id}/{self.race}/{self.gender}/{self.name}/{self.rating}" def parse(val: str): """create record from string representation""" if val is None: return Bot(id=None, race=None, gender=None, name=None) botid, race, gender, name, rating = val.split("/") return Bot(id=botid, race=race, gender=gender, name=name, rating=rating) def read_bots(filepath): """read csv data for bots""" return read_csv(filepath, {"id": int, "section": str, "gender": str, "race": str, "name": str}) def read_names(filepath): """read csv data of names""" return read_csv(filepath, {"gender": str, "name": str}) def merge_names(botsdata, namesdata): """merge data from bots and names where missing""" data = [] for gender in ("M", "F"): bots = [copy(d) for d in botsdata if d["gender"] == gender] names = [d["name"] for d in namesdata if d["gender"] == gender] bots_u = [d for d in bots if d["name"] == "auto"] if len(names) < len(bots_u): raise RuntimeError(f"Not enough names for bots of gender {gender}") for bot, name in zip(bots_u, names): bot["name"] = name data.extend(bots) return data def select(data, *, section): """create list of bot records from data for given section""" return [Bot(id=d["id"], race=d["race"], gender=d["gender"], name=d["name"]) for d in data if d["section"] == section]