import queue import threading from pathlib import Path from time import sleep from typing import Callable import env from database.migrations import DatabaseMigrator from util.util import LOGGER def main() -> None: data = Path(env.DATA_DIR) if not data.exists(): data.mkdir(parents=True) settings = data.joinpath("settings.json") database = data.joinpath("db.sqlite") if not settings.exists(): LOGGER.info("First launch detected! Creating %s and exiting!", settings) return LOGGER.info("Loading settings...") # TODO migrator = DatabaseMigrator(database, Path(env.MIGRATIONS_DIR)) try: migrator.migrate() except Exception: LOGGER.exception("Failed to migrate database!") return finally: migrator.close() LOGGER.info("Starting task worker...") def worker(task_queue: queue.Queue[Callable[[], None] | None]): while True: task = task_queue.get() if task is None: break try: task() except Exception: LOGGER.exception("Exception in worker thread!") finally: task_queue.task_done() task_queue: queue.Queue[Callable[[], None] | None] = queue.Queue() thread = threading.Thread(target=worker, args=(task_queue,), daemon=True) thread.start() LOGGER.info("Connecting to %s...", 'TODO') # TODO try: task_queue.put(lambda: print("hi")) sleep(10) # TODO except KeyboardInterrupt: LOGGER.info("Stopping...") task_queue.join() task_queue.put(None) thread.join() if __name__ == "__main__": main()