from typing import List, Optional, Tuple, Any from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from app.localization.texts import get_texts def _t(texts, key: str, default: str) -> str: """Helper for localized button labels with fallbacks.""" return texts.t(key, default) def get_admin_main_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_USERS_SUBSCRIPTIONS", "👥 Юзеры/Подписки"), callback_data="admin_submenu_users", ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_SERVERS", "🌐 Серверы"), callback_data="admin_servers", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_TARIFFS", "📦 Тарифы"), callback_data="admin_tariffs", ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_PRICING", "💰 Цены"), callback_data="admin_pricing", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_PROMO_STATS", "💰 Промокоды/Статистика"), callback_data="admin_submenu_promo", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_SUPPORT", "🛟 Поддержка"), callback_data="admin_submenu_support", ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_MESSAGES", "📨 Сообщения"), callback_data="admin_submenu_communications", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_SETTINGS", "⚙️ Настройки"), callback_data="admin_submenu_settings", ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_SYSTEM", "🛠️ Система"), callback_data="admin_submenu_system", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_TRIALS", "🧪 Триалы"), callback_data="admin_trials", ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAIN_PAYMENTS", "💳 Пополнения"), callback_data="admin_payments", ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="back_to_menu")] ]) def get_admin_users_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text=texts.ADMIN_USERS, callback_data="admin_users"), InlineKeyboardButton(text=texts.ADMIN_REFERRALS, callback_data="admin_referrals") ], [ InlineKeyboardButton(text=texts.ADMIN_SUBSCRIPTIONS, callback_data="admin_subscriptions") ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_promo_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text=texts.ADMIN_PROMOCODES, callback_data="admin_promocodes"), InlineKeyboardButton(text=texts.ADMIN_STATISTICS, callback_data="admin_statistics") ], [ InlineKeyboardButton(text=texts.ADMIN_CAMPAIGNS, callback_data="admin_campaigns") ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTESTS", "🏆 Конкурсы"), callback_data="admin_contests", ) ], [ InlineKeyboardButton(text=texts.ADMIN_PROMO_GROUPS, callback_data="admin_promo_groups") ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_communications_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text=texts.ADMIN_MESSAGES, callback_data="admin_messages") ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_COMMUNICATIONS_POLLS", "🗳️ Опросы"), callback_data="admin_polls", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_COMMUNICATIONS_PROMO_OFFERS", "🎯 Промо-предложения"), callback_data="admin_promo_offers" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_COMMUNICATIONS_WELCOME_TEXT", "👋 Приветственный текст"), callback_data="welcome_text_panel" ), InlineKeyboardButton( text=_t(texts, "ADMIN_COMMUNICATIONS_MENU_MESSAGES", "📢 Сообщения в меню"), callback_data="user_messages_panel" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_support_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SUPPORT_TICKETS", "🎫 Тикеты поддержки"), callback_data="admin_tickets" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SUPPORT_AUDIT", "🧾 Аудит модераторов"), callback_data="admin_support_audit" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SUPPORT_SETTINGS", "🛟 Настройки поддержки"), callback_data="admin_support_settings" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_settings_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text=texts.ADMIN_REMNAWAVE, callback_data="admin_remnawave"), InlineKeyboardButton(text=texts.ADMIN_MONITORING, callback_data="admin_monitoring") ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SETTINGS_BOT_CONFIG", "🧩 Конфигурация бота"), callback_data="admin_bot_config" ), ], [ InlineKeyboardButton( text=texts.t("ADMIN_MONITORING_SETTINGS", "⚙️ Настройки мониторинга"), callback_data="admin_mon_settings" ) ], [ InlineKeyboardButton(text=texts.ADMIN_RULES, callback_data="admin_rules"), InlineKeyboardButton( text=_t(texts, "ADMIN_SETTINGS_MAINTENANCE", "🔧 Техработы"), callback_data="maintenance_panel" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SETTINGS_PRIVACY_POLICY", "🛡️ Политика конф."), callback_data="admin_privacy_policy", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SETTINGS_PUBLIC_OFFER", "📄 Публичная оферта"), callback_data="admin_public_offer", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SETTINGS_FAQ", "❓ FAQ"), callback_data="admin_faq", ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_system_submenu_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYSTEM_UPDATES", "📄 Обновления"), callback_data="admin_updates" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SYSTEM_BACKUPS", "🗄️ Бекапы"), callback_data="backup_panel" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYSTEM_LOGS", "🧾 Логи"), callback_data="admin_system_logs" ) ], [InlineKeyboardButton(text=texts.t("ADMIN_REPORTS", "📊 Отчеты"), callback_data="admin_reports")], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel") ] ]) def get_admin_trials_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_TRIALS_RESET_BUTTON", "♻️ Сбросить все триалы"), callback_data="admin_trials_reset", ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel")], ]) def get_admin_reports_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_REPORTS_PREVIOUS_DAY", "📆 За вчера"), callback_data="admin_reports_daily" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_REPORTS_LAST_WEEK", "🗓️ За неделю"), callback_data="admin_reports_weekly" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_REPORTS_LAST_MONTH", "📅 За месяц"), callback_data="admin_reports_monthly" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_panel")] ]) def get_admin_report_result_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text=texts.t("REPORT_CLOSE", "❌ Закрыть"), callback_data="admin_close_report")] ]) def get_admin_users_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_ALL", "👥 Все пользователи"), callback_data="admin_users_list" ), InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_SEARCH", "🔍 Поиск"), callback_data="admin_users_search" ) ], [ InlineKeyboardButton(text=texts.ADMIN_STATISTICS, callback_data="admin_users_stats"), InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_INACTIVE", "🗑️ Неактивные"), callback_data="admin_users_inactive" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTERS", "⚙️ Фильтры"), callback_data="admin_users_filters" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_BLACKLIST", "🔐 Черный список"), callback_data="admin_blacklist_settings" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_BULK_BAN", "🛑 Массовый бан"), callback_data="admin_bulk_ban_start" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_users") ] ]) def get_admin_users_filters_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_BALANCE", "💰 По балансу"), callback_data="admin_users_balance_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_TRAFFIC", "📶 По трафику"), callback_data="admin_users_traffic_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_ACTIVITY", "🕒 По активности"), callback_data="admin_users_activity_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_SPENDING", "💳 По сумме трат"), callback_data="admin_users_spending_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_PURCHASES", "🛒 По количеству покупок"), callback_data="admin_users_purchases_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_RENEW_READY", "♻️ Готовы к продлению"), callback_data="admin_users_ready_to_renew_filter" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USERS_FILTER_CAMPAIGN", "📢 По кампании"), callback_data="admin_users_campaign_filter" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_users") ] ]) def get_admin_subscriptions_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SUBSCRIPTIONS_ALL", "📱 Все подписки"), callback_data="admin_subs_list" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SUBSCRIPTIONS_EXPIRING", "⏰ Истекающие"), callback_data="admin_subs_expiring" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SUBSCRIPTIONS_COUNTRIES", "🌍 Управление странами"), callback_data="admin_subs_countries" ) ], [ InlineKeyboardButton(text=texts.ADMIN_STATISTICS, callback_data="admin_subs_stats") ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_users") ] ]) def get_admin_promocodes_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODES_ALL", "🎫 Все промокоды"), callback_data="admin_promo_list" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODES_CREATE", "➕ Создать"), callback_data="admin_promo_create" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODES_GENERAL_STATS", "📊 Общая статистика"), callback_data="admin_promo_general_stats" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_promo") ] ]) def get_admin_campaigns_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGNS_LIST", "📋 Список кампаний"), callback_data="admin_campaigns_list" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGNS_CREATE", "➕ Создать"), callback_data="admin_campaigns_create" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGNS_GENERAL_STATS", "📊 Общая статистика"), callback_data="admin_campaigns_stats" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_promo") ] ]) def get_admin_contests_root_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTESTS_REFERRAL", "🤝 Реферальные конкурсы"), callback_data="admin_contests_referral", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTESTS_DAILY", "📆 Ежедневные конкурсы"), callback_data="admin_contests_daily", ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_promo"), ], ] ) def get_admin_contests_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTESTS_LIST", "📋 Текущие конкурсы"), callback_data="admin_contests_list", ), InlineKeyboardButton( text=_t(texts, "ADMIN_CONTESTS_CREATE", "➕ Новый конкурс"), callback_data="admin_contests_create", ), ], [ InlineKeyboardButton( text=texts.BACK, callback_data="admin_contests", ) ], ] ) def get_contest_mode_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTEST_MODE_PAID", "💳 Реферал с покупкой"), callback_data="admin_contest_mode_paid", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTEST_MODE_REGISTERED", "🧑‍🤝‍🧑 Просто реферал"), callback_data="admin_contest_mode_registered", ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_contests_referral") ], ] ) def get_daily_contest_manage_keyboard( template_id: int, is_enabled: bool, language: str = "ru", ) -> InlineKeyboardMarkup: texts = get_texts(language) toggle_text = _t(texts, "ADMIN_CONTEST_DISABLE", "⏸️ Остановить") if is_enabled else _t(texts, "ADMIN_CONTEST_ENABLE", "▶️ Запустить") return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton(text=toggle_text, callback_data=f"admin_daily_toggle_{template_id}"), InlineKeyboardButton(text=_t(texts, "ADMIN_CONTEST_START_NOW", "🚀 Запустить раунд"), callback_data=f"admin_daily_start_{template_id}"), InlineKeyboardButton(text=_t(texts, "ADMIN_CONTEST_START_MANUAL", "🧪 Ручной старт"), callback_data=f"admin_daily_manual_{template_id}"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_PRIZE", "🏅 Приз (дни)"), callback_data=f"admin_daily_edit_{template_id}_prize_days"), InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_MAX_WINNERS", "👥 Победителей"), callback_data=f"admin_daily_edit_{template_id}_max_winners"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_ATTEMPTS", "🔁 Попытки"), callback_data=f"admin_daily_edit_{template_id}_attempts_per_user"), InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_TIMES", "⏰ Раундов/день"), callback_data=f"admin_daily_edit_{template_id}_times_per_day"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_SCHEDULE", "🕒 Расписание"), callback_data=f"admin_daily_edit_{template_id}_schedule_times"), InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_COOLDOWN", "⌛ Длительность"), callback_data=f"admin_daily_edit_{template_id}_cooldown_hours"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_EDIT_PAYLOAD", "🧩 Payload"), callback_data=f"admin_daily_payload_{template_id}"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_RESET_ATTEMPTS", "🔄 Сбросить попытки"), callback_data=f"admin_daily_reset_attempts_{template_id}"), ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_CLOSE_ROUND", "❌ Закрыть раунд"), callback_data=f"admin_daily_close_{template_id}"), ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_contests_daily"), ], ] ) def get_referral_contest_manage_keyboard( contest_id: int, *, is_active: bool, can_delete: bool = False, language: str = "ru", ) -> InlineKeyboardMarkup: texts = get_texts(language) toggle_text = ( _t(texts, "ADMIN_CONTEST_DISABLE", "⏸️ Остановить") if is_active else _t(texts, "ADMIN_CONTEST_ENABLE", "▶️ Запустить") ) rows = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTEST_LEADERBOARD", "📊 Лидеры"), callback_data=f"admin_contest_leaderboard_{contest_id}", ), InlineKeyboardButton( text=toggle_text, callback_data=f"admin_contest_toggle_{contest_id}", ), ], [ InlineKeyboardButton( text="📈 Детальная статистика", callback_data=f"admin_contest_detailed_stats_{contest_id}", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTEST_EDIT_SUMMARY_TIMES", "🕒 Итоги в день"), callback_data=f"admin_contest_edit_times_{contest_id}", ), ], [ InlineKeyboardButton( text="🔄 Синхронизация", callback_data=f"admin_contest_sync_{contest_id}", ), InlineKeyboardButton( text="🔍 Отладка", callback_data=f"admin_contest_debug_{contest_id}", ), ], ] if can_delete: rows.append( [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTEST_DELETE", "🗑 Удалить"), callback_data=f"admin_contest_delete_{contest_id}", ) ] ) rows.append( [ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_LIST", "⬅️ К списку"), callback_data="admin_contests_list", ) ] ) return InlineKeyboardMarkup(inline_keyboard=rows) def get_campaign_management_keyboard( campaign_id: int, is_active: bool, language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) status_text = ( _t(texts, "ADMIN_CAMPAIGN_DISABLE", "🔴 Выключить") if is_active else _t(texts, "ADMIN_CAMPAIGN_ENABLE", "🟢 Включить") ) return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_STATS", "📊 Статистика"), callback_data=f"admin_campaign_stats_{campaign_id}", ), InlineKeyboardButton( text=status_text, callback_data=f"admin_campaign_toggle_{campaign_id}", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_EDIT", "✏️ Редактировать"), callback_data=f"admin_campaign_edit_{campaign_id}", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_DELETE", "🗑️ Удалить"), callback_data=f"admin_campaign_delete_{campaign_id}", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_LIST", "⬅️ К списку"), callback_data="admin_campaigns_list" ) ], ] ) def get_campaign_edit_keyboard( campaign_id: int, *, bonus_type: str = None, is_balance_bonus: bool = None, # deprecated, for backwards compatibility language: str = "ru", ) -> InlineKeyboardMarkup: texts = get_texts(language) # Поддержка старого API if bonus_type is None and is_balance_bonus is not None: bonus_type = "balance" if is_balance_bonus else "subscription" keyboard: List[List[InlineKeyboardButton]] = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_EDIT_NAME", "✏️ Название"), callback_data=f"admin_campaign_edit_name_{campaign_id}", ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_EDIT_START", "🔗 Параметр"), callback_data=f"admin_campaign_edit_start_{campaign_id}", ), ] ] if bonus_type == "balance": keyboard.append( [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_BONUS_BALANCE", "💰 Бонус на баланс"), callback_data=f"admin_campaign_edit_balance_{campaign_id}", ) ] ) elif bonus_type == "subscription": keyboard.extend( [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_DURATION", "📅 Длительность"), callback_data=f"admin_campaign_edit_sub_days_{campaign_id}", ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_TRAFFIC", "🌐 Трафик"), callback_data=f"admin_campaign_edit_sub_traffic_{campaign_id}", ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_DEVICES", "📱 Устройства"), callback_data=f"admin_campaign_edit_sub_devices_{campaign_id}", ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_SERVERS", "🌍 Серверы"), callback_data=f"admin_campaign_edit_sub_servers_{campaign_id}", ), ], ] ) elif bonus_type == "tariff": keyboard.extend( [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_TARIFF", "🎁 Тариф"), callback_data=f"admin_campaign_edit_tariff_{campaign_id}", ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_DURATION", "📅 Длительность"), callback_data=f"admin_campaign_edit_tariff_days_{campaign_id}", ), ], ] ) # bonus_type == "none" - только базовые кнопки (название и параметр) keyboard.append( [ InlineKeyboardButton( text=texts.BACK, callback_data=f"admin_campaign_manage_{campaign_id}" ) ] ) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_campaign_bonus_type_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_BONUS_BALANCE", "💰 Бонус на баланс"), callback_data="campaign_bonus_balance" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_BONUS_SUBSCRIPTION", "📱 Пробная подписка"), callback_data="campaign_bonus_subscription" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_BONUS_TARIFF", "🎁 Тариф"), callback_data="campaign_bonus_tariff" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CAMPAIGN_BONUS_NONE", "🔗 Только ссылка"), callback_data="campaign_bonus_none" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_campaigns") ] ]) def get_promocode_management_keyboard(promo_id: int, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_EDIT", "✏️ Редактировать"), callback_data=f"promo_edit_{promo_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_TOGGLE", "🔄 Статус"), callback_data=f"promo_toggle_{promo_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_STATS", "📊 Статистика"), callback_data=f"promo_stats_{promo_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_DELETE", "🗑️ Удалить"), callback_data=f"promo_delete_{promo_id}" ) ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_BACK_TO_LIST", "⬅️ К списку"), callback_data="admin_promo_list") ] ]) def get_admin_messages_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MESSAGES_ALL_USERS", "📨 Всем пользователям"), callback_data="admin_msg_all" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MESSAGES_BY_SUBSCRIPTIONS", "🎯 По подпискам"), callback_data="admin_msg_by_sub" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MESSAGES_BY_CRITERIA", "🔍 По критериям"), callback_data="admin_msg_custom" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MESSAGES_HISTORY", "📋 История"), callback_data="admin_msg_history" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PINNED_MESSAGE", "📌 Закрепленное сообщение"), callback_data="admin_pinned_message", ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_communications") ] ]) def get_pinned_message_keyboard( language: str = "ru", send_before_menu: bool = True, send_on_every_start: bool = True, ) -> InlineKeyboardMarkup: texts = get_texts(language) position_label = ( _t(texts, "ADMIN_PINNED_POSITION_BEFORE", "⬆️ Показать перед меню") if send_before_menu else _t(texts, "ADMIN_PINNED_POSITION_AFTER", "⬇️ Показать после меню") ) toggle_callback = "admin_pinned_message_position" start_mode_label = ( _t(texts, "ADMIN_PINNED_START_EVERY_TIME", "🔁 Показать при каждом /start") if send_on_every_start else _t(texts, "ADMIN_PINNED_START_ONCE", "🚫 Показывать только один раз") ) start_mode_callback = "admin_pinned_message_start_mode" return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PINNED_MESSAGE_UPDATE", "✏️ Обновить"), callback_data="admin_pinned_message_edit", ) ], [ InlineKeyboardButton( text=position_label, callback_data=toggle_callback, ) ], [ InlineKeyboardButton( text=start_mode_label, callback_data=start_mode_callback, ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PINNED_MESSAGE_DELETE", "🗑️ Удалить и отключить"), callback_data="admin_pinned_message_delete", ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_messages")], ]) def get_pinned_broadcast_confirm_keyboard( language: str = "ru", pinned_message_id: int = 0, ) -> InlineKeyboardMarkup: """Клавиатура для выбора: разослать сейчас или только при /start.""" texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PINNED_BROADCAST_NOW", "📨 Разослать сейчас всем"), callback_data=f"admin_pinned_broadcast_now:{pinned_message_id}", ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PINNED_BROADCAST_ON_START", "⏳ Только при /start"), callback_data=f"admin_pinned_broadcast_skip:{pinned_message_id}", ) ], ]) def get_admin_monitoring_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_START", "▶️ Запустить"), callback_data="admin_mon_start" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STOP", "⏸️ Остановить"), callback_data="admin_mon_stop" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STATUS", "📊 Статус"), callback_data="admin_mon_status" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_LOGS", "📋 Логи"), callback_data="admin_mon_logs" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_SETTINGS_BUTTON", "⚙️ Настройки"), callback_data="admin_mon_settings" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_settings") ] ]) def get_admin_remnawave_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_SYSTEM_STATS", "📊 Системная статистика"), callback_data="admin_rw_system" ), InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_MANAGE_NODES", "🖥️ Управление нодами"), callback_data="admin_rw_nodes" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_SYNC", "🔄 Синхронизация"), callback_data="admin_rw_sync" ), InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_MANAGE_SQUADS", "🌐 Управление сквадами"), callback_data="admin_rw_squads" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_MIGRATION", "🚚 Переезд"), callback_data="admin_rw_migration" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_REMNAWAVE_TRAFFIC", "📈 Трафик"), callback_data="admin_rw_traffic" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_settings") ] ]) def get_admin_statistics_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_USERS", "👥 Пользователи"), callback_data="admin_stats_users" ), InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_SUBSCRIPTIONS", "📱 Подписки"), callback_data="admin_stats_subs" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_REVENUE", "💰 Доходы"), callback_data="admin_stats_revenue" ), InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_REFERRALS", "🤝 Партнерка"), callback_data="admin_stats_referrals" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_SUMMARY", "📊 Общая сводка"), callback_data="admin_stats_summary" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_promo") ] ]) def get_user_management_keyboard(user_id: int, user_status: str, language: str = "ru", back_callback: str = "admin_users_list") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_BALANCE", "💰 Баланс"), callback_data=f"admin_user_balance_{user_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_USER_SUBSCRIPTION_SETTINGS", "📱 Подписка и настройки"), callback_data=f"admin_user_subscription_{user_id}" ) ], [ InlineKeyboardButton( text=texts.ADMIN_USER_PROMO_GROUP_BUTTON, callback_data=f"admin_user_promo_group_{user_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_REFERRALS_BUTTON", "🤝 Рефералы"), callback_data=f"admin_user_referrals_{user_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_STATISTICS", "📊 Статистика"), callback_data=f"admin_user_statistics_{user_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_TRANSACTIONS", "📋 Транзакции"), callback_data=f"admin_user_transactions_{user_id}" ) ] ] keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_SEND_MESSAGE", "✉️ Отправить сообщение"), callback_data=f"admin_user_send_message_{user_id}" ) ]) # Кнопка управления ограничениями keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_RESTRICTIONS", "⚠️ Ограничить"), callback_data=f"admin_user_restrictions_{user_id}" ) ]) if user_status == "active": keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_BLOCK", "🚫 Заблокировать"), callback_data=f"admin_user_block_{user_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_USER_DELETE", "🗑️ Удалить"), callback_data=f"admin_user_delete_{user_id}" ) ]) elif user_status == "blocked": keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_UNBLOCK", "✅ Разблокировать"), callback_data=f"admin_user_unblock_{user_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_USER_DELETE", "🗑️ Удалить"), callback_data=f"admin_user_delete_{user_id}" ) ]) elif user_status == "deleted": keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_USER_ALREADY_DELETED", "❌ Пользователь удален"), callback_data="noop" ) ]) keyboard.append([ InlineKeyboardButton(text=texts.BACK, callback_data=back_callback) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_user_restrictions_keyboard( user_id: int, restriction_topup: bool, restriction_subscription: bool, language: str = "ru" ) -> InlineKeyboardMarkup: """Клавиатура управления ограничениями пользователя.""" texts = get_texts(language) keyboard = [] # Toggle для ограничения пополнения topup_emoji = "🚫" if restriction_topup else "✅" topup_text = f"{topup_emoji} Пополнение" keyboard.append([ InlineKeyboardButton( text=topup_text, callback_data=f"admin_user_restriction_toggle_topup_{user_id}" ) ]) # Toggle для ограничения подписки sub_emoji = "🚫" if restriction_subscription else "✅" sub_text = f"{sub_emoji} Продление/покупка" keyboard.append([ InlineKeyboardButton( text=sub_text, callback_data=f"admin_user_restriction_toggle_sub_{user_id}" ) ]) # Кнопка изменения причины keyboard.append([ InlineKeyboardButton( text="📝 Изменить причину", callback_data=f"admin_user_restriction_reason_{user_id}" ) ]) # Кнопка снятия всех ограничений (если есть хотя бы одно) if restriction_topup or restriction_subscription: keyboard.append([ InlineKeyboardButton( text="🔓 Снять все ограничения", callback_data=f"admin_user_restriction_clear_{user_id}" ) ]) # Кнопка назад keyboard.append([ InlineKeyboardButton( text=texts.BACK, callback_data=f"admin_user_manage_{user_id}" ) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_user_promo_group_keyboard( promo_groups: List[Tuple[Any, int]], user_id: int, current_group_ids, # Can be Optional[int] or List[int] language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) # Ensure current_group_ids is a list if current_group_ids is None: current_group_ids = [] elif isinstance(current_group_ids, int): current_group_ids = [current_group_ids] keyboard: List[List[InlineKeyboardButton]] = [] for group, members_count in promo_groups: # Check if user has this group has_group = group.id in current_group_ids prefix = "✅" if has_group else "👥" count_text = f" ({members_count})" if members_count else "" keyboard.append([ InlineKeyboardButton( text=f"{prefix} {group.name}{count_text}", callback_data=f"admin_user_promo_group_toggle_{user_id}_{group.id}" ) ]) keyboard.append([ InlineKeyboardButton( text=texts.ADMIN_USER_PROMO_GROUP_BACK, callback_data=f"admin_user_manage_{user_id}" ) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_confirmation_keyboard( confirm_action: str, cancel_action: str = "admin_panel", language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton(text=texts.YES, callback_data=confirm_action), InlineKeyboardButton(text=texts.NO, callback_data=cancel_action) ] ]) def get_promocode_type_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_TYPE_BALANCE", "💰 Баланс"), callback_data="promo_type_balance" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_TYPE_DAYS", "📅 Дни подписки"), callback_data="promo_type_days" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_TYPE_TRIAL", "🎁 Триал"), callback_data="promo_type_trial" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODE_TYPE_PROMO_GROUP", "🏷️ Промогруппа"), callback_data="promo_type_group" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_promocodes") ] ]) def get_promocode_list_keyboard(promocodes: list, page: int, total_pages: int, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] for promo in promocodes: status_emoji = "✅" if promo.is_active else "❌" type_emoji = {"balance": "💰", "subscription_days": "📅", "trial_subscription": "🎁"}.get(promo.type, "🎫") keyboard.append([ InlineKeyboardButton( text=f"{status_emoji} {type_emoji} {promo.code}", callback_data=f"promo_manage_{promo.id}" ) ]) if total_pages > 1: pagination_row = [] if page > 1: pagination_row.append( InlineKeyboardButton(text="⬅️", callback_data=f"admin_promo_list_page_{page - 1}") ) pagination_row.append( InlineKeyboardButton(text=f"{page}/{total_pages}", callback_data="current_page") ) if page < total_pages: pagination_row.append( InlineKeyboardButton(text="➡️", callback_data=f"admin_promo_list_page_{page + 1}") ) keyboard.append(pagination_row) keyboard.extend([ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PROMOCODES_CREATE", "➕ Создать"), callback_data="admin_promo_create" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_promocodes")] ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_broadcast_target_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_ALL", "👥 Всем"), callback_data="broadcast_all" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_ACTIVE", "📱 С подпиской"), callback_data="broadcast_active" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_TRIAL", "🎁 Триал"), callback_data="broadcast_trial" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_NO_SUB", "❌ Без подписки"), callback_data="broadcast_no_sub" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_EXPIRING", "⏰ Истекающие"), callback_data="broadcast_expiring" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_EXPIRED", "🔚 Истекшие"), callback_data="broadcast_expired" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_ACTIVE_ZERO", "🧊 Активна 0 ГБ"), callback_data="broadcast_active_zero" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_TRIAL_ZERO", "🥶 Триал 0 ГБ"), callback_data="broadcast_trial_zero" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_TARGET_BY_TARIFF", "📦 По тарифу"), callback_data="broadcast_by_tariff" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_messages")] ]) def get_custom_criteria_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_TODAY", "📅 Сегодня"), callback_data="criteria_today" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_WEEK", "📅 За неделю"), callback_data="criteria_week" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_MONTH", "📅 За месяц"), callback_data="criteria_month" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_ACTIVE_TODAY", "⚡ Активные сегодня"), callback_data="criteria_active_today" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_INACTIVE_WEEK", "💤 Неактивные 7+ дней"), callback_data="criteria_inactive_week" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_INACTIVE_MONTH", "💤 Неактивные 30+ дней"), callback_data="criteria_inactive_month" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_REFERRALS", "🤝 Через рефералов"), callback_data="criteria_referrals" ), InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_PROMOCODES", "🎫 Использовали промокоды"), callback_data="criteria_promocodes" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_CRITERIA_DIRECT", "🎯 Прямая регистрация"), callback_data="criteria_direct" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_messages")] ]) def get_broadcast_history_keyboard(page: int, total_pages: int, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] if total_pages > 1: pagination_row = [] if page > 1: pagination_row.append( InlineKeyboardButton(text="⬅️", callback_data=f"admin_msg_history_page_{page - 1}") ) pagination_row.append( InlineKeyboardButton(text=f"{page}/{total_pages}", callback_data="current_page") ) if page < total_pages: pagination_row.append( InlineKeyboardButton(text="➡️", callback_data=f"admin_msg_history_page_{page + 1}") ) keyboard.append(pagination_row) keyboard.extend([ [ InlineKeyboardButton( text=_t(texts, "ADMIN_HISTORY_REFRESH", "🔄 Обновить"), callback_data="admin_msg_history" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_messages")] ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_sync_options_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_FULL", "🔄 Полная синхронизация"), callback_data="sync_all_users" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_TO_PANEL", "⬆️ Синхронизация в панель"), callback_data="sync_to_panel" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_ONLY_NEW", "🆕 Только новые"), callback_data="sync_new_users" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_UPDATE", "📈 Обновить данные"), callback_data="sync_update_data" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_VALIDATE", "🔍 Валидация"), callback_data="sync_validate" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_CLEANUP", "🧹 Очистка"), callback_data="sync_cleanup" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_RECOMMENDATIONS", "💡 Рекомендации"), callback_data="sync_recommendations" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_remnawave")] ] return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_sync_confirmation_keyboard(sync_type: str, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_CONFIRM", "✅ Подтвердить"), callback_data=f"confirm_{sync_type}" ) ], [InlineKeyboardButton(text=_t(texts, "ADMIN_CANCEL", "❌ Отмена"), callback_data="admin_rw_sync")] ] return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_sync_result_keyboard(sync_type: str, has_errors: bool = False, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] if has_errors: keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_RETRY", "🔄 Повторить"), callback_data=f"sync_{sync_type}" ) ]) if sync_type != "all_users": keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_FULL", "🔄 Полная синхронизация"), callback_data="sync_all_users" ) ]) keyboard.extend([ [ InlineKeyboardButton( text=_t(texts, "ADMIN_STATS_BUTTON", "📊 Статистика"), callback_data="admin_rw_system" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_VALIDATE", "🔍 Валидация"), callback_data="sync_validate" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_BACK", "⬅️ К синхронизации"), callback_data="admin_rw_sync" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_MAIN", "🏠 В главное меню"), callback_data="admin_remnawave" ) ] ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_period_selection_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_PERIOD_TODAY", "📅 Сегодня"), callback_data="period_today" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PERIOD_YESTERDAY", "📅 Вчера"), callback_data="period_yesterday" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PERIOD_WEEK", "📅 Неделя"), callback_data="period_week" ), InlineKeyboardButton( text=_t(texts, "ADMIN_PERIOD_MONTH", "📅 Месяц"), callback_data="period_month" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_PERIOD_ALL", "📅 Все время"), callback_data="period_all" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_statistics")] ]) def get_node_management_keyboard(node_uuid: str, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_NODE_ENABLE", "▶️ Включить"), callback_data=f"node_enable_{node_uuid}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_NODE_DISABLE", "⏸️ Отключить"), callback_data=f"node_disable_{node_uuid}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_NODE_RESTART", "🔄 Перезагрузить"), callback_data=f"node_restart_{node_uuid}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_NODE_STATS", "📊 Статистика"), callback_data=f"node_stats_{node_uuid}" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_rw_nodes")] ]) def get_squad_management_keyboard(squad_uuid: str, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_ADD_ALL", "👥 Добавить всех пользователей"), callback_data=f"squad_add_users_{squad_uuid}" ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_REMOVE_ALL", "❌ Удалить всех пользователей"), callback_data=f"squad_remove_users_{squad_uuid}" ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_EDIT", "✏️ Редактировать"), callback_data=f"squad_edit_{squad_uuid}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_DELETE", "🗑️ Удалить сквад"), callback_data=f"squad_delete_{squad_uuid}" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_rw_squads")] ]) def get_squad_edit_keyboard(squad_uuid: str, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_EDIT_INBOUNDS", "🔧 Изменить инбаунды"), callback_data=f"squad_edit_inbounds_{squad_uuid}" ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SQUAD_RENAME", "✏️ Переименовать"), callback_data=f"squad_rename_{squad_uuid}" ), ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_SQUADS", "⬅️ Назад к сквадам"), callback_data=f"admin_squad_manage_{squad_uuid}" ) ] ]) def get_monitoring_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_START", "▶️ Запустить"), callback_data="admin_mon_start" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STOP_HARD", "⏹️ Остановить"), callback_data="admin_mon_stop" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FORCE_CHECK", "🔄 Проверка подписок"), callback_data="admin_mon_force_check" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_TRAFFIC_CHECK", "📊 Проверка трафика"), callback_data="admin_mon_traffic_check" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_LOGS", "📋 Логи"), callback_data="admin_mon_logs" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STATISTICS", "📈 Статистика"), callback_data="admin_mon_statistics" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_TEST_NOTIFICATIONS", "🧪 Тест уведомлений"), callback_data="admin_mon_test_notifications" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_ADMIN", "⬅️ Назад в админку"), callback_data="admin_panel" ) ] ]) def get_monitoring_logs_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_HISTORY_REFRESH", "🔄 Обновить"), callback_data="admin_mon_logs" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_CLEAR_OLD", "🗑️ Очистить старые"), callback_data="admin_mon_clear_logs" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_monitoring")] ]) def get_monitoring_logs_navigation_keyboard( current_page: int, total_pages: int, has_logs: bool = True, language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] if total_pages > 1: nav_row = [] if current_page > 1: nav_row.append(InlineKeyboardButton( text="⬅️", callback_data=f"admin_mon_logs_page_{current_page - 1}" )) nav_row.append(InlineKeyboardButton( text=f"{current_page}/{total_pages}", callback_data="current_page_info" )) if current_page < total_pages: nav_row.append(InlineKeyboardButton( text="➡️", callback_data=f"admin_mon_logs_page_{current_page + 1}" )) keyboard.append(nav_row) management_row = [] refresh_button = InlineKeyboardButton( text=_t(texts, "ADMIN_HISTORY_REFRESH", "🔄 Обновить"), callback_data="admin_mon_logs" ) if has_logs: management_row.extend([ refresh_button, InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_CLEAR", "🗑️ Очистить"), callback_data="admin_mon_clear_logs" ) ]) else: management_row.append(refresh_button) keyboard.append(management_row) keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_BACK_TO_MONITORING", "⬅️ Назад к мониторингу"), callback_data="admin_monitoring" ) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_log_detail_keyboard(log_id: int, current_page: int = 1, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_DELETE_LOG", "🗑️ Удалить этот лог"), callback_data=f"admin_mon_delete_log_{log_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_BACK_TO_LOGS", "⬅️ К списку логов"), callback_data=f"admin_mon_logs_page_{current_page}" ) ] ]) def get_monitoring_clear_confirm_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_CONFIRM_CLEAR", "✅ Да, очистить"), callback_data="admin_mon_clear_logs_confirm" ), InlineKeyboardButton(text=_t(texts, "ADMIN_CANCEL", "❌ Отмена"), callback_data="admin_mon_logs") ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_CLEAR_ALL", "🗑️ Очистить ВСЕ логи"), callback_data="admin_mon_clear_all_logs" ) ] ]) def get_monitoring_status_keyboard( is_running: bool, last_check_ago_minutes: int = 0, language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] control_row = [] if is_running: control_row.extend([ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STOP_HARD", "⏹️ Остановить"), callback_data="admin_mon_stop" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_RESTART", "🔄 Перезапустить"), callback_data="admin_mon_restart" ) ]) else: control_row.append( InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_START", "▶️ Запустить"), callback_data="admin_mon_start" ) ) keyboard.append(control_row) monitoring_row = [] if not is_running or last_check_ago_minutes > 10: monitoring_row.append( InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FORCE_CHECK", "⚡ Срочная проверка"), callback_data="admin_mon_force_check" ) ) else: monitoring_row.append( InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_CHECK_NOW", "🔄 Проверить сейчас"), callback_data="admin_mon_force_check" ) ) keyboard.append(monitoring_row) info_row = [ InlineKeyboardButton(text=_t(texts, "ADMIN_MONITORING_LOGS", "📋 Логи"), callback_data="admin_mon_logs"), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_STATISTICS", "📊 Статистика"), callback_data="admin_mon_statistics" ) ] keyboard.append(info_row) test_row = [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_TEST_NOTIFICATIONS", "🧪 Тест уведомлений"), callback_data="admin_mon_test_notifications" ) ] keyboard.append(test_row) keyboard.append([ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_settings") ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_monitoring_settings_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_SET_INTERVAL", "⏱️ Интервал проверки"), callback_data="admin_mon_set_interval" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_NOTIFICATIONS", "🔔 Уведомления"), callback_data="admin_mon_toggle_notifications" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_AUTOPAY_SETTINGS", "💳 Настройки автооплаты"), callback_data="admin_mon_autopay_settings" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_AUTO_CLEANUP", "🧹 Автоочистка логов"), callback_data="admin_mon_auto_cleanup" ) ], [InlineKeyboardButton(text=_t(texts, "ADMIN_BACK_TO_MONITORING", "⬅️ К мониторингу"), callback_data="admin_monitoring")] ]) def get_log_type_filter_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FILTER_SUCCESS", "✅ Успешные"), callback_data="admin_mon_logs_filter_success" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FILTER_ERRORS", "❌ Ошибки"), callback_data="admin_mon_logs_filter_error" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FILTER_CYCLES", "🔄 Циклы мониторинга"), callback_data="admin_mon_logs_filter_cycle" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MONITORING_FILTER_AUTOPAY", "💳 Автооплаты"), callback_data="admin_mon_logs_filter_autopay" ) ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_MONITORING_ALL_LOGS", "📋 Все логи"), callback_data="admin_mon_logs"), InlineKeyboardButton(text=texts.BACK, callback_data="admin_monitoring") ] ]) def get_admin_servers_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVERS_LIST", "📋 Список серверов"), callback_data="admin_servers_list" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SERVERS_SYNC", "🔄 Синхронизация"), callback_data="admin_servers_sync" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVERS_ADD", "➕ Добавить сервер"), callback_data="admin_servers_add" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SERVERS_STATS", "📊 Статистика"), callback_data="admin_servers_stats" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_subscriptions")] ]) def get_server_edit_keyboard(server_id: int, is_available: bool, language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) toggle_text = _t(texts, "ADMIN_SERVER_DISABLE", "❌ Отключить") if is_available else _t(texts, "ADMIN_SERVER_ENABLE", "✅ Включить") return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_EDIT_NAME", "✏️ Название"), callback_data=f"admin_server_edit_name_{server_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_EDIT_PRICE", "💰 Цена"), callback_data=f"admin_server_edit_price_{server_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_EDIT_COUNTRY", "🌍 Страна"), callback_data=f"admin_server_edit_country_{server_id}" ), InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_EDIT_LIMIT", "👥 Лимит"), callback_data=f"admin_server_edit_limit_{server_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_EDIT_DESCRIPTION", "📝 Описание"), callback_data=f"admin_server_edit_desc_{server_id}" ) ], [ InlineKeyboardButton( text=toggle_text, callback_data=f"admin_server_toggle_{server_id}" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_SERVER_DELETE", "🗑️ Удалить"), callback_data=f"admin_server_delete_{server_id}" ), InlineKeyboardButton(text=texts.BACK, callback_data="admin_servers_list") ] ]) def get_admin_pagination_keyboard( current_page: int, total_pages: int, callback_prefix: str, back_callback: str = "admin_panel", language: str = "ru" ) -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] if total_pages > 1: row = [] if current_page > 1: row.append(InlineKeyboardButton( text="⬅️", callback_data=f"{callback_prefix}_page_{current_page - 1}" )) row.append(InlineKeyboardButton( text=f"{current_page}/{total_pages}", callback_data="current_page" )) if current_page < total_pages: row.append(InlineKeyboardButton( text="➡️", callback_data=f"{callback_prefix}_page_{current_page + 1}" )) keyboard.append(row) keyboard.append([ InlineKeyboardButton(text=texts.BACK, callback_data=back_callback) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_maintenance_keyboard( language: str, is_maintenance_active: bool, is_monitoring_active: bool, panel_has_issues: bool = False ) -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [] if is_maintenance_active: keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_DISABLE", "🟢 Выключить техработы"), callback_data="maintenance_toggle" ) ]) else: keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_ENABLE", "🔧 Включить техработы"), callback_data="maintenance_toggle" ) ]) if is_monitoring_active: keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_STOP_MONITORING", "⏹️ Остановить мониторинг"), callback_data="maintenance_monitoring" ) ]) else: keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_START_MONITORING", "▶️ Запустить мониторинг"), callback_data="maintenance_monitoring" ) ]) keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_CHECK_API", "🔍 Проверить API"), callback_data="maintenance_check_api" ), InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_PANEL_STATUS", "🌐 Статус панели") + ("⚠️" if panel_has_issues else ""), callback_data="maintenance_check_panel" ) ]) keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_MAINTENANCE_SEND_NOTIFICATION", "📢 Отправить уведомление"), callback_data="maintenance_manual_notify" ) ]) keyboard.append([ InlineKeyboardButton( text=_t(texts, "ADMIN_REFRESH", "🔄 Обновить"), callback_data="maintenance_panel" ), InlineKeyboardButton( text=texts.BACK, callback_data="admin_submenu_settings" ) ]) return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_sync_simplified_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) keyboard = [ [ InlineKeyboardButton( text=_t(texts, "ADMIN_SYNC_FULL", "🔄 Полная синхронизация"), callback_data="sync_all_users" ) ], [InlineKeyboardButton(text=texts.BACK, callback_data="admin_remnawave")] ] return InlineKeyboardMarkup(inline_keyboard=keyboard) def get_welcome_text_keyboard(language: str = "ru", is_enabled: bool = True) -> InlineKeyboardMarkup: texts = get_texts(language) toggle_text = _t(texts, "ADMIN_WELCOME_DISABLE", "🔴 Отключить") if is_enabled else _t(texts, "ADMIN_WELCOME_ENABLE", "🟢 Включить") toggle_callback = "toggle_welcome_text" keyboard = [ [ InlineKeyboardButton(text=toggle_text, callback_data=toggle_callback) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_EDIT", "📝 Изменить текст"), callback_data="edit_welcome_text" ), InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_SHOW", "👁️ Показать текущий"), callback_data="show_welcome_text" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_PREVIEW", "👁️ Предпросмотр"), callback_data="preview_welcome_text" ), InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_RESET", "🔄 Сбросить"), callback_data="reset_welcome_text" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_HTML", "🏷️ HTML форматирование"), callback_data="show_formatting_help" ), InlineKeyboardButton( text=_t(texts, "ADMIN_WELCOME_PLACEHOLDERS", "💡 Плейсхолдеры"), callback_data="show_placeholders_help" ) ], [ InlineKeyboardButton(text=texts.BACK, callback_data="admin_submenu_communications") ] ] return InlineKeyboardMarkup(inline_keyboard=keyboard) DEFAULT_BROADCAST_BUTTONS = ("home",) BROADCAST_BUTTONS = { "balance": { "default_text": "💰 Пополнить баланс", "text_key": "ADMIN_BROADCAST_BUTTON_BALANCE", "callback": "balance_topup", }, "referrals": { "default_text": "🤝 Партнерка", "text_key": "ADMIN_BROADCAST_BUTTON_REFERRALS", "callback": "menu_referrals", }, "promocode": { "default_text": "🎫 Промокод", "text_key": "ADMIN_BROADCAST_BUTTON_PROMOCODE", "callback": "menu_promocode", }, "connect": { "default_text": "🔗 Подключиться", "text_key": "ADMIN_BROADCAST_BUTTON_CONNECT", "callback": "subscription_connect", }, "subscription": { "default_text": "📱 Подписка", "text_key": "ADMIN_BROADCAST_BUTTON_SUBSCRIPTION", "callback": "menu_subscription", }, "support": { "default_text": "🛠️ Техподдержка", "text_key": "ADMIN_BROADCAST_BUTTON_SUPPORT", "callback": "menu_support", }, "home": { "default_text": "🏠 На главную", "text_key": "ADMIN_BROADCAST_BUTTON_HOME", "callback": "back_to_menu", }, } BROADCAST_BUTTON_ROWS: tuple[tuple[str, ...], ...] = ( ("balance", "referrals"), ("promocode", "connect"), ("subscription", "support"), ("home",), ) def get_broadcast_button_config(language: str) -> dict[str, dict[str, str]]: texts = get_texts(language) return { key: { "text": texts.t(config["text_key"], config["default_text"]), "callback": config["callback"], } for key, config in BROADCAST_BUTTONS.items() } def get_broadcast_button_labels(language: str) -> dict[str, str]: return {key: value["text"] for key, value in get_broadcast_button_config(language).items()} def get_message_buttons_selector_keyboard(language: str = "ru") -> InlineKeyboardMarkup: return get_updated_message_buttons_selector_keyboard_with_media(list(DEFAULT_BROADCAST_BUTTONS), False, language) def get_broadcast_media_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_ADD_PHOTO", "📷 Добавить фото"), callback_data="add_media_photo" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_ADD_VIDEO", "🎥 Добавить видео"), callback_data="add_media_video" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_ADD_DOCUMENT", "📄 Добавить документ"), callback_data="add_media_document" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_SKIP_MEDIA", "⏭️ Пропустить медиа"), callback_data="skip_media" ) ], [InlineKeyboardButton(text=_t(texts, "ADMIN_CANCEL", "❌ Отмена"), callback_data="admin_messages")] ]) def get_media_confirm_keyboard(language: str = "ru") -> InlineKeyboardMarkup: texts = get_texts(language) return InlineKeyboardMarkup(inline_keyboard=[ [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_USE_MEDIA", "✅ Использовать это медиа"), callback_data="confirm_media" ), InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_REPLACE_MEDIA", "🔄 Заменить медиа"), callback_data="replace_media" ) ], [ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_NO_MEDIA", "⏭️ Без медиа"), callback_data="skip_media" ), InlineKeyboardButton(text=_t(texts, "ADMIN_CANCEL", "❌ Отмена"), callback_data="admin_messages") ] ]) 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 [] texts = get_texts(language) button_config_map = get_broadcast_button_config(language) keyboard: list[list[InlineKeyboardButton]] = [] for row in BROADCAST_BUTTON_ROWS: row_buttons: list[InlineKeyboardButton] = [] for button_key in row: button_config = button_config_map[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([ InlineKeyboardButton( text=_t(texts, "ADMIN_BROADCAST_CHANGE_MEDIA", "🖼️ Изменить медиа"), callback_data="change_media" ) ]) keyboard.extend([ [ InlineKeyboardButton( text=_t(texts, "ADMIN_CONTINUE", "✅ Продолжить"), callback_data="buttons_confirm" ) ], [ InlineKeyboardButton(text=_t(texts, "ADMIN_CANCEL", "❌ Отмена"), callback_data="admin_messages") ] ]) return InlineKeyboardMarkup(inline_keyboard=keyboard)