From 265d2b907b271c7da53cf72d4e01f040cb912f68 Mon Sep 17 00:00:00 2001 From: gy9vin Date: Fri, 26 Dec 2025 09:00:56 +0300 Subject: [PATCH] =?UTF-8?q?fix(devices):=20=D1=81=D0=B1=D1=80=D0=BE=D1=81?= =?UTF-8?q?=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D1=83=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При уменьшении лимита устройств подключённые устройства не удалялись, позволяя пользователю продолжать использовать их бесплатно. Исправления: - execute_change_devices: сброс всех устройств через API если подключённых больше чем новый лимит - confirm_change_devices: предупреждение пользователя о сбросе устройств перед подтверждением - Уведомление о количестве сброшенных устройств в результате --- app/handlers/subscription/devices.py | 53 ++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/app/handlers/subscription/devices.py b/app/handlers/subscription/devices.py index cecfdf22..034e9e68 100644 --- a/app/handlers/subscription/devices.py +++ b/app/handlers/subscription/devices.py @@ -355,6 +355,28 @@ async def confirm_change_devices( ).format(count=new_devices_count) cost_text = texts.t("DEVICE_CHANGE_NO_REFUND", "Возврат средств не производится") + # Проверяем количество подключённых устройств для предупреждения + devices_warning = "" + if new_devices_count < current_devices and db_user.remnawave_uuid: + try: + service = RemnaWaveService() + async with service.get_api_client() as api: + response = await api._make_request('GET', f'/api/hwid/devices/{db_user.remnawave_uuid}') + if response and 'response' in response: + connected_count = response['response'].get('total', 0) + if connected_count > new_devices_count: + devices_warning = texts.t( + "DEVICE_CHANGE_RESET_WARNING", + ( + "\n⚠️ Внимание!\n" + "У вас подключено {connected} устройств.\n" + "При уменьшении лимита до {new} все устройства будут сброшены.\n" + "Вам нужно будет заново подключить нужные устройства.\n" + ), + ).format(connected=connected_count, new=new_devices_count) + except Exception as e: + logger.error(f"Ошибка проверки устройств: {e}") + confirm_text = texts.t( "DEVICE_CHANGE_CONFIRMATION", ( @@ -372,6 +394,9 @@ async def confirm_change_devices( cost=cost_text, ) + if devices_warning: + confirm_text += devices_warning + await callback.message.edit_text( confirm_text, reply_markup=get_confirm_change_devices_keyboard(new_devices_count, price, db_user.language), @@ -431,6 +456,28 @@ async def execute_change_devices( subscription_service = SubscriptionService() await subscription_service.update_remnawave_user(db, subscription) + # При уменьшении лимита - сбросить лишние устройства + devices_reset_count = 0 + if new_devices_count < current_devices and db_user.remnawave_uuid: + try: + service = RemnaWaveService() + async with service.get_api_client() as api: + response = await api._make_request('GET', f'/api/hwid/devices/{db_user.remnawave_uuid}') + if response and 'response' in response: + devices_list = response['response'].get('devices', []) + connected_count = len(devices_list) + + # Если подключённых устройств больше чем новый лимит - сбросить все + if connected_count > new_devices_count: + logger.info( + f"🔧 Сброс устройств при уменьшении лимита: " + f"подключено {connected_count}, новый лимит {new_devices_count}" + ) + await api.reset_user_devices(db_user.remnawave_uuid) + devices_reset_count = connected_count + except Exception as reset_error: + logger.error(f"Ошибка сброса устройств при уменьшении лимита: {reset_error}") + await db.refresh(db_user) await db.refresh(subscription) @@ -466,6 +513,12 @@ async def execute_change_devices( "DEVICE_CHANGE_RESULT_LINE", "📱 Было: {old} → Стало: {new}\n", ).format(old=current_devices, new=new_devices_count) + if devices_reset_count > 0: + success_text += texts.t( + "DEVICE_CHANGE_DEVICES_RESET", + "\n🔄 Сброшено устройств: {count}\n" + "💡 Подключите заново нужные устройства (до {limit} шт.)\n\n", + ).format(count=devices_reset_count, limit=new_devices_count) success_text += texts.t( "DEVICE_CHANGE_NO_REFUND_INFO", "ℹ️ Возврат средств не производится",