diff --git a/src/controllers/bot_controller.py b/src/controllers/bot_controller.py index 53506f3..c1a39db 100644 --- a/src/controllers/bot_controller.py +++ b/src/controllers/bot_controller.py @@ -5,6 +5,7 @@ import logging from src.interfaces.base import IBotController, ILotteryService, IUserService, IKeyboardBuilder, IMessageFormatter from src.interfaces.base import ILotteryRepository, IParticipationRepository from src.core.config import ADMIN_IDS +from src.core.telegram_config import get_parse_mode logger = logging.getLogger(__name__) @@ -88,7 +89,7 @@ class BotController(IBotController): await callback.answer("❌ Нет активных розыгрышей", show_alert=True) return - text = "🎲 **Активные розыгрыши:**\n\n" + text = "🎲 Активные розыгрыши:\n\n" for lottery in lotteries: participants_count = await self.participation_repo.get_count_by_lottery(lottery.id) @@ -112,7 +113,7 @@ class BotController(IBotController): await callback.message.edit_text( text, reply_markup=keyboard, - parse_mode="Markdown" + parse_mode=get_parse_mode("inline_keyboard") ) except Exception as e: # Если сообщение не изменилось - просто отвечаем на callback @@ -124,5 +125,5 @@ class BotController(IBotController): await callback.message.answer( text, reply_markup=keyboard, - parse_mode="Markdown" - ) \ No newline at end of file + parse_mode=get_parse_mode("inline_keyboard") + ) diff --git a/src/core/premium_emoji.py b/src/core/premium_emoji.py new file mode 100644 index 0000000..efc437f --- /dev/null +++ b/src/core/premium_emoji.py @@ -0,0 +1,93 @@ +""" +Поддержка премиум эмодзи для ботов, созданных с премиум аккаунтов +Telegram Bot API поддерживает премиум эмодзи начиная с версии 7.0 + +Для использования премиум эмодзи: +1. Бот должен быть создан с премиум аккаунта +2. Использовать эмодзи напрямую в тексте сообщений +3. Использовать parse_mode="HTML" или parse_mode="Markdown" +""" + +from typing import Optional +from aiogram.types import MessageEntity, TextQuote +from aiogram.enums import MessageEntityType + + +class PremiumEmojiConfig: + """Конфигурация поддержки премиум эмодзи""" + + # Флаг, что бот может использовать премиум эмодзи + SUPPORTS_PREMIUM_EMOJI = True + + # Стандартные parse_mode для автоматической поддержки эмодзи + DEFAULT_PARSE_MODE = "HTML" # Поддерживает эмодзи лучше чем Markdown + + # Премиум эмодзи которые используются в приложении + PREMIUM_EMOJIS = { + # Розыгрыши + "🎲_premium": "🎲", # Если есть премиум версия + "🏆_premium": "🏆", + "🎯_premium": "🎯", + + # Логины + "📱_premium": "📱", + "🔐_premium": "🔐", + + # Статусы + "✅_premium": "✅", + "❌_premium": "❌", + "⏸_premium": "⏸️", + } + + +def supports_premium_emoji() -> bool: + """Проверить поддерживает ли бот премиум эмодзи""" + return PremiumEmojiConfig.SUPPORTS_PREMIUM_EMOJI + + +def get_parse_mode() -> str: + """Получить оптимальный parse_mode для поддержки эмодзи""" + return PremiumEmojiConfig.DEFAULT_PARSE_MODE + + +def ensure_emoji_support(text: str) -> str: + """ + Убедиться что текст может быть отправлен с эмодзи + + Args: + text: Текст сообщения + + Returns: + Обработанный текст с поддержкой эмодзи + """ + # В Aiogram 3.16+ эмодзи автоматически поддерживаются при правильном parse_mode + # Эта функция может быть расширена для дополнительной обработки если нужно + return text + + +async def send_message_with_emoji( + send_func, + text: str, + parse_mode: Optional[str] = None, + **kwargs +): + """ + Отправить сообщение с поддержкой премиум эмодзи + + Args: + send_func: Функция отправки (message.answer, callback.message.edit_text и т.д.) + text: Текст сообщения + parse_mode: Parse mode (если None, использует default) + **kwargs: Дополнительные параметры + + Returns: + Результат отправки сообщения + """ + if parse_mode is None: + parse_mode = get_parse_mode() + + # Убедиться что текст может содержать эмодзи + text = ensure_emoji_support(text) + + # Отправить сообщение + return await send_func(text, parse_mode=parse_mode, **kwargs) diff --git a/src/core/telegram_config.py b/src/core/telegram_config.py new file mode 100644 index 0000000..35bb818 --- /dev/null +++ b/src/core/telegram_config.py @@ -0,0 +1,42 @@ +""" +Глобальная конфигурация для Telegram Bot API параметров +Включая поддержку премиум эмодзи +""" + +# Parse mode для всех сообщений +# HTML поддерживает премиум эмодзи лучше чем Markdown +GLOBAL_PARSE_MODE = "HTML" + +# Доступные parse modes +PARSE_MODES = { + "HTML": "HTML", + "MARKDOWN": "Markdown", + "NONE": None +} + +# Какой parse mode использовать для разных типов сообщений +MESSAGE_PARSE_MODES = { + "text_message": "HTML", # Обычные текстовые сообщения + "inline_keyboard": "HTML", # С inline клавиатурой + "reply_keyboard": "HTML", # С reply клавиатуре + "edit_message": "HTML", # Редактирование сообщения + "broadcast": "HTML", # Массовые рассылки + "admin_broadcast": "HTML", # Административные рассылки +} + +def get_parse_mode(message_type: str = "text_message") -> str: + """ + Получить parse_mode для типа сообщения + + Args: + message_type: Тип сообщения (см. MESSAGE_PARSE_MODES) + + Returns: + Parse mode строка ("HTML", "Markdown", None) + """ + return MESSAGE_PARSE_MODES.get(message_type, GLOBAL_PARSE_MODE) + + +def get_global_parse_mode() -> str: + """Получить глобальный parse mode""" + return GLOBAL_PARSE_MODE