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 # ___// | / # `--' \_~-,