From 679e65ec44c346596a4bf1ff4e8829aade9aceda Mon Sep 17 00:00:00 2001 From: Vladless Date: Mon, 17 Nov 2025 00:47:06 +0300 Subject: [PATCH] minor fixes --- database/users.py | 6 ++-- handlers/admin/clusters/cluster_tariffs.py | 11 ++++-- handlers/instructions/instructions.py | 40 ++++++++++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/database/users.py b/database/users.py index c9063d9e..5d50739f 100644 --- a/database/users.py +++ b/database/users.py @@ -82,7 +82,8 @@ async def check_user_exists(session: AsyncSession, tg_id: int) -> bool: async def get_balance(session: AsyncSession, tg_id: int) -> float: result = await session.execute(select(func.coalesce(User.balance, 0.0)).where(User.tg_id == tg_id)) - return round(float(result.scalar_one()), 1) + balance = result.scalar_one_or_none() + return round(float(balance or 0.0), 1) async def set_user_balance(session: AsyncSession, tg_id: int, balance: float) -> None: @@ -106,7 +107,8 @@ async def update_trial(session: AsyncSession, tg_id: int, status: int): async def get_trial(session: AsyncSession, tg_id: int) -> int: result = await session.execute(select(func.coalesce(User.trial, 0)).where(User.tg_id == tg_id)) - return int(result.scalar_one()) + trial = result.scalar_one_or_none() + return int(trial or 0) async def upsert_user( diff --git a/handlers/admin/clusters/cluster_tariffs.py b/handlers/admin/clusters/cluster_tariffs.py index ee5c07a8..da58442e 100644 --- a/handlers/admin/clusters/cluster_tariffs.py +++ b/handlers/admin/clusters/cluster_tariffs.py @@ -59,12 +59,19 @@ async def apply_tariff_group(callback: CallbackQuery, callback_data: AdminCluste group_code = row["group_code"] - await session.execute(update(Server).where(Server.cluster_name == cluster_name).values(tariff_group=group_code)) + await session.execute( + update(Server) + .where(Server.cluster_name == cluster_name) + .values(tariff_group=group_code) + ) await session.commit() + servers = await get_servers(session=session, include_enabled=True) + cluster_servers = servers.get(cluster_name, []) + await callback.message.edit_text( f"✅ Для кластера {cluster_name} установлена тарифная группа: {group_code}", - reply_markup=build_manage_cluster_kb(cluster_name), + reply_markup=build_manage_cluster_kb(cluster_servers, cluster_name), ) except Exception as e: diff --git a/handlers/instructions/instructions.py b/handlers/instructions/instructions.py index ea2ff350..cf99d88c 100644 --- a/handlers/instructions/instructions.py +++ b/handlers/instructions/instructions.py @@ -7,6 +7,7 @@ from aiogram import F, Router from aiogram.types import CallbackQuery, InlineKeyboardButton, Message from aiogram.utils.keyboard import InlineKeyboardBuilder +from core.bootstrap import MODES_CONFIG from config import ( CONNECT_MACOS, CONNECT_WINDOWS, @@ -14,8 +15,10 @@ from config import ( DOWNLOAD_PC, SUPPORT_CHAT_URL, WEBHOOK_HOST, + REMNAWAVE_WEBAPP, + HAPP_CRYPTOLINK, ) -from database import get_subscription_link +from database import get_subscription_link, get_key_details from handlers.buttons import ( BACK, CONNECT_MACOS_BUTTON, @@ -38,7 +41,8 @@ from handlers.texts import ( ROUTER_MESSAGE, SUBSCRIPTION_DETAILS_TEXT, ) -from handlers.utils import edit_or_send_message +from handlers.utils import edit_or_send_message, is_full_remnawave_cluster +from hooks.processors import process_remnawave_webapp_override router = Router() @@ -165,9 +169,39 @@ async def process_macos_menu(callback_query: CallbackQuery, session: Any): async def process_connect_tv(callback_query: CallbackQuery, session: Any): key_name = callback_query.data.split("|")[1] + record = await get_key_details(session, key_name) + final_link = None + is_full_remnawave = False + use_webapp = False + + if record: + server_name = record["server_id"] + final_link = record.get("key") or record.get("remnawave_link") + is_full_remnawave = await is_full_remnawave_cluster(server_name, session) + + remnawave_webapp_enabled = bool(MODES_CONFIG.get("REMNAWAVE_WEBAPP_ENABLED", REMNAWAVE_WEBAPP)) + happ_cryptolink_enabled = bool(MODES_CONFIG.get("HAPP_CRYPTOLINK_ENABLED", HAPP_CRYPTOLINK)) + + use_webapp = remnawave_webapp_enabled + if is_full_remnawave and final_link and remnawave_webapp_enabled and not happ_cryptolink_enabled: + use_webapp = await process_remnawave_webapp_override( + remnawave_webapp=remnawave_webapp_enabled, + final_link=final_link, + session=session, + ) + + is_remnawave_webapp = bool(is_full_remnawave and final_link and use_webapp and not happ_cryptolink_enabled) + else: + is_remnawave_webapp = False + + if is_remnawave_webapp: + back_callback = f"view_key|{key_name}" + else: + back_callback = f"connect_device|{key_name}" + builder = InlineKeyboardBuilder() builder.row(InlineKeyboardButton(text=TV_CONTINUE, callback_data=f"continue_tv|{key_name}")) - builder.row(InlineKeyboardButton(text=BACK, callback_data=f"connect_device|{key_name}")) + builder.row(InlineKeyboardButton(text=BACK, callback_data=back_callback)) builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) await edit_or_send_message(