""" Bot handlers """ import logging from typing import Optional from aiogram import F, types from aiogram.filters import CommandStart, Command from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message, WebAppInfo from aiogram.utils.keyboard import InlineKeyboardBuilder from config import config from utils import ( parse_startapp_parameter, get_welcome_message, validate_reward_amount, validate_quiz_id, ) logger = logging.getLogger(__name__) def create_main_keyboard(startapp_param: Optional[str] = None) -> InlineKeyboardMarkup: """Create main keyboard with mini app button""" builder = InlineKeyboardBuilder() # Mini app URL with startapp parameter mini_app_url = config.frontend_url if startapp_param: mini_app_url = f"{config.frontend_url}?startapp={startapp_param}" builder.row( InlineKeyboardButton( text="🎯 ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π’ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹", web_app=WebAppInfo(url=mini_app_url) ) ) builder.row( InlineKeyboardButton( text="πŸ“Š Бтатистика", callback_data="stats" ) ) return builder.as_markup() async def handle_start_command(message: Message) -> None: """Handle /start command""" startapp_param = None # Extract startapp parameter from command arguments if message.text and len(message.text.split()) > 1: startapp_param = message.text.split(maxsplit=1)[1] # Parse the startapp parameter try: parsed_param = parse_startapp_parameter(startapp_param) # Validate parameters if parsed_param["type"] == "reward": amount = parsed_param.get("amount", 0) if not validate_reward_amount(amount): logger.warning(f"Invalid reward amount: {amount}") parsed_param = {"type": "main"} elif parsed_param["type"] == "quiz": quiz_id = parsed_param.get("quiz_id", "") if not validate_quiz_id(quiz_id): logger.warning(f"Invalid quiz ID: {quiz_id}") parsed_param = {"type": "main"} # Get welcome message welcome_text = get_welcome_message(parsed_param) # Log the start event logger.info( f"User {message.from_user.id} started bot with param: {startapp_param}, " f"parsed as: {parsed_param}" ) # Send welcome message with keyboard keyboard = create_main_keyboard(startapp_param) await message.answer(welcome_text, reply_markup=keyboard) except Exception as e: logger.error(f"Error handling start command: {e}") # Fallback to main message fallback_text = get_welcome_message({"type": "main"}) keyboard = create_main_keyboard() await message.answer(fallback_text, reply_markup=keyboard) async def handle_text_message(message: Message) -> None: """Handle text messages""" text = message.text.lower() if any(word in text for word in ["Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Π°", "опрос", "тСст"]): await message.answer( "🎯 Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρƒ? НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΠΆΠ΅!", reply_markup=create_main_keyboard() ) elif any(word in text for word in ["Π·Π²Π΅Π·Π΄", "Π±Π°Π»Π»", "ΠΌΠΎΠ½Π΅Ρ‚"]): await message.answer( "⭐ Π£Π·Π½Π°ΠΉΡ‚Π΅ свой баланс ΠΈ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΡŒΡ‚Π΅ Π·Π²Ρ‘Π·Π΄Ρ‹ Π² ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ!", reply_markup=create_main_keyboard() ) elif any(word in text for word in ["ΠΌΠ°Π³Π°Π·ΠΈΠ½", "ΠΏΡ€ΠΈΠ·", "ΠΏΠΎΠ΄Π°Ρ€ΠΎΠΊ"]): await message.answer( "πŸ›’ ЗаглянитС Π² наш ΠΌΠ°Π³Π°Π·ΠΈΠ½ ΠΏΡ€ΠΈΠ·ΠΎΠ²!", reply_markup=create_main_keyboard() ) else: await message.answer( "🌟 Π― Π±ΠΎΡ‚ для управлСния Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Π°ΠΌΠΈ! Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½ΠΈΠΆΠ΅ для доступа ΠΊ ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.", reply_markup=create_main_keyboard() ) async def handle_stats_callback(callback: types.CallbackQuery) -> None: """Handle stats button click""" await callback.answer("Бтатистика доступна Π² ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ!", show_alert=True) async def handle_help_command(message: Message) -> None: """Handle /help command""" help_text = """ 🌟 Π—Π²Ρ‘Π·Π΄Π½Ρ‹Π΅ Π’ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹ - ΠŸΠΎΠΌΠΎΡ‰ΡŒ 🎯 Как Π½Π°Ρ‡Π°Ρ‚ΡŒ: НаТмитС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π’ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹" ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹! 🎁 Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π²Ρ‘Π·Π΄Ρ‹: β€’ ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚Π΅ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹ β€’ Π‘ΠΊΠ°Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ QR-ΠΊΠΎΠ΄Ρ‹ β€’ УчаствуйтС Π² акциях πŸ›’ Как ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π²Ρ‘Π·Π΄Ρ‹: β€’ ΠžΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΠΉΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ·Ρ‹ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ β€’ ΠŸΠΎΠ»ΡƒΡ‡Π°ΠΉΡ‚Π΅ скидки ΠΈ бонусы πŸ“± QR-ΠΊΠΎΠ΄Ρ‹: β€’ Π‘ΠΊΠ°Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ QR-ΠΊΠΎΠ΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° β€’ Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ встроСнный сканСр Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ πŸ”— Deep Links: β€’ `reward_X` - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ X Π·Π²Ρ‘Π·Π΄ β€’ `quiz_X` - ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρƒ X β€’ `shop` - ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½ ❓ Вопросы? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½ΠΈΠΆΠ΅ для доступа ΠΊ ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ! """ await message.answer(help_text, reply_markup=create_main_keyboard()) async def handle_unknown_command(message: Message) -> None: """Handle unknown commands""" await message.answer( "❌ НСизвСстная ΠΊΠΎΠΌΠ°Π½Π΄Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ /help для получСния ΠΏΠΎΠΌΠΎΡ‰ΠΈ.", reply_markup=create_main_keyboard() ) async def handle_qr_info_command(message: Message) -> None: """Handle /qr command for QR information""" info_text = """ 🎫 Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ QR-ΠΊΠΎΠ΄Π°Ρ… πŸ”’ БистСма бСзопасности: β€’ QR-ΠΊΠΎΠ΄Ρ‹ содСрТат ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ β€’ ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ β€’ Π‘Ρ€ΠΎΠΊ дСйствия - 30 Π΄Π½Π΅ΠΉ β€’ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° сторонС сСрвСра 🎯 Π’ΠΈΠΏΡ‹ QR-ΠΊΠΎΠ΄ΠΎΠ²: β€’ πŸ’° reward - начислСниС Π·Π²Ρ‘Π·Π΄ β€’ 🧠 quiz - ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹ β€’ πŸ›’ shop - дСйствия Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ πŸ“± Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: 1. Администратор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ QR-ΠΊΠΎΠ΄Ρ‹ 2. QR-ΠΊΠΎΠ΄Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… мСстах 3. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 4. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ отправляСт Ρ‚ΠΎΠΊΠ΅Π½ Π½Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ ⚑ Для администраторов: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ /admin для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ QR-ΠΊΠΎΠ΄ΠΎΠ² """ await message.answer(info_text, reply_markup=create_main_keyboard())