from __future__ import annotations import asyncio import sentry_sdk import uvloop from loguru import logger from sentry_sdk.integrations.loguru import LoggingLevels, LoguruIntegration from bot.core.config import settings from bot.core.loader import app, bot, dp from bot.handlers import get_handlers_router from bot.handlers.metrics import MetricsView from bot.keyboards.default_commands import remove_default_commands, set_default_commands from bot.middlewares import register_middlewares from bot.middlewares.prometheus import prometheus_middleware_factory async def on_startup() -> None: logger.info("bot starting...") register_middlewares(dp) dp.include_router(get_handlers_router()) if settings.USE_WEBHOOK: app.middlewares.append(prometheus_middleware_factory()) app.router.add_route("GET", "/metrics", MetricsView) await set_default_commands(bot) bot_info = await bot.get_me() logger.info(f"Name - {bot_info.full_name}") logger.info(f"Username - @{bot_info.username}") logger.info(f"ID - {bot_info.id}") states: dict[bool | None, str] = { True: "Enabled", False: "Disabled", None: "Unknown (This's not a bot)", } logger.info(f"Groups Mode - {states[bot_info.can_join_groups]}") logger.info(f"Privacy Mode - {states[not bot_info.can_read_all_group_messages]}") logger.info(f"Inline Mode - {states[bot_info.supports_inline_queries]}") logger.info("bot started") async def on_shutdown() -> None: logger.info("bot stopping...") await remove_default_commands(bot) await dp.storage.close() await dp.fsm.storage.close() await bot.delete_webhook() await bot.session.close() logger.info("bot stopped") async def setup_webhook() -> None: from aiogram.webhook.aiohttp_server import SimpleRequestHandler, setup_application from aiohttp.web import AppRunner, TCPSite await bot.set_webhook( settings.webhook_url, allowed_updates=dp.resolve_used_update_types(), secret_token=settings.WEBHOOK_SECRET, ) webhook_requests_handler = SimpleRequestHandler( dispatcher=dp, bot=bot, secret_token=settings.WEBHOOK_SECRET, ) webhook_requests_handler.register(app, path=settings.WEBHOOK_PATH) setup_application(app, dp, bot=bot) runner = AppRunner(app) await runner.setup() site = TCPSite(runner, host=settings.WEBHOOK_HOST, port=settings.WEBHOOK_PORT) await site.start() await asyncio.Event().wait() async def main() -> None: if settings.SENTRY_DSN: sentry_loguru = LoguruIntegration( level=LoggingLevels.INFO.value, event_level=LoggingLevels.INFO.value, ) sentry_sdk.init( dsn=settings.SENTRY_DSN, enable_tracing=True, traces_sample_rate=1.0, profiles_sample_rate=1.0, integrations=[sentry_loguru], ) logger.add( "logs/telegram_bot.log", level="DEBUG", format="{time} | {level} | {module}:{function}:{line} | {message}", rotation="100 KB", compression="zip", ) dp.startup.register(on_startup) dp.shutdown.register(on_shutdown) if settings.USE_WEBHOOK: await setup_webhook() else: await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types()) if __name__ == "__main__": uvloop.run(main())