minor fixes

This commit is contained in:
Vladless
2025-12-14 22:56:33 +03:00
parent 7914b3502b
commit d0c1daf3cc
5 changed files with 38 additions and 77 deletions
+35 -7
View File
@@ -14,7 +14,8 @@ from aiogram.utils.keyboard import InlineKeyboardBuilder
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from config import USE_COUNTRY_SELECTION
from config import USE_COUNTRY_SELECTION, REMNAWAVE_TOKEN_LOGIN_ENABLED, REMNAWAVE_LOGIN, REMNAWAVE_PASSWORD
from panels.remnawave import RemnawaveAPI
from core.bootstrap import MODES_CONFIG
from database import (
delete_key,
@@ -737,7 +738,9 @@ async def handle_recreate_key_confirm(
)
return
remnawave_servers = [s for s in cluster if s.get("panel_type", "3x-ui").lower() == "remnawave"]
remnawave_servers = [
s for s in cluster if s.get("panel_type", "3x-ui").lower() == "remnawave"
]
if not remnawave_servers:
await callback_query.message.edit_text(
@@ -747,10 +750,21 @@ async def handle_recreate_key_confirm(
return
api_url = remnawave_servers[0].get("api_url")
if not api_url:
await callback_query.message.edit_text(
text="❗ У Remnawave сервера не задан api_url.",
reply_markup=build_editor_kb(tg_id),
)
return
from panels.remnawave_ext import revoke_user_subscription
api = RemnawaveAPI(api_url)
try:
if not REMNAWAVE_TOKEN_LOGIN_ENABLED:
await api.login(REMNAWAVE_LOGIN, REMNAWAVE_PASSWORD)
user_data = await revoke_user_subscription(api_url, client_id)
user_data = await api.revoke_user_subscription(client_id)
finally:
await api.aclose()
if not user_data:
await callback_query.message.edit_text(
@@ -785,8 +799,18 @@ async def handle_recreate_key_confirm(
"<i>Старая ссылка больше не работает.</i>"
)
user_kb = InlineKeyboardBuilder()
user_kb.row(InlineKeyboardButton(text="📱 Мои подписки", callback_data="view_keys"))
user_kb.row(InlineKeyboardButton(text="👤 Личный кабинет", callback_data="profile"))
user_kb.row(
InlineKeyboardButton(
text="📱 Мои подписки",
callback_data="view_keys",
)
)
user_kb.row(
InlineKeyboardButton(
text="👤 Личный кабинет",
callback_data="profile",
)
)
await callback_query.bot.send_message(
chat_id=tg_id,
@@ -812,7 +836,11 @@ async def handle_recreate_key_confirm(
builder.row(
InlineKeyboardButton(
text="🔙 Назад",
callback_data=AdminUserEditorCallback(action="users_key_edit", tg_id=tg_id, data=old_email).pack(),
callback_data=AdminUserEditorCallback(
action="users_key_edit",
tg_id=tg_id,
data=old_email,
).pack(),
)
)
+2 -1
View File
@@ -107,7 +107,8 @@ async def get_user_traffic(session: AsyncSession, tg_id: int, email: str) -> dic
if not user_data:
user_traffic_data["Remnawave (общий)"] = "Клиент не найден"
else:
used_bytes = user_data.get("usedTrafficBytes", 0)
user_traffic = user_data.get("userTraffic", {})
used_bytes = user_traffic.get("usedTrafficBytes", 0)
used_gb = round(used_bytes / 1073741824, 2)
user_traffic_data["Remnawave (общий)"] = used_gb
except Exception as e:
Binary file not shown.
-68
View File
@@ -1,68 +0,0 @@
import aiohttp
from config import (
REMNAWAVE_ACCESS_TOKEN,
REMNAWAVE_LOGIN,
REMNAWAVE_PASSWORD,
REMNAWAVE_TOKEN_LOGIN_ENABLED,
)
from logger import logger
PANEL_REMNA = "[Remnawave]"
async def revoke_user_subscription(
api_url: str,
user_uuid: str,
short_uuid: str | None = None,
) -> dict | None:
base_url = api_url.rstrip("/")
async with aiohttp.ClientSession() as session:
if REMNAWAVE_TOKEN_LOGIN_ENABLED and REMNAWAVE_ACCESS_TOKEN:
token = REMNAWAVE_ACCESS_TOKEN
else:
login_url = f"{base_url}/auth/login"
login_data = {"username": REMNAWAVE_LOGIN, "password": REMNAWAVE_PASSWORD}
try:
async with session.post(login_url, json=login_data) as resp:
if resp.status != 200 and resp.status != 201:
logger.error(f"{PANEL_REMNA} Авторизация не удалась: {resp.status}")
return None
auth_response = await resp.json()
token = auth_response.get("response", {}).get("accessToken")
if not token:
logger.error(f"{PANEL_REMNA} Не получен accessToken")
return None
except Exception as e:
logger.error(f"{PANEL_REMNA} Ошибка авторизации: {e}")
return None
revoke_url = f"{base_url}/users/{user_uuid}/actions/revoke"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
revoke_data = {}
if short_uuid:
revoke_data["shortUuid"] = short_uuid
try:
async with session.post(revoke_url, json=revoke_data, headers=headers) as resp:
if resp.status != 200 and resp.status != 201:
error_text = await resp.text()
logger.error(f"{PANEL_REMNA} Revoke не удался: {resp.status} - {error_text}")
return None
result = await resp.json()
user_data = result.get("response", {})
logger.info(f"{PANEL_REMNA} Подписка {user_uuid} успешно отозвана")
return user_data
except Exception as e:
logger.error(f"{PANEL_REMNA} Ошибка revoke: {e}")
return None
+1 -1
View File
@@ -92,4 +92,4 @@ def get_git_commit_number() -> str:
def get_version() -> str:
return f"v.5.1-a111227 {get_git_commit_number()}"
return f"v.5.1-a141229 {get_git_commit_number()}"