Merge pull request #2483 from BEDOLAGA-DEV/dev

Dev
This commit is contained in:
Egor
2026-02-01 17:28:42 +03:00
committed by GitHub
2 changed files with 62 additions and 23 deletions
+34 -13
View File
@@ -3388,26 +3388,45 @@ async def reduce_devices(
detail=f'Cannot reduce below minimum device limit ({min_device_limit}) for your tariff',
)
# Get connected devices count and reset if needed
# Get connected devices and remove excess (last connected ones)
connected_devices_count = 0
devices_reset = False
devices_removed_count = 0
if user.remnawave_uuid:
try:
service = RemnaWaveService()
async with service.get_api_client() as api:
response = await api._make_request('GET', f'/api/hwid/devices/{user.remnawave_uuid}')
if response and 'response' in response:
connected_devices_count = response['response'].get('total', 0)
devices_list = response['response'].get('devices', [])
connected_devices_count = len(devices_list)
# If connected devices exceed new limit, reset all devices
if connected_devices_count > new_device_limit:
await api.reset_user_devices(user.remnawave_uuid)
devices_reset = True
logger.info(
f'Reset devices for user {user.id}: had {connected_devices_count}, new limit {new_device_limit}'
)
# If connected devices exceed new limit, remove excess (last connected)
if connected_devices_count > new_device_limit:
devices_to_remove = connected_devices_count - new_device_limit
logger.info(
f'Removing {devices_to_remove} excess devices for user {user.id}: '
f'had {connected_devices_count}, new limit {new_device_limit}'
)
# Sort by date (oldest first) and remove the last ones
sorted_devices = sorted(
devices_list,
key=lambda d: d.get('updatedAt') or d.get('createdAt') or '',
)
devices_to_delete = sorted_devices[-devices_to_remove:]
for device in devices_to_delete:
device_hwid = device.get('hwid')
if device_hwid:
try:
delete_data = {'userUuid': user.remnawave_uuid, 'hwid': device_hwid}
await api._make_request('POST', '/api/hwid/devices/delete', data=delete_data)
devices_removed_count += 1
logger.info(f'Removed device {device_hwid} for user {user.id}')
except Exception as del_error:
logger.error(f'Error removing device {device_hwid}: {del_error}')
except Exception as e:
logger.error(f'Error checking/resetting devices: {e}')
logger.error(f'Error checking/removing devices: {e}')
old_device_limit = current_device_limit
@@ -3425,14 +3444,16 @@ async def reduce_devices(
logger.info(
f'User {user.id} reduced device limit from {old_device_limit} to {new_device_limit}'
+ (' (devices reset)' if devices_reset else '')
+ (f' (removed {devices_removed_count} devices)' if devices_removed_count > 0 else '')
)
return {
'success': True,
'message': 'Device limit reduced successfully' + (' (devices reset)' if devices_reset else ''),
'message': 'Device limit reduced successfully'
+ (f' ({devices_removed_count} devices removed)' if devices_removed_count > 0 else ''),
'old_device_limit': old_device_limit,
'new_device_limit': new_device_limit,
'devices_removed': devices_removed_count,
}
+28 -10
View File
@@ -561,7 +561,7 @@ async def execute_change_devices(callback: types.CallbackQuery, db_user: User, d
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:
@@ -572,16 +572,34 @@ async def execute_change_devices(callback: types.CallbackQuery, db_user: User, d
devices_list = response['response'].get('devices', [])
connected_count = len(devices_list)
# Если подключённых устройств больше чем новый лимит - сбросить все
# Если подключённых устройств больше чем новый лимит - удалить лишние
if connected_count > new_devices_count:
devices_to_remove = connected_count - new_devices_count
logger.info(
f'🔧 Сброс устройств при уменьшении лимита: '
f'подключено {connected_count}, новый лимит {new_devices_count}'
f'🔧 Удаление лишних устройств при уменьшении лимита: '
f'подключено {connected_count}, новый лимит {new_devices_count}, '
f'удаляем {devices_to_remove}'
)
await api.reset_user_devices(db_user.remnawave_uuid)
devices_reset_count = connected_count
# Сортируем по дате (последние в конце) и удаляем последние
sorted_devices = sorted(
devices_list,
key=lambda d: d.get('updatedAt') or d.get('createdAt') or '',
)
devices_to_delete = sorted_devices[-devices_to_remove:]
for device in devices_to_delete:
device_hwid = device.get('hwid')
if device_hwid:
try:
delete_data = {'userUuid': db_user.remnawave_uuid, 'hwid': device_hwid}
await api._make_request('POST', '/api/hwid/devices/delete', data=delete_data)
devices_reset_count += 1
logger.info(f'✅ Удалено устройство {device_hwid}')
except Exception as del_error:
logger.error(f'Ошибка удаления устройства {device_hwid}: {del_error}')
except Exception as reset_error:
logger.error(f'Ошибка сброса устройств при уменьшении лимита: {reset_error}')
logger.error(f'Ошибка удаления устройств при уменьшении лимита: {reset_error}')
await db.refresh(db_user)
await db.refresh(subscription)
@@ -621,9 +639,9 @@ async def execute_change_devices(callback: types.CallbackQuery, db_user: User, d
).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)
'DEVICE_CHANGE_DEVICES_REMOVED',
'\n🗑 Удалено устройств: {count}\n',
).format(count=devices_reset_count)
success_text += texts.t(
'DEVICE_CHANGE_NO_REFUND_INFO',
'ℹ️ Возврат средств не производится',