Add optional broadcast buttons for connect, subscription, and support

This commit is contained in:
yazhog
2025-09-17 22:51:18 +03:00
parent dba8241c5c
commit 22be75508e
2 changed files with 75 additions and 49 deletions

View File

@@ -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(
Выберите кнопки, которые будут добавлены к сообщению рассылки:
💰 <b>Пополнить баланс</b> - откроет методы пополнения
🤝 <b>Рефералы</b> - откроет реферальную программу
🎫 <b>Промокод</b> - откроет форму ввода промокода
💰 <b>Пополнить баланс</b> откроет методы пополнения
🤝 <b>Рефералы</b> откроет реферальную программу
🎫 <b>Промокод</b> откроет форму ввода промокода
🔗 <b>Подключиться</b> — поможет подключить приложение
📱 <b>Подписка</b> — покажет состояние подписки
🛠️ <b>Техподдержка</b> — свяжет с поддержкой
🏠 <b>Кнопка "На главную"</b> включена по умолчанию, но вы можете отключить её при необходимости.{media_info}
@@ -531,9 +530,12 @@ async def show_button_selector(
Выберите кнопки, которые будут добавлены к сообщению рассылки:
💰 <b>Пополнить баланс</b> - откроет методы пополнения
🤝 <b>Рефералы</b> - откроет реферальную программу
🎫 <b>Промокод</b> - откроет форму ввода промокода
💰 <b>Пополнить баланс</b> откроет методы пополнения
🤝 <b>Рефералы</b> откроет реферальную программу
🎫 <b>Промокод</b> откроет форму ввода промокода
🔗 <b>Подключиться</b> — поможет подключить приложение
📱 <b>Подписка</b> — покажет состояние подписки
🛠️ <b>Техподдержка</b> — свяжет с поддержкой
🏠 <b>Кнопка "На главную"</b> включена по умолчанию, но вы можете отключить её при необходимости.
@@ -612,7 +614,7 @@ async def confirm_button_selection(
}
media_info = f"\n🖼️ <b>Медиафайл:</b> {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📘 <b>Кнопки:</b> {', '.join(selected_names)}"

View File

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