import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from sqlalchemy.ext.asyncio import AsyncEngine, async_sessionmaker from app.bot.handlers import build_root_router from app.bot.middlewares import DbSessionMiddleware, ServicesMiddleware from app.config import Settings from app.db.base import Base from app.db.session import get_session_factory, init_engine async def create_schema(engine: AsyncEngine) -> None: async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) def build_dispatcher(session_factory: async_sessionmaker) -> Dispatcher: dp = Dispatcher() dp.update.middleware(DbSessionMiddleware(session_factory)) dp.update.middleware(ServicesMiddleware()) dp.include_router(build_root_router()) return dp async def main() -> None: logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s", ) settings = Settings() engine = init_engine(settings.database_url) await create_schema(engine) session_factory = get_session_factory(engine) bot = Bot( settings.bot_token, default_parse_mode=ParseMode.HTML, ) dp = build_dispatcher(session_factory) try: await dp.start_polling(bot) finally: await engine.dispose() if __name__ == "__main__": asyncio.run(main())