Files
remnawave-bedolaga-telegram…/app/keyboards/admin.py
Pavel Stryuk 427011fe41 1) Отображение скидки на кнопках (красивое!)
2) У промогрупп появится приоритет
3) У пользователя может быть несколько промогрупп, но влиять будет только с наивысшим приоритетом
4) К промокодам можно будет добавить промогруппу. Все активировавшие промокод получат её
5) При выводе пользователей с промогруппой будет также выводиться ссылка на каждого. Можно будет отследить сливы промокодов "для своих". Я в целом это добавлю во все места, где пользователь выводится в админке
6) Исправить баг исчезновения триалки при пополнении
7) Исправить падающие тесты и добавить новых
8) Трафик: 0 ГБ в тестовой подписке исправить на Трафик: Безлимит
2025-11-04 13:05:02 +01:00

2007 lines
70 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_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_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=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_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=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_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_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,
*,
is_balance_bonus: bool,
language: str = "ru",
) -> InlineKeyboardMarkup:
texts = get_texts(language)
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 is_balance_bonus:
keyboard.append(
[
InlineKeyboardButton(
text=_t(texts, "ADMIN_CAMPAIGN_BONUS_BALANCE", "💰 Бонус на баланс"),
callback_data=f"admin_campaign_edit_balance_{campaign_id}",
)
]
)
else:
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}",
),
],
]
)
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=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=texts.BACK, callback_data="admin_submenu_communications")
]
])
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}"
)
])
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_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=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_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_LOGS", "📋 Логи"),
callback_data="admin_mon_logs"
)
],
[
InlineKeyboardButton(
text=_t(texts, "ADMIN_MONITORING_TEST_NOTIFICATIONS", "🧪 Тест уведомлений"),
callback_data="admin_mon_test_notifications"
),
InlineKeyboardButton(
text=_t(texts, "ADMIN_MONITORING_STATISTICS", "📊 Статистика"),
callback_data="admin_mon_statistics"
)
],
[
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)