2025-12-16 20:06:16 +07:00
|
|
|
import asyncio
|
|
|
|
|
import logging
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
from aiogram import Bot, Dispatcher
|
|
|
|
|
from aiogram.client.default import DefaultBotProperties
|
|
|
|
|
from aiogram.enums import ParseMode
|
2025-12-17 22:10:01 +07:00
|
|
|
from aiohttp import web
|
2025-12-16 20:06:16 +07:00
|
|
|
|
|
|
|
|
from config import settings
|
|
|
|
|
from handlers import start, marathons, link
|
|
|
|
|
from middlewares.logging import LoggingMiddleware
|
|
|
|
|
|
|
|
|
|
# Configure logging to stdout with DEBUG level
|
|
|
|
|
logging.basicConfig(
|
|
|
|
|
level=logging.DEBUG,
|
|
|
|
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
|
|
|
handlers=[
|
|
|
|
|
logging.StreamHandler(sys.stdout)
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# Set aiogram logging level
|
|
|
|
|
logging.getLogger("aiogram").setLevel(logging.INFO)
|
|
|
|
|
|
2025-12-17 22:10:01 +07:00
|
|
|
# Health check state
|
|
|
|
|
bot_running = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def health_handler(request):
|
|
|
|
|
"""Health check endpoint"""
|
|
|
|
|
if bot_running:
|
|
|
|
|
return web.json_response({"status": "ok", "service": "telegram-bot"})
|
|
|
|
|
return web.json_response({"status": "starting"}, status=503)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def start_health_server():
|
|
|
|
|
"""Start health check HTTP server"""
|
|
|
|
|
app = web.Application()
|
|
|
|
|
app.router.add_get("/health", health_handler)
|
|
|
|
|
runner = web.AppRunner(app)
|
|
|
|
|
await runner.setup()
|
|
|
|
|
site = web.TCPSite(runner, "0.0.0.0", 8080)
|
|
|
|
|
await site.start()
|
|
|
|
|
logger.info("Health check server started on port 8080")
|
|
|
|
|
return runner
|
|
|
|
|
|
2025-12-16 20:06:16 +07:00
|
|
|
|
|
|
|
|
async def main():
|
2025-12-17 22:10:01 +07:00
|
|
|
global bot_running
|
|
|
|
|
|
2025-12-16 20:06:16 +07:00
|
|
|
logger.info("="*50)
|
|
|
|
|
logger.info("Starting Game Marathon Bot...")
|
|
|
|
|
logger.info(f"API_URL: {settings.API_URL}")
|
|
|
|
|
logger.info(f"BOT_TOKEN: {settings.TELEGRAM_BOT_TOKEN[:20]}...")
|
|
|
|
|
logger.info("="*50)
|
|
|
|
|
|
2025-12-17 22:10:01 +07:00
|
|
|
# Start health check server
|
|
|
|
|
health_runner = await start_health_server()
|
|
|
|
|
|
2025-12-16 20:06:16 +07:00
|
|
|
bot = Bot(
|
|
|
|
|
token=settings.TELEGRAM_BOT_TOKEN,
|
|
|
|
|
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Get bot username for deep links
|
|
|
|
|
bot_info = await bot.get_me()
|
|
|
|
|
settings.BOT_USERNAME = bot_info.username
|
|
|
|
|
logger.info(f"Bot info: @{settings.BOT_USERNAME} (id={bot_info.id})")
|
|
|
|
|
|
|
|
|
|
dp = Dispatcher()
|
|
|
|
|
|
|
|
|
|
# Register middleware
|
|
|
|
|
dp.message.middleware(LoggingMiddleware())
|
|
|
|
|
logger.info("Logging middleware registered")
|
|
|
|
|
|
|
|
|
|
# Register routers
|
|
|
|
|
logger.info("Registering routers...")
|
|
|
|
|
dp.include_router(start.router)
|
|
|
|
|
dp.include_router(link.router)
|
|
|
|
|
dp.include_router(marathons.router)
|
|
|
|
|
logger.info("Routers registered: start, link, marathons")
|
|
|
|
|
|
2025-12-17 22:10:01 +07:00
|
|
|
# Mark bot as running
|
|
|
|
|
bot_running = True
|
|
|
|
|
|
2025-12-16 20:06:16 +07:00
|
|
|
# Start polling
|
|
|
|
|
logger.info("Deleting webhook and starting polling...")
|
|
|
|
|
await bot.delete_webhook(drop_pending_updates=True)
|
|
|
|
|
logger.info("Polling started! Waiting for messages...")
|
2025-12-17 22:10:01 +07:00
|
|
|
try:
|
|
|
|
|
await dp.start_polling(bot)
|
|
|
|
|
finally:
|
|
|
|
|
bot_running = False
|
|
|
|
|
await health_runner.cleanup()
|
2025-12-16 20:06:16 +07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
asyncio.run(main())
|