206 lines
6.1 KiB
Python
206 lines
6.1 KiB
Python
from aiogram.filters.callback_data import CallbackData
|
||
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||
|
||
from ..panel.keyboard import AdminPanelCallback, build_admin_back_btn
|
||
from ..servers.keyboard import AdminServerCallback
|
||
|
||
|
||
class AdminClusterCallback(CallbackData, prefix="admin_cluster"):
|
||
action: str
|
||
data: str | None = None
|
||
|
||
|
||
def build_clusters_editor_kb(servers: dict) -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
|
||
cluster_names = list(servers.keys())
|
||
for i in range(0, len(cluster_names), 2):
|
||
row_buttons = []
|
||
for name in cluster_names[i : i + 2]:
|
||
servers_in_cluster = servers[name]
|
||
all_disabled = all(not s["enabled"] for s in servers_in_cluster)
|
||
label = f"❌ {name} (отключен)" if all_disabled else f"⚙️ {name}"
|
||
row_buttons.append(
|
||
InlineKeyboardButton(
|
||
text=label,
|
||
callback_data=AdminClusterCallback(
|
||
action="manage", data=name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(*row_buttons)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="➕ Добавить кластер",
|
||
callback_data=AdminClusterCallback(action="add").pack(),
|
||
)
|
||
)
|
||
|
||
builder.row(build_admin_back_btn())
|
||
|
||
return builder.as_markup()
|
||
|
||
|
||
def build_manage_cluster_kb(
|
||
cluster_servers: list, cluster_name: str
|
||
) -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
|
||
for server in cluster_servers:
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text=f"🌍 {server['server_name']}",
|
||
callback_data=AdminServerCallback(
|
||
action="manage", data=server["server_name"]
|
||
).pack(),
|
||
)
|
||
)
|
||
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="➕ Добавить сервер",
|
||
callback_data=AdminServerCallback(action="add", data=cluster_name).pack(),
|
||
)
|
||
)
|
||
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="🔙 Назад",
|
||
callback_data=AdminClusterCallback(
|
||
action="manage", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
|
||
return builder.as_markup()
|
||
|
||
|
||
def build_cluster_management_kb(cluster_name: str) -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="📡 Серверы",
|
||
callback_data=f"cluster_servers|{cluster_name}",
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="🌐 Доступность",
|
||
callback_data=AdminClusterCallback(
|
||
action="availability", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="🔄 Синхронизация",
|
||
callback_data=AdminClusterCallback(action="sync", data=cluster_name).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="💾 Создать бэкап",
|
||
callback_data=AdminClusterCallback(
|
||
action="backup", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="⏳ Добавить время",
|
||
callback_data=AdminClusterCallback(
|
||
action="add_time", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="✏️ Сменить название",
|
||
callback_data=AdminClusterCallback(
|
||
action="rename", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="💸 Тариф(Установить/изменить)",
|
||
callback_data=AdminClusterCallback(
|
||
action="set_tariff", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="🔙 Назад", callback_data=AdminPanelCallback(action="clusters").pack()
|
||
)
|
||
)
|
||
|
||
return builder.as_markup()
|
||
|
||
|
||
def build_sync_cluster_kb(
|
||
cluster_servers: list, cluster_name: str
|
||
) -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
|
||
for server in cluster_servers:
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text=f"🔄 Синхронизировать {server['server_name']}",
|
||
callback_data=AdminClusterCallback(
|
||
action="sync-server", data=server["server_name"]
|
||
).pack(),
|
||
)
|
||
)
|
||
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="📍 Синхронизировать кластер",
|
||
callback_data=AdminClusterCallback(
|
||
action="sync-cluster", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
|
||
builder.row(build_admin_back_btn("clusters"))
|
||
|
||
return builder.as_markup()
|
||
|
||
|
||
def build_panel_type_kb() -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
builder.button(
|
||
text="🌐 3X-UI", callback_data=AdminClusterCallback(action="panel_3xui").pack()
|
||
)
|
||
builder.button(
|
||
text="🌀 Remnawave",
|
||
callback_data=AdminClusterCallback(action="panel_remnawave").pack(),
|
||
)
|
||
builder.row(build_admin_back_btn("clusters"))
|
||
return builder.as_markup()
|
||
|
||
|
||
def build_tariff_group_selection_kb(
|
||
cluster_name: str, groups: list[tuple[int, str]]
|
||
) -> InlineKeyboardMarkup:
|
||
builder = InlineKeyboardBuilder()
|
||
for group_id, group_code in groups:
|
||
builder.button(
|
||
text=group_code,
|
||
callback_data=AdminClusterCallback(
|
||
action="apply_tariff_group", data=f"{cluster_name}|{group_id}"
|
||
).pack(),
|
||
)
|
||
builder.row(
|
||
InlineKeyboardButton(
|
||
text="⬅️ Назад",
|
||
callback_data=AdminClusterCallback(
|
||
action="manage", data=cluster_name
|
||
).pack(),
|
||
)
|
||
)
|
||
builder.adjust(2, 1)
|
||
return builder.as_markup()
|