@echo off setlocal EnableExtensions EnableDelayedExpansion title RasiTech Installer color 0A REM ========================= REM KONFIG REM ========================= set "REMOTE_ROOT=https://note.rasitech.org" set "REMOTE_INDEX=%REMOTE_ROOT%/file.php" set "REMOTE_DIR=%REMOTE_ROOT%/installer" set "WORKDIR=%TEMP%\rt_installer" set "CACHE=%WORKDIR%\cache" set "LOG=%WORKDIR%\install.log" set "PAGE=0" set "PAGE_SIZE=20" set "ROWS=10" set "COLW=46" if not exist "%WORKDIR%" mkdir "%WORKDIR%" >nul 2>&1 if not exist "%CACHE%" mkdir "%CACHE%" >nul 2>&1 echo [%DATE% %TIME%] START > "%LOG%" call :EnsureDeps || goto :END_FAIL :REFRESH call :FetchIndex || goto :END_FAIL set /a LASTPAGE=(COUNT-1)/PAGE_SIZE if %PAGE% GTR %LASTPAGE% set "PAGE=%LASTPAGE%" if %PAGE% LSS 0 set "PAGE=0" :MENU cls call :Banner echo. set /a START=PAGE*PAGE_SIZE+1 set /a END=START+PAGE_SIZE-1 if %END% GTR %COUNT% set "END=%COUNT%" set /a SHOWN=END-START+1 set /a PAGE_NO=PAGE+1 set /a LAST_NO=LASTPAGE+1 echo Pilih tool (Halaman %PAGE_NO%/%LAST_NO%) echo. REM ===== 2 kolom, 10 baris per kolom for /L %%r in (0,1,9) do ( set /a L=START+%%r set /a R=START+%%r+ROWS set "LEFT=" set "RIGHT=" if !L! LEQ %END% ( call set "LT=%%TITLE[!L!]%%" set "LEFT=!L!. !LT!" call :TruncAndPad "LEFT" %COLW% ) else ( set "LEFT=" call :TruncAndPad "LEFT" %COLW% ) if !R! LEQ %END% ( call set "RT=%%TITLE[!R!]%%" set "RIGHT=!R!. !RT!" ) echo !LEFT!!RIGHT! ) echo. echo N. Next P. Prev R. Refresh Q. Keluar echo. set "SEL=" set /p "SEL=Pilihan (angka/N/P/R/Q): " if not defined SEL goto :MENU for /f "tokens=* delims= " %%A in ("%SEL%") do set "SEL=%%A" if /I "%SEL%"=="Q" goto :END_OK if /I "%SEL%"=="R" goto :REFRESH if /I "%SEL%"=="N" ( if %PAGE% LSS %LASTPAGE% set /a PAGE+=1 goto :MENU ) if /I "%SEL%"=="P" ( if %PAGE% GTR 0 set /a PAGE-=1 goto :MENU ) echo(%SEL%| findstr /r "^[0-9][0-9]*$" >nul if errorlevel 1 ( echo. echo [!] Input tidak valid. pause goto :MENU ) set "IDX=%SEL%" if %IDX% LSS 1 ( echo. echo [!] Pilihan di luar range. pause goto :MENU ) if %IDX% GTR %COUNT% ( echo. echo [!] Pilihan di luar range. pause goto :MENU ) call set "FNAME=%%FILE[%IDX%]%%" call set "RUN_TITLE=%%TITLE[%IDX%]%%" set "REMOTE_FILE=%REMOTE_DIR%/%FNAME%" set "LOCAL_FILE=%CACHE%\%FNAME%" echo [%DATE% %TIME%] RUN %FNAME%>>"%LOG%" call :Download "%REMOTE_FILE%" "%LOCAL_FILE%" if errorlevel 1 ( echo. echo [X] Gagal download modul. echo Cek log: %LOG% pause goto :MENU ) if not exist "%LOCAL_FILE%" ( echo. echo [X] Modul tidak ada setelah didownload: %LOCAL_FILE% pause goto :MENU ) cls call :Banner echo. echo [*] Menjalankan: %RUN_TITLE% echo. set "RT_BOOT=%~f0" set "RT_WORKDIR=%WORKDIR%" set "RT_REMOTE_ROOT=%REMOTE_ROOT%" set "RT_REMOTE_DIR=%REMOTE_DIR%" set "RT_LOG=%LOG%" call "%LOCAL_FILE%" "%RT_BOOT%" "%RT_WORKDIR%" "%RT_REMOTE_ROOT%" "%RT_LOG%" "%RT_REMOTE_DIR%" set "RC=%ERRORLEVEL%" echo. if "%RC%"=="0" ( echo [OK] Selesai. ) else ( echo [X] Gagal (code %RC%). Cek log: %LOG% ) pause goto :MENU REM ========================= REM Ambil files[] dari file.php REM ========================= :FetchIndex set "COUNT=0" for /f "usebackq delims=" %%F in (`powershell -NoProfile -ExecutionPolicy Bypass -Command ^ "try{ $r=Invoke-RestMethod '%REMOTE_INDEX%'; if($r.status -ne 'success'){ exit 2 }; $r.files | ForEach-Object { $_ }; exit 0 }catch{ exit 1 }"`) do ( set "ONE=%%F" if /I "!ONE:~-4!"==".bat" ( set /a COUNT+=1 set "FILE[!COUNT!]=!ONE!" call :NiceTitle "!ONE!" TT set "TITLE[!COUNT!]=!TT!" set "TT=" ) ) if "%COUNT%"=="0" ( echo [X] Tidak ada modul .bat dari index. exit /b 1 ) exit /b 0 :NiceTitle setlocal EnableDelayedExpansion set "S=%~1" set "S=!S:.bat=!" set "S=!S:_= !" set "S=!S:-= !" endlocal & set "%~2=%S%" exit /b 0 REM ========================= REM Truncate + pad kolom kiri REM ========================= :TruncAndPad REM %1=varname, %2=width setlocal EnableDelayedExpansion set "VN=%~1" set /a W=%~2 REM ambil value variable secara aman call set "OUT=%%%VN%%%" if not defined OUT set "OUT=" REM truncate kalau kepanjangan if not "!OUT!"=="" ( if not "!OUT:~%W%,1!"=="" ( set /a TL=W-3 if !TL! LSS 0 set "TL=0" call set "OUT=%%OUT:~0,!TL!%%" set "OUT=!OUT!..." ) ) REM pad kanan sampai width for /l %%i in (1,1,200) do ( if "!OUT:~%W%,1!"=="" set "OUT=!OUT! " ) set "OUT=!OUT:~0,%W%!" endlocal & set "%~1=%OUT%" exit /b 0 REM ========================= REM Download (URL tidak di-echo) REM ========================= :Download setlocal set "URL=%~1" set "OUT=%~2" echo [%DATE% %TIME%] DOWNLOAD>>"%LOG%" where curl >nul 2>&1 if not errorlevel 1 ( curl -fL --retry 3 --retry-delay 2 "%URL%" -o "%OUT%" >>"%LOG%" 2>&1 if errorlevel 1 endlocal & exit /b 1 ) else ( powershell -NoProfile -ExecutionPolicy Bypass -Command ^ "try{ Invoke-WebRequest -Uri '%URL%' -OutFile '%OUT%'; exit 0 }catch{ exit 1 }" >>"%LOG%" 2>&1 if errorlevel 1 endlocal & exit /b 1 ) if not exist "%OUT%" endlocal & exit /b 1 endlocal & exit /b 0 :EnsureDeps where powershell >nul 2>&1 || ( echo [X] PowerShell tidak ditemukan. exit /b 1 ) exit /b 0 :Banner echo ========================================== echo RasiTech Installer echo ========================================== exit /b 0 :END_OK echo. echo Selesai. exit /b 0 :END_FAIL echo. echo [X] Error. Cek log: %LOG% exit /b 1