sno-quiz/bot/bot.py
2025-09-17 22:22:14 +03:00

98 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import asyncio
import logging
from contextlib import suppress
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.exceptions import TelegramAPIError
from aiogram.filters import Command, CommandStart
from aiogram import F
from aiogram.types import Message
from config import config, app_config
from handlers import (
handle_start_command,
handle_text_message,
handle_stats_callback,
handle_help_command,
handle_unknown_command,
handle_qr_info_command,
)
from admin_handlers import (
handle_admin_command,
handle_generate_qr_callback,
handle_qr_type_callback,
handle_qr_generation_text,
handle_admin_cancel_callback,
handle_admin_stats_callback,
handle_admin_settings_callback,
)
# Configure logging
logging.basicConfig(level=getattr(logging, app_config.LOG_LEVEL))
logger = logging.getLogger(__name__)
# Initialize bot
bot = Bot(token=config.token, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
dp = Dispatcher()
def register_handlers():
"""Register all bot handlers"""
# Start with just one handler to test
dp.message.register(handle_start_command, CommandStart())
# Callback query handlers
dp.callback_query.register(handle_stats_callback, F.data == "stats")
async def main():
"""Main bot function"""
try:
# Validate configuration
logger.info("Validating configuration...")
config.validate()
logger.info("Configuration validated successfully")
# Register handlers
logger.info("Registering handlers...")
register_handlers()
logger.info("Handlers registered successfully")
# Set bot commands
from aiogram.types import BotCommand
await bot.set_my_commands([
BotCommand(command="start", description="Запустить бота"),
BotCommand(command="help", description="Помощь"),
BotCommand(command="qr", description="Информация о QR-кодах"),
BotCommand(command="admin", description="Панель администратора"),
])
# Log bot startup
logger.info(f"Starting bot @{config.bot_username}")
logger.info(f"Frontend URL: {config.frontend_url}")
logger.info(f"Backend API URL: {config.backend_api_url}")
# Start bot
await dp.start_polling(bot)
except TelegramAPIError as e:
logger.error(f"Telegram API error: {e}")
raise
except ValueError as e:
logger.error(f"Configuration error: {e}")
raise
except Exception as e:
logger.error(f"Unexpected error: {e}")
raise
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("Bot stopped by user")
except Exception as e:
logger.error(f"Bot crashed: {e}")