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

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()