50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
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())
|