from __future__ import annotations import asyncio import logging from aiogram import Bot, Dispatcher from bot.config import load_settings from bot.handlers import router as root_router from bot.middleware import InjectMiddleware from bot.notify_worker import run_notify_worker from bot.storage import Storage logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s", ) logger = logging.getLogger(__name__) async def main() -> None: settings = load_settings() storage = Storage(str(settings.db_path)) await storage.connect() bot = Bot(token=settings.telegram_bot_token) dp = Dispatcher() dp.update.middleware(InjectMiddleware(settings, storage)) dp.include_router(root_router) worker_task = asyncio.create_task( run_notify_worker( bot, storage, settings.ha_api_base_url, settings.poll_interval_sec, ) ) logger.info("Bot started, HA API: %s", settings.ha_api_base_url) try: await dp.start_polling(bot) finally: worker_task.cancel() try: await worker_task except asyncio.CancelledError: pass await storage.close() await bot.session.close() if __name__ == "__main__": asyncio.run(main())