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