Files
remnawave-bedolaga-telegram…/app/keyboards/admin.py
libkit 7a351d3028 feat(keyboards): добавить кнопку типа DISCOUNT в меню промокодов
Кнопка "💸 Одноразовая скидка" в меню выбора типа промокода.
2026-01-17 11:23:08 +05:00

2441 lines
86 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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=_t(texts, "ADMIN_PROMOCODE_TYPE_DISCOUNT", "💸 Одноразовая скидка"),
callback_data="promo_type_discount"
)
],
[
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)