"""Class and functions for storing and retrieving highscores data.""" import os import json from data.guild import Guild # pylint: disable=import-error HIGHSCORES_BACKUP_DIR = "deleted_backups" HIGHSCORES_CONFIG_DIR = "examples" HIGHSCORES_DATA_DIR = "highscores_data" class HighscoresData: """Class for storing and retrieving highscores data.""" def __init__(self) -> None: """ Default constructor for Highscores Data. Opens up known highscores data on creation. """ self._guild_map: dict = {} # Ensure that data directories exist. if not os.path.exists(HIGHSCORES_BACKUP_DIR): os.mkdir(HIGHSCORES_BACKUP_DIR) if not os.path.exists(HIGHSCORES_DATA_DIR): os.mkdir(HIGHSCORES_DATA_DIR) self.open_highscores_data() def __str__(self) -> str: """ Returns Highscores class as a string for printing. Returns: str: Highscores class as a string """ data: dict = {} for guild_id, guild_obj in self._guild_map.items(): data[guild_id] = guild_obj.to_dict() return "Highscores Data\n" + json.dumps(data, indent=4) @property def guilds(self) -> "list[Guild]": """ Getter for Guilds list. Returns: list[Guild]: List of Guilds tracked by Highscores Bot """ def add_guild(self, guild_id: int) -> None: """ Creates a new Guild and adds to Guild map. Args: guild_id (int): Guild Id to add """ guild: Guild = Guild(guild_id) self._guild_map[guild_id] = guild def remove_guild(self, guild_id: int) -> None: """ Removes a guild's data from object. Saves backup. Args: guild_id (int): guild id to remove """ self._guild_map.pop(guild_id) os.rename( f"{HIGHSCORES_DATA_DIR}/{guild_id}.json", f"{HIGHSCORES_BACKUP_DIR}/{guild_id}.json" ) def open_highscores_config(self, config: str) -> dict: """ Opens the highscores config file and returns in dictionary format. Will be replaced when config class is created. Args: config (str): Name of config to load. Returns: dict: dict of highscores config """ with open(f"{HIGHSCORES_CONFIG_DIR}/{config}.json", encoding="utf-8", mode="r") as file: return json.load(file) def open_highscores_data(self): """ Opens all saved highscores data in the HIGHSCORES_DATA_DIR dir. Creates a Guild object from each file and adds to guild map. """ for data_file in os.listdir(HIGHSCORES_DATA_DIR): guild_id: int = int(data_file.split(".", maxsplit=1)[0]) with open(f"{HIGHSCORES_DATA_DIR}/{data_file}", encoding="utf-8", mode="r") as file: guild_obj: Guild = Guild.from_dict(guild_id, json.load(file)) self._guild_map[guild_obj.guild_id] = guild_obj def save_highscores_data(self): """ Saves each Guild object into its own json data file. """ for guild_id, guild_obj in self._guild_map.items(): with open(f"{HIGHSCORES_DATA_DIR}/{guild_id}.json", encoding="utf-8", mode="w") as file: file.write(guild_obj) # should use str function