From 040f3f1cdaa8ee9c22260d51db8335fb9857bc47 Mon Sep 17 00:00:00 2001 From: Vladless Date: Fri, 30 May 2025 22:12:16 +0300 Subject: [PATCH] fix remna traffic for create_key --- handlers/admin/users/users_handler.py | 46 +++++++++++++--------- handlers/keys/key_mode/key_country_mode.py | 5 +-- handlers/keys/key_mode/key_create.py | 7 ++-- handlers/keys/key_renew.py | 7 ++-- handlers/keys/key_utils.py | 2 +- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/handlers/admin/users/users_handler.py b/handlers/admin/users/users_handler.py index dab9de22..9c0b8790 100644 --- a/handlers/admin/users/users_handler.py +++ b/handlers/admin/users/users_handler.py @@ -895,26 +895,23 @@ async def confirm_admin_key_reissue( if USE_COUNTRY_SELECTION: unique_countries = {srv["server_name"] for srv in cluster_servers} - - if len(unique_countries) > 1: - await state.update_data(tg_id=tg_id, email=email, cluster_id=cluster_id) - - builder = InlineKeyboardBuilder() - for country in sorted(unique_countries): - builder.button( - text=country, - callback_data=f"admin_reissue_country|{tg_id}|{email}|{country}", - ) - builder.row( - InlineKeyboardButton( - text="Назад", callback_data=f"users_key_edit|{email}" - ) + await state.update_data(tg_id=tg_id, email=email, cluster_id=cluster_id) + builder = InlineKeyboardBuilder() + for country in sorted(unique_countries): + builder.button( + text=country, + callback_data=f"admin_reissue_country|{tg_id}|{email}|{country}", ) - await callback_query.message.edit_text( - "🌍 Выберите страну, на которой пересоздать подписку:", - reply_markup=builder.as_markup(), + builder.row( + InlineKeyboardButton( + text="Назад", callback_data=f"users_key_edit|{email}" ) - return + ) + await callback_query.message.edit_text( + "🌍 Выберите сервер (страну) для пересоздания подписки:", + reply_markup=builder.as_markup(), + ) + return result = await session.execute( select(Key.remnawave_link).where(Key.email == email) @@ -941,7 +938,18 @@ async def admin_reissue_country(callback_query: CallbackQuery, session: AsyncSes tg_id = int(tg_id) try: - await update_subscription(tg_id, email, session, country_override=country) + result = await session.execute( + select(Key.remnawave_link, Key.tariff_id).where(Key.email == email) + ) + remnawave_link, tariff_id = result.one_or_none() or (None, None) + + await update_subscription( + tg_id=tg_id, + email=email, + session=session, + country_override=country, + remnawave_link=remnawave_link, + ) await handle_key_edit( callback_query, diff --git a/handlers/keys/key_mode/key_country_mode.py b/handlers/keys/key_mode/key_country_mode.py index c75b5237..05956f6d 100644 --- a/handlers/keys/key_mode/key_country_mode.py +++ b/handlers/keys/key_mode/key_country_mode.py @@ -352,6 +352,7 @@ async def finalize_key_creation( client_id = old_key_details["client_id"] email = old_key_details["email"] expiry_timestamp = old_key_details["expiry_time"] + tariff_id = old_key_details.get("tariff_id") or tariff_id else: while True: key_name = generate_random_email() @@ -376,7 +377,7 @@ async def finalize_key_creation( tariff = result.scalar_one_or_none() if tariff: if tariff.traffic_limit is not None: - traffic_limit_bytes = int(tariff.traffic_limit) + traffic_limit_bytes = int(tariff.traffic_limit) * 1024**3 if tariff.device_limit is not None: device_limit = int(tariff.device_limit) @@ -543,8 +544,6 @@ async def finalize_key_creation( builder.row(InlineKeyboardButton(text=SUPPORT, url=SUPPORT_CHAT_URL)) builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) - remaining_time = expiry_time - datetime.now(moscow_tz) - days = remaining_time.days link_to_show = public_link or remnawave_link or "Ссылка не найдена" tariff_info = None diff --git a/handlers/keys/key_mode/key_create.py b/handlers/keys/key_mode/key_create.py index a42d45a7..fed1937c 100644 --- a/handlers/keys/key_mode/key_create.py +++ b/handlers/keys/key_mode/key_create.py @@ -6,6 +6,7 @@ from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, InlineKeyboardButton, Message from aiogram.utils.keyboard import InlineKeyboardBuilder +from math import ceil from config import ( NOTIFY_EXTRA_DAYS, @@ -144,11 +145,11 @@ async def select_tariff_plan( duration_days = tariff["duration_days"] price_rub = tariff["price_rub"] - balance = round(await get_balance(session, tg_id)) - price_rub = round(tariff["price_rub"]) + balance = await get_balance(session, tg_id) + price_rub = tariff["price_rub"] if balance < price_rub: - required_amount = max(price_rub - balance, 0) + required_amount = ceil(price_rub - balance) await create_temporary_data( session, tg_id, diff --git a/handlers/keys/key_renew.py b/handlers/keys/key_renew.py index c7a92059..aa2e886e 100644 --- a/handlers/keys/key_renew.py +++ b/handlers/keys/key_renew.py @@ -6,6 +6,7 @@ from aiogram.types import CallbackQuery, InlineKeyboardButton from aiogram.utils.keyboard import InlineKeyboardBuilder from sqlalchemy import or_, select, update from sqlalchemy.ext.asyncio import AsyncSession +from math import ceil from bot import bot from config import USE_NEW_PAYMENT_FLOW @@ -19,7 +20,6 @@ from database import ( update_balance, update_key_expiry, check_tariff_exists, - get_tariffs_for_cluster, ) from database.models import Server, Key from handlers.buttons import BACK, MAIN_MENU, PAYMENT @@ -34,6 +34,7 @@ from handlers.texts import ( PLAN_SELECTION_MSG, SUCCESS_RENEWAL_MSG, ) +from handlers.buttons import MY_SUB from handlers.utils import edit_or_send_message, format_days, format_months from logger import logger @@ -180,7 +181,7 @@ async def process_callback_renew_plan(callback_query: CallbackQuery, session: An balance = round(await get_balance(session, tg_id), 2) cost = round(cost, 2) if balance < cost: - required_amount = round(cost - balance, 2) + required_amount = ceil(cost - balance) logger.info(f"[RENEW] Недостаточно средств: {required_amount}₽") await create_temporary_data( @@ -288,7 +289,7 @@ async def complete_key_renewal( months_formatted = format_days(tariff["duration_days"]) builder = InlineKeyboardBuilder() - builder.row(InlineKeyboardButton(text=MAIN_MENU, callback_data="profile")) + builder.row(InlineKeyboardButton(text=MY_SUB, callback_data=f"view_key|{email}")) response_message = SUCCESS_RENEWAL_MSG.format(months_formatted=months_formatted) if callback_query: diff --git a/handlers/keys/key_utils.py b/handlers/keys/key_utils.py index 25579c49..fe6dc3b6 100644 --- a/handlers/keys/key_utils.py +++ b/handlers/keys/key_utils.py @@ -584,7 +584,7 @@ async def update_key_on_cluster( "activeUserInbounds": inbound_ids, } if traffic_limit is not None: - user_data["trafficLimitBytes"] = traffic_limit + user_data["trafficLimitBytes"] = traffic_limit * 1024 ** 3 if device_limit is not None: user_data["hwidDeviceLimit"] = device_limit if short_uuid: