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