import asyncio import traceback from typing import Optional from cpl_core.application import ApplicationBuilder from cpl_core.console import Console from bot.application import Application from bot.extension.init_bot_extension import InitBotExtension from bot.startup import Startup from bot.startup_discord_extension import StartupDiscordExtension from bot.startup_migration_extension import StartupMigrationExtension from bot.startup_module_extension import StartupModuleExtension from bot.startup_settings_extension import StartupSettingsExtension from bot_api.app_api_extension import AppApiExtension from bot_core.core_extension.core_extension import CoreExtension from modules.boot_log.boot_log_extension import BootLogExtension from modules.database.database_extension import DatabaseExtension class Program: def __init__(self): self.app: Optional[Application] = None async def start(self): # discord extension has to be loaded before modules (modules depends on discord stuff) app_builder = ( ApplicationBuilder(Application) .use_extension(StartupSettingsExtension) .use_extension(StartupDiscordExtension) .use_extension(StartupModuleExtension) .use_extension(StartupMigrationExtension) .use_extension(InitBotExtension) .use_extension(BootLogExtension) .use_extension(DatabaseExtension) .use_extension(AppApiExtension) .use_extension(CoreExtension) .use_startup(Startup) ) self.app: Application = await app_builder.build_async() await self.app.run_async() async def stop(self): if self.app is None: return await self.app.stop_async() def main(): program = Program() try: asyncio.run(program.start()) except KeyboardInterrupt: asyncio.run(program.stop()) except Exception as e: Console.error( f"[ ERROR ] [ {__name__} ]: Cannot start the bot", f"{e} -> {traceback.format_exc()}", ) finally: try: asyncio.run(program.stop()) except Exception as e: Console.error( f"[ ERROR ] [ {__name__} ]: Cannot stop the bot", f"{e} -> {traceback.format_exc()}", ) if program.app is not None and program.app.is_restart(): del program main() if __name__ == "__main__": main() # (( # ( `) # ; / , # / \/ # / | # / ~/ # / ) ) ~ edraft # ___// | / # `--' \_~-,