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