import asyncio import logging import traceback from aiogram import Bot, Dispatcher from aiogram.client.bot import DefaultBotProperties from aiogram.enums.parse_mode import ParseMode from aiogram.fsm.storage.memory import MemoryStorage from aiogram.types import ErrorEvent import config import db from handlers import routers from handlers.chat import check_all CHECK_INTERVAL = 6 * 3600 # сверка статуса бота в чатах def create_dispatcher(): dp = Dispatcher(storage=MemoryStorage()) for router in routers: dp.include_router(router) @dp.errors() async def on_error(event: ErrorEvent, bot: Bot): """Ошибка обработчика — в лог и в технический чат""" logging.exception("Ошибка обработки", exc_info=event.exception) if config.DEBUG_CHAT_ID: tb = "".join(traceback.format_exception(event.exception))[-3500:] try: await bot.send_message(config.DEBUG_CHAT_ID, f"AboBot: ошибка\n
{tb.replace('<', '<')}")
except Exception:
pass
return True
return dp
async def periodic_check(bot: Bot):
while True:
try:
await check_all(bot)
except Exception:
logging.exception("Сверка статуса бота в чатах")
await asyncio.sleep(CHECK_INTERVAL)
async def main() -> None:
bot = Bot(token=config.BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
await db.connect(config.DATABASE_URL)
dp = create_dispatcher()
await bot.delete_webhook(drop_pending_updates=True)
checker = asyncio.create_task(periodic_check(bot))
try:
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())
finally:
checker.cancel()
await db.close()
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
try:
asyncio.run(main())
except KeyboardInterrupt:
pass