148 lines
4.1 KiB
Python
148 lines
4.1 KiB
Python
"""
|
|
Utility functions for the Telegram bot
|
|
"""
|
|
|
|
import urllib.parse
|
|
from typing import Dict, Any, Optional
|
|
|
|
|
|
def generate_deep_link(bot_username: str, param_type: str, value: str = "") -> str:
|
|
"""
|
|
Generate deep link for the bot
|
|
|
|
Args:
|
|
bot_username: Telegram bot username (without @)
|
|
param_type: Type of parameter (reward, quiz, shop, reward_item)
|
|
value: Value for the parameter (e.g., reward amount, quiz ID)
|
|
|
|
Returns:
|
|
Deep link URL
|
|
"""
|
|
if param_type == "shop":
|
|
startapp = "shop"
|
|
elif param_type == "reward":
|
|
startapp = f"reward_{value}"
|
|
elif param_type == "quiz":
|
|
startapp = f"quiz_{value}"
|
|
elif param_type == "reward_item":
|
|
startapp = f"reward_{value}"
|
|
else:
|
|
startapp = ""
|
|
|
|
if startapp:
|
|
return f"https://t.me/{bot_username}?startapp={startapp}"
|
|
else:
|
|
return f"https://t.me/{bot_username}"
|
|
|
|
|
|
def generate_qr_content(deep_link: str) -> str:
|
|
"""
|
|
Generate content for QR code
|
|
|
|
Args:
|
|
deep_link: The deep link to encode in QR
|
|
|
|
Returns:
|
|
QR content (URL encoded)
|
|
"""
|
|
return urllib.parse.quote(deep_link)
|
|
|
|
|
|
def parse_startapp_parameter(startapp: str) -> Dict[str, Any]:
|
|
"""
|
|
Parse startapp parameter from deep link
|
|
|
|
Args:
|
|
startapp: The startapp parameter from Telegram
|
|
|
|
Returns:
|
|
Dictionary with parsed data
|
|
"""
|
|
if not startapp:
|
|
return {"type": "main"}
|
|
|
|
if startapp.startswith("reward_"):
|
|
try:
|
|
amount = int(startapp.split("_")[1])
|
|
return {"type": "reward", "amount": amount}
|
|
except (IndexError, ValueError):
|
|
return {"type": "main"}
|
|
|
|
elif startapp.startswith("quiz_"):
|
|
quiz_id = startapp.split("_")[1]
|
|
return {"type": "quiz", "quiz_id": quiz_id}
|
|
|
|
elif startapp == "shop":
|
|
return {"type": "shop"}
|
|
|
|
elif startapp.startswith("reward_"):
|
|
reward_id = startapp.split("_")[1]
|
|
return {"type": "reward_item", "reward_id": reward_id}
|
|
|
|
else:
|
|
return {"type": "main"}
|
|
|
|
|
|
def get_welcome_message(param_data: Dict[str, Any]) -> str:
|
|
"""
|
|
Get welcome message based on parsed parameter
|
|
|
|
Args:
|
|
param_data: Parsed parameter data
|
|
|
|
Returns:
|
|
Welcome message text
|
|
"""
|
|
param_type = param_data.get("type", "main")
|
|
|
|
messages = {
|
|
"main": (
|
|
"🌟 Добро пожаловать в <b>Звёздные Викторины</b>!\n\n"
|
|
"Проходите викторины, сканируйте QR-коды и получайте звёзды, "
|
|
"которые можно обменять на призы!"
|
|
),
|
|
"reward": (
|
|
f"🎁 Поздравляем! Вы получили {param_data.get('amount', 0)} ⭐\n\n"
|
|
"Откройте мини-приложение, чтобы использовать свои звёзды!"
|
|
),
|
|
"quiz": (
|
|
"🧠 Готовы проверить свои знания?\n\n"
|
|
"Откройте викторину и начните проходить!"
|
|
),
|
|
"shop": (
|
|
"🛒 Добро пожаловать в магазин призов!\n\n"
|
|
"Обменивайте звёзды на замечательные призы!"
|
|
),
|
|
"reward_item": (
|
|
"🎁 Специальный приз ждет вас!\n\n"
|
|
"Откройте магазин, чтобы узнать подробности!"
|
|
)
|
|
}
|
|
|
|
return messages.get(param_type, messages["main"])
|
|
|
|
|
|
def validate_reward_amount(amount: int) -> bool:
|
|
"""
|
|
Validate reward amount
|
|
|
|
Args:
|
|
amount: Reward amount to validate
|
|
|
|
Returns:
|
|
True if valid, False otherwise
|
|
"""
|
|
return isinstance(amount, int) and amount > 0 and amount <= 1000
|
|
|
|
|
|
def validate_quiz_id(quiz_id: str) -> bool:
|
|
"""
|
|
Validate quiz ID
|
|
|
|
Args:
|
|
quiz_id: Quiz ID to validate
|
|
|
|
Returns:
|
|
True if valid, False otherwise
|
|
"""
|
|
return isinstance(quiz_id, str) and len(quiz_id) > 0 and quiz_id.isalnum() |