diff --git a/app/handlers/admin/messages.py b/app/handlers/admin/messages.py index b5274234..ce74b801 100644 --- a/app/handlers/admin/messages.py +++ b/app/handlers/admin/messages.py @@ -14,7 +14,9 @@ from app.keyboards.admin import ( get_admin_messages_keyboard, get_broadcast_target_keyboard, get_custom_criteria_keyboard, get_broadcast_history_keyboard, get_admin_pagination_keyboard, get_broadcast_media_keyboard, - get_media_confirm_keyboard, get_updated_message_buttons_selector_keyboard_with_media + get_media_confirm_keyboard, get_updated_message_buttons_selector_keyboard_with_media, + BROADCAST_BUTTONS, BROADCAST_BUTTON_ROWS, DEFAULT_BROADCAST_BUTTONS, + BROADCAST_BUTTON_LABELS ) from app.localization.texts import get_texts from app.database.crud.user import get_users_list @@ -23,13 +25,10 @@ from app.utils.decorators import admin_required, error_handler logger = logging.getLogger(__name__) -DEFAULT_SELECTED_BUTTONS = ("home",) -BUTTON_LABELS = { - "balance": "💰 Пополнить баланс", - "referrals": "🤝 Рефералы", - "promocode": "🎫 Промокод", - "home": "🏠 На главную", -} +BUTTON_CONFIG = BROADCAST_BUTTONS +BUTTON_ROWS = BROADCAST_BUTTON_ROWS +DEFAULT_SELECTED_BUTTONS = DEFAULT_BROADCAST_BUTTONS +BUTTON_LABELS = BROADCAST_BUTTON_LABELS def get_message_buttons_selector_keyboard(language: str = "ru") -> types.InlineKeyboardMarkup: @@ -44,23 +43,20 @@ def create_broadcast_keyboard(selected_buttons: list) -> Optional[types.InlineKe selected_buttons = selected_buttons or [] keyboard: list[list[types.InlineKeyboardButton]] = [] - first_row: list[types.InlineKeyboardButton] = [] - if "balance" in selected_buttons: - first_row.append(types.InlineKeyboardButton(text="💰 Пополнить баланс", callback_data="balance_topup")) - if "referrals" in selected_buttons: - first_row.append(types.InlineKeyboardButton(text="🤝 Рефералы", callback_data="menu_referrals")) - if first_row: - keyboard.append(first_row) - - if "promocode" in selected_buttons: - keyboard.append([ - types.InlineKeyboardButton(text="🎫 Промокод", callback_data="menu_promocode") - ]) - - if "home" in selected_buttons: - keyboard.append([ - types.InlineKeyboardButton(text="🏠 На главную", callback_data="back_to_menu") - ]) + for row in BUTTON_ROWS: + row_buttons: list[types.InlineKeyboardButton] = [] + for button_key in row: + if button_key not in selected_buttons: + continue + button_config = BUTTON_CONFIG[button_key] + row_buttons.append( + types.InlineKeyboardButton( + text=button_config["text"], + callback_data=button_config["callback"] + ) + ) + if row_buttons: + keyboard.append(row_buttons) if not keyboard: return None @@ -490,9 +486,12 @@ async def show_button_selector_callback( Выберите кнопки, которые будут добавлены к сообщению рассылки: -💰 Пополнить баланс - откроет методы пополнения -🤝 Рефералы - откроет реферальную программу -🎫 Промокод - откроет форму ввода промокода +💰 Пополнить баланс — откроет методы пополнения +🤝 Рефералы — откроет реферальную программу +🎫 Промокод — откроет форму ввода промокода +🔗 Подключиться — поможет подключить приложение +📱 Подписка — покажет состояние подписки +🛠️ Техподдержка — свяжет с поддержкой 🏠 Кнопка "На главную" включена по умолчанию, но вы можете отключить её при необходимости.{media_info} @@ -531,9 +530,12 @@ async def show_button_selector( Выберите кнопки, которые будут добавлены к сообщению рассылки: -💰 Пополнить баланс - откроет методы пополнения -🤝 Рефералы - откроет реферальную программу -🎫 Промокод - откроет форму ввода промокода +💰 Пополнить баланс — откроет методы пополнения +🤝 Рефералы — откроет реферальную программу +🎫 Промокод — откроет форму ввода промокода +🔗 Подключиться — поможет подключить приложение +📱 Подписка — покажет состояние подписки +🛠️ Техподдержка — свяжет с поддержкой 🏠 Кнопка "На главную" включена по умолчанию, но вы можете отключить её при необходимости. @@ -612,7 +614,7 @@ async def confirm_button_selection( } media_info = f"\n🖼️ Медиафайл: {media_type_names.get(media_type, media_type)}" - ordered_keys = ["balance", "referrals", "promocode", "home"] + ordered_keys = [button_key for row in BUTTON_ROWS for button_key in row] selected_names = [BUTTON_LABELS[key] for key in ordered_keys if key in selected_buttons] if selected_names: buttons_info = f"\n📘 Кнопки: {', '.join(selected_names)}" diff --git a/app/keyboards/admin.py b/app/keyboards/admin.py index 74232680..9137d904 100644 --- a/app/keyboards/admin.py +++ b/app/keyboards/admin.py @@ -913,8 +913,30 @@ def get_welcome_text_keyboard(language: str = "ru", is_enabled: bool = True) -> return InlineKeyboardMarkup(inline_keyboard=keyboard) +DEFAULT_BROADCAST_BUTTONS = ("home",) + +BROADCAST_BUTTONS = { + "balance": {"text": "💰 Пополнить баланс", "callback": "balance_topup"}, + "referrals": {"text": "🤝 Рефералы", "callback": "menu_referrals"}, + "promocode": {"text": "🎫 Промокод", "callback": "menu_promocode"}, + "connect": {"text": "🔗 Подключиться", "callback": "subscription_connect"}, + "subscription": {"text": "📱 Подписка", "callback": "menu_subscription"}, + "support": {"text": "🛠️ Техподдержка", "callback": "menu_support"}, + "home": {"text": "🏠 На главную", "callback": "back_to_menu"}, +} + +BROADCAST_BUTTON_ROWS: tuple[tuple[str, ...], ...] = ( + ("balance", "referrals"), + ("promocode", "connect"), + ("subscription", "support"), + ("home",), +) + +BROADCAST_BUTTON_LABELS = {key: value["text"] for key, value in BROADCAST_BUTTONS.items()} + + def get_message_buttons_selector_keyboard(language: str = "ru") -> InlineKeyboardMarkup: - return get_updated_message_buttons_selector_keyboard_with_media(["home"], False, language) + return get_updated_message_buttons_selector_keyboard_with_media(list(DEFAULT_BROADCAST_BUTTONS), False, language) def get_broadcast_media_keyboard(language: str = "ru") -> InlineKeyboardMarkup: return InlineKeyboardMarkup(inline_keyboard=[ @@ -946,23 +968,25 @@ def get_media_confirm_keyboard(language: str = "ru") -> InlineKeyboardMarkup: def get_updated_message_buttons_selector_keyboard_with_media(selected_buttons: list, has_media: bool = False, language: str = "ru") -> InlineKeyboardMarkup: selected_buttons = selected_buttons or [] - balance_text = "✅ Пополнить баланс" if "balance" in selected_buttons else "💰 Пополнить баланс" - referrals_text = "✅ Рефералы" if "referrals" in selected_buttons else "🤝 Рефералы" - promocode_text = "✅ Промокод" if "promocode" in selected_buttons else "🎫 Промокод" - home_text = "✅ На главную" if "home" in selected_buttons else "🏠 На главную" + keyboard: list[list[InlineKeyboardButton]] = [] - keyboard = [ - [ - InlineKeyboardButton(text=balance_text, callback_data="btn_balance"), - InlineKeyboardButton(text=referrals_text, callback_data="btn_referrals") - ], - [ - InlineKeyboardButton(text=promocode_text, callback_data="btn_promocode") - ], - [ - InlineKeyboardButton(text=home_text, callback_data="btn_home") - ] - ] + for row in BROADCAST_BUTTON_ROWS: + row_buttons: list[InlineKeyboardButton] = [] + for button_key in row: + button_config = BROADCAST_BUTTONS[button_key] + base_text = button_config["text"] + if button_key in selected_buttons: + if " " in base_text: + toggle_text = f"✅ {base_text.split(' ', 1)[1]}" + else: + toggle_text = f"✅ {base_text}" + else: + toggle_text = base_text + row_buttons.append( + InlineKeyboardButton(text=toggle_text, callback_data=f"btn_{button_key}") + ) + if row_buttons: + keyboard.append(row_buttons) if has_media: keyboard.append([