| 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()) |
|
|