from __future__ import annotations import asyncio import logging from aiogram import Bot, Dispatcher from aiogram.client.session.aiohttp import AiohttpSession from aiogram.fsm.storage.memory import MemoryStorage from bot.clients.budget_api import BudgetApiClient from bot.config import settings from bot.handlers.budget import router as budget_router logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) logger = logging.getLogger(__name__) def create_bot() -> Bot: if settings.proxy_url: logger.info("Using proxy for Telegram API: %s", settings.proxy_url) session = AiohttpSession(proxy=settings.proxy_url) else: session = AiohttpSession() return Bot(token=settings.bot_token, session=session) async def main() -> None: budget_service = BudgetApiClient( base_url=settings.api_base_url, api_token=settings.api_token, ) await budget_service.start() bot = create_bot() dp = Dispatcher(storage=MemoryStorage()) dp["budget_service"] = budget_service dp.include_router(budget_router) try: logger.info("Bot started (API %s)", settings.api_base_url) await dp.start_polling(bot) finally: await budget_service.close() await bot.session.close() if __name__ == "__main__": asyncio.run(main())