Загрузка данных


@echo off
setlocal DisableDelayedExpansion

rem ==================================================
rem Gizmo API
rem ==================================================
set "API_BASE=https://192.168.88.50"
set "API_USER=admin"
set "API_PASSWORD=ВСТАВЬТЕ_НОВЫЙ_ПАРОЛЬ"

rem ==================================================
rem NetPing
rem ==================================================
set "NETPING_IP=192.168.88.236"
set "NETPING_USER=visor"
set "NETPING_PASSWORD=ВСТАВЬТЕ_ПАРОЛЬ_NETPING"

rem ==================================================
rem Gizmo console ID -> User ID -> NetPing relay
rem Замените 23 и 24 на номера консолей в Gizmo.
rem Для второй консоли укажите настоящий USER_ID.
rem ==================================================
set "GIZMO_SELECTED_USER_ID="
set "RELAY="

if "%~1"=="23" (
    set "GIZMO_SELECTED_USER_ID=91580"
    set "RELAY=1"
)

if "%~1"=="24" (
    set "GIZMO_SELECTED_USER_ID=ВТОРОЙ_USER_ID"
    set "RELAY=2"
)

if not defined GIZMO_SELECTED_USER_ID (
    echo ERROR: Unknown Gizmo console ID: %~1
    exit /b 2
)

if not defined RELAY (
    echo ERROR: NetPing relay is not configured.
    exit /b 3
)

rem ==================================================
rem Temporary files
rem ==================================================
set "GIZMO_RESPONSE_FILE=%TEMP%\gizmo_poweroff_%RANDOM%_%RANDOM%.json"
set "GIZMO_BALANCE_FILE=%TEMP%\gizmo_balance_%RANDOM%_%RANDOM%.txt"
set "BALANCE="

rem ==================================================
rem 1. Logout Gizmo user
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
  --connect-timeout 5 --max-time 15 ^
  --basic ^
  --user "%API_USER%:%API_PASSWORD%" ^
  --request POST ^
  --data "" ^
  --header "Accept: application/json" ^
  "%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/logout" ^
  --output "%GIZMO_RESPONSE_FILE%"

if errorlevel 1 goto :logout_error

rem ==================================================
rem 2. Request user balance
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
  --connect-timeout 5 --max-time 15 ^
  --basic ^
  --user "%API_USER%:%API_PASSWORD%" ^
  --header "Accept: application/json" ^
  "%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/balance" ^
  --output "%GIZMO_RESPONSE_FILE%"

if errorlevel 1 goto :balance_error

rem ==================================================
rem 3. Extract result.balance from JSON
rem Also verify that returned userId matches mapped user.
rem ==================================================
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
  "$j=Get-Content -Raw -LiteralPath $env:GIZMO_RESPONSE_FILE | ConvertFrom-Json;" ^
  "if($null -ne $j.isError -and [bool]$j.isError){exit 2};" ^
  "if($null -ne $j.result){$r=$j.result}else{$r=$j};" ^
  "if($null -eq $r.userId -or [int]$r.userId -ne [int]$env:GIZMO_SELECTED_USER_ID){exit 3};" ^
  "if($null -eq $r.balance){exit 4};" ^
  "$b=[decimal]$r.balance;" ^
  "if($b -lt 0){exit 5};" ^
  "$s=$b.ToString('0.################',[Globalization.CultureInfo]::InvariantCulture);" ^
  "[IO.File]::WriteAllText($env:GIZMO_BALANCE_FILE,$s);"

if errorlevel 1 goto :balance_parse_error
if not exist "%GIZMO_BALANCE_FILE%" goto :balance_parse_error

set /p "BALANCE="<"%GIZMO_BALANCE_FILE%"

if not defined BALANCE goto :balance_parse_error

echo User %GIZMO_SELECTED_USER_ID% balance: %BALANCE%

rem Zero balance does not need a withdrawal request
if "%BALANCE%"=="0" goto :power_off

rem ==================================================
rem 4. Withdraw the entire current balance
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
  --connect-timeout 5 --max-time 15 ^
  --basic ^
  --user "%API_USER%:%API_PASSWORD%" ^
  --request DELETE ^
  --header "Accept: application/json" ^
  "%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/deposit/%BALANCE%" ^
  --output "%GIZMO_RESPONSE_FILE%"

if errorlevel 1 goto :withdraw_error

rem ==================================================
rem 5. Request balance again and verify that it is zero
rem ==================================================
curl.exe --insecure --silent --show-error --fail ^
  --connect-timeout 5 --max-time 15 ^
  --basic ^
  --user "%API_USER%:%API_PASSWORD%" ^
  --header "Accept: application/json" ^
  "%API_BASE%/api/users/%GIZMO_SELECTED_USER_ID%/balance" ^
  --output "%GIZMO_RESPONSE_FILE%"

if errorlevel 1 goto :verification_error

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^
  "$j=Get-Content -Raw -LiteralPath $env:GIZMO_RESPONSE_FILE | ConvertFrom-Json;" ^
  "if($null -ne $j.isError -and [bool]$j.isError){exit 2};" ^
  "if($null -ne $j.result){$r=$j.result}else{$r=$j};" ^
  "if($null -eq $r.userId -or [int]$r.userId -ne [int]$env:GIZMO_SELECTED_USER_ID){exit 3};" ^
  "if($null -eq $r.balance){exit 4};" ^
  "if([decimal]$r.balance -ne 0){exit 5};"

if errorlevel 1 goto :verification_error

rem ==================================================
rem 6. Switch off the mapped NetPing outlet
rem ==================================================
:power_off

curl.exe --silent --show-error --fail --anyauth ^
  --connect-timeout 5 --max-time 10 ^
  --user "%NETPING_USER%:%NETPING_PASSWORD%" ^
  "http://%NETPING_IP%/relay.cgi?r%RELAY%=0" ^
  --output "%GIZMO_RESPONSE_FILE%"

if errorlevel 1 goto :netping_error

findstr /i /c:"error" "%GIZMO_RESPONSE_FILE%" >nul
if not errorlevel 1 goto :netping_rejected

findstr /i /c:"ok" "%GIZMO_RESPONSE_FILE%" >nul
if errorlevel 1 goto :netping_rejected

echo SUCCESS: User logged out, balance withdrawn and relay %RELAY% switched off.
goto :success

:logout_error
echo ERROR: Gizmo user logout failed.
set "EXIT_CODE=10"
goto :failed

:balance_error
echo ERROR: Could not request Gizmo user balance.
set "EXIT_CODE=11"
goto :failed

:balance_parse_error
echo ERROR: Could not parse or validate Gizmo user balance.
set "EXIT_CODE=12"
goto :failed

:withdraw_error
echo ERROR: Balance withdrawal failed.
set "EXIT_CODE=13"
goto :failed

:verification_error
echo ERROR: Balance was not confirmed as zero.
set "EXIT_CODE=14"
goto :failed

:netping_error
echo ERROR: Could not connect to NetPing.
set "EXIT_CODE=15"
goto :failed

:netping_rejected
echo ERROR: NetPing rejected the command.
set "EXIT_CODE=16"
goto :failed

:success
del "%GIZMO_RESPONSE_FILE%" 2>nul
del "%GIZMO_BALANCE_FILE%" 2>nul
exit /b 0

:failed
del "%GIZMO_RESPONSE_FILE%" 2>nul
del "%GIZMO_BALANCE_FILE%" 2>nul
exit /b %EXIT_CODE%