import sys from datetime import datetime from decimal import Decimal from pathlib import Path import logging import tomllib from from_root import from_root from elm.types.ConfigurationTypes import MailingServiceConfiguration, LanInfo, ReceiptPrintingConfiguration, DatabaseConfiguration, PayPalConfiguration, TicketInfo logger = logging.getLogger(__name__.split(".")[-1]) logger.setLevel(logging.DEBUG) class ConfigurationService: def __init__(self, config_file_path: Path) -> None: try: with open(from_root("VERSION"), "r") as version_file: self._version = version_file.read().strip() except FileNotFoundError: logger.warning("Could not find VERSION file, defaulting to '0.0.0'") self._version = "0.0.0" try: with open(config_file_path, "rb") as config_file: self._config = tomllib.load(config_file) except FileNotFoundError: logger.fatal(f"Could not find config file at \"{config_file_path}\", exiting...") exit(1) try: self._DEFAULT_PROFILE_PICTURE = self._preload_default_profile_picture() except FileNotFoundError: logger.fatal("Could not find default profile picture, exiting...") exit(1) def get_paypal_configuration(self) -> PayPalConfiguration: try: return PayPalConfiguration( client_id_sandbox=self._config["paypal"]["client_id_sandbox"], secret_sandbox=self._config["paypal"]["secret_sandbox"], client_id=self._config["paypal"]["client_id"], secret=self._config["paypal"]["secret"] ) except KeyError: logger.fatal("Error loading DatabaseConfiguration, exiting...") sys.exit(1) def get_ticket_info(self) -> tuple[TicketInfo, ...]: try: return tuple([TicketInfo( category=value, total_tickets=self._config["tickets"][value]["total_tickets"], price=Decimal(self._config["tickets"][value]["price"]), description=self._config["tickets"][value]["description"], additional_info=self._config["tickets"][value]["additional_info"], can_be_sold=self._config["tickets"][value]["can_be_sold"] ) for value in self._config["tickets"]]) except KeyError as e: logger.debug(e) logger.fatal("Error loading ticket configuration, exiting...") sys.exit(1) def get_database_configuration(self) -> DatabaseConfiguration: try: return DatabaseConfiguration( database_address=self._config["database"]["database_address"], database_name=self._config["database"]["database_name"], ) except KeyError: logger.fatal("Error loading DatabaseConfiguration, exiting...") sys.exit(1) def get_mailing_service_configuration(self) -> MailingServiceConfiguration: try: mailing_configuration = self._config["mailing"] return MailingServiceConfiguration( smtp_server=mailing_configuration["smtp_server"], smtp_port=mailing_configuration["smtp_port"], sender=mailing_configuration["sender"], username=mailing_configuration["username"], password=mailing_configuration["password"] ) except KeyError: logger.fatal("Error loading MailingServiceConfiguration, exiting...") sys.exit(1) def get_lan_info(self) -> LanInfo: try: lan_info = self._config["lan"] return LanInfo( name=lan_info["name"], iteration=lan_info["iteration"], date_from=datetime.strptime(lan_info["date_from"], "%Y-%m-%d %H:%M:%S"), date_till=datetime.strptime(lan_info["date_till"], "%Y-%m-%d %H:%M:%S"), organizer_mail=lan_info["organizer_mail"], internet_speed_mbs=lan_info["internet_speed_mbs"], has_wifi=lan_info["has_wifi"], has_showers=lan_info["has_showers"], ts3_address=lan_info["ts3_address"], discord_invite_link=lan_info["discord_invite_link"] ) except KeyError: logger.fatal("Error loading LAN Info, exiting...") sys.exit(1) def get_receipt_printing_configuration(self) -> ReceiptPrintingConfiguration: try: receipt_printing_configuration = self._config["receipt_printing"] return ReceiptPrintingConfiguration( host=receipt_printing_configuration["host"], port=receipt_printing_configuration["port"], order_print_endpoint=receipt_printing_configuration["order_print_endpoint"], password=receipt_printing_configuration["password"] ) except KeyError: logger.fatal("Error loading Receipt Printing Configuration, exiting...") sys.exit(1) def _preload_default_profile_picture(self) -> bytes: with open(from_root(self._config["misc"]["default_profile_picture"]), "rb") as file: return file.read() @property def APP_VERSION(self) -> str: return self._version @property def DEV_MODE_ACTIVE(self) -> bool: return self._config["misc"]["dev_mode_active"] @property def DEFAULT_PROFILE_PICTURE(self) -> bytes: return self._DEFAULT_PROFILE_PICTURE @property def BASE_URL(self) -> str: return self._config["misc"]["base_url"]