tgs / bot /__main__.py
AZILS's picture
Upload 119 files
054900e verified
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())