Architecture: two backends, first one that works wins at runtime (ocr.py). 1. tesserocr — C extension via conda tesseract 4.x DLLs + bundled wheel (fast) 2. pytesseract — subprocess via winget tesseract.exe (always works if exe exists) Install changes: - tesserocr setup: best-effort, never fatal. Wheel install failure or DLL mismatch just falls through to pytesseract. Removes the hard-exit on missing wheel. - pytesseract setup: winget install with a manual download link fallback for Win10 users where winget is unavailable. pytesseract is now in requirements.txt so it is always importable. - OCR verification: tests BOTH backends after setup, reports which is active. Warns clearly if neither works rather than silently leaving OCR broken. Sets ALL_OK=0 so the installer ends with a visible failure state. - Dependency loop: removes tesserocr from the import check — OCR is now verified end-to-end by the backend test above, not by a bare import. - Removes the broken pytesseract source-patch block (syntax error, never ran). - TESS_PATH hoisted to :env_found so it is available for the OCR check. requirements.txt: add pytesseract (pure Python, no native deps). Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
292 lines
9.4 KiB
Batchfile
292 lines
9.4 KiB
Batchfile
@echo off
|
|
setlocal enabledelayedexpansion
|
|
|
|
:: Always run from the folder this script lives in
|
|
cd /d "%~dp0"
|
|
|
|
echo ============================================
|
|
echo Botty - Dependency Installer
|
|
echo ============================================
|
|
echo.
|
|
|
|
:: --- Detect Windows version ---
|
|
for /f "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuild 2^>nul') do set "WIN_BUILD=%%A"
|
|
if not defined WIN_BUILD (
|
|
echo WARNING: Could not detect Windows build number.
|
|
set "WIN_BUILD=0"
|
|
)
|
|
echo Detected Windows build: %WIN_BUILD%
|
|
set /a "WIN_BUILD_NUM=%WIN_BUILD%" 2>nul || set "WIN_BUILD_NUM=0"
|
|
if %WIN_BUILD_NUM% GEQ 22000 (
|
|
echo Detected Windows 11 — using relative mouse mode (no ABSOLUTE flag)
|
|
set "WIN11=1"
|
|
set "REQ_FILE=requirements-win11.txt"
|
|
set "ENV_FILE=environment-win11.yml"
|
|
) else (
|
|
echo Detected Windows 10 or earlier — using absolute mouse mode
|
|
set "WIN11=0"
|
|
set "REQ_FILE=requirements-win10.txt"
|
|
set "ENV_FILE=environment-win10.yml"
|
|
)
|
|
if not exist "%REQ_FILE%" set "REQ_FILE=requirements.txt"
|
|
if not exist "%ENV_FILE%" set "ENV_FILE=environment.yml"
|
|
echo Requirements profile: %REQ_FILE%
|
|
echo Environment profile: %ENV_FILE%
|
|
echo.
|
|
|
|
:: --- Find conda ---
|
|
set "CONDA_EXE="
|
|
for %%C in (
|
|
"%USERPROFILE%\miniforge3\Scripts\conda.exe"
|
|
"%USERPROFILE%\miniconda3\Scripts\conda.exe"
|
|
"%USERPROFILE%\anaconda3\Scripts\conda.exe"
|
|
"%ProgramData%\miniforge3\Scripts\conda.exe"
|
|
"%ProgramData%\miniconda3\Scripts\conda.exe"
|
|
"%ProgramData%\anaconda3\Scripts\conda.exe"
|
|
) do (
|
|
if exist %%C (
|
|
set "CONDA_EXE=%%~C"
|
|
goto :found_conda
|
|
)
|
|
)
|
|
|
|
echo ERROR: conda not found. Install Miniforge or Miniconda first:
|
|
echo https://github.com/conda-forge/miniforge/releases/latest
|
|
echo.
|
|
pause
|
|
exit /b 1
|
|
|
|
:found_conda
|
|
echo Found conda: %CONDA_EXE%
|
|
echo.
|
|
|
|
:: --- Test conda works ---
|
|
echo Testing conda...
|
|
"%CONDA_EXE%" --version >nul 2>&1
|
|
if %errorlevel% neq 0 (
|
|
echo.
|
|
echo ERROR: conda found but failed to run. Your conda installation may be broken.
|
|
echo Try re-installing Miniforge: https://github.com/conda-forge/miniforge
|
|
echo.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
echo conda is working.
|
|
echo.
|
|
|
|
:: --- Find botty Python ---
|
|
set "PYTHON="
|
|
for %%C in (
|
|
"%USERPROFILE%\miniforge3\envs\botty\python.exe"
|
|
"%USERPROFILE%\miniconda3\envs\botty\python.exe"
|
|
"%USERPROFILE%\anaconda3\envs\botty\python.exe"
|
|
"%ProgramData%\miniforge3\envs\botty\python.exe"
|
|
"%ProgramData%\miniconda3\envs\botty\python.exe"
|
|
"%ProgramData%\anaconda3\envs\botty\python.exe"
|
|
) do (
|
|
if exist %%C (
|
|
set "PYTHON=%%~C"
|
|
goto :check_env
|
|
)
|
|
)
|
|
|
|
:: --- Create botty env ---
|
|
echo Creating 'botty' conda environment...
|
|
"%CONDA_EXE%" env create -f "%ENV_FILE%"
|
|
if %errorlevel% neq 0 (
|
|
echo.
|
|
echo ERROR: conda env create failed. See output above.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
|
|
:check_env
|
|
:: Re-scan for Python after env creation
|
|
set "PYTHON="
|
|
for %%C in (
|
|
"%USERPROFILE%\miniforge3\envs\botty\python.exe"
|
|
"%USERPROFILE%\miniconda3\envs\botty\python.exe"
|
|
"%USERPROFILE%\anaconda3\envs\botty\python.exe"
|
|
"%ProgramData%\miniforge3\envs\botty\python.exe"
|
|
"%ProgramData%\miniconda3\envs\botty\python.exe"
|
|
"%ProgramData%\anaconda3\envs\botty\python.exe"
|
|
) do (
|
|
if exist %%C (
|
|
set "PYTHON=%%~C"
|
|
goto :env_ready
|
|
)
|
|
)
|
|
|
|
echo.
|
|
echo ERROR: botty env was created but python.exe was not found.
|
|
pause
|
|
exit /b 1
|
|
|
|
:env_ready
|
|
echo Botty Python: %PYTHON%
|
|
|
|
:: --- Install pip requirements ---
|
|
echo.
|
|
echo Installing Botty requirements from %REQ_FILE%...
|
|
"%CONDA_EXE%" run -n botty python -m pip install -r "%REQ_FILE%"
|
|
if %errorlevel% neq 0 (
|
|
echo.
|
|
echo ERROR: pip requirements install failed for %REQ_FILE%.
|
|
pause
|
|
exit /b 1
|
|
)
|
|
|
|
echo.
|
|
echo Botty osdetect:
|
|
"%CONDA_EXE%" run -n botty python -c "import sys; sys.path.insert(0, 'src'); from utils.os_detect import describe_current_os; print(describe_current_os())"
|
|
|
|
:: --- OCR setup ---
|
|
:: Two OCR backends, tried in order at runtime:
|
|
:: 1. tesserocr — C extension calling tesseract DLLs directly (fast)
|
|
:: 2. pytesseract — subprocess calling tesseract.exe (always works if exe exists)
|
|
:: At least one must work. Install.bat sets up both and reports which is ready.
|
|
echo.
|
|
echo Setting up OCR...
|
|
|
|
:: Find the botty env directory
|
|
set "BOTTY_ENV_DIR="
|
|
for %%C in (
|
|
"%USERPROFILE%\miniforge3\envs\botty"
|
|
"%USERPROFILE%\miniconda3\envs\botty"
|
|
"%USERPROFILE%\anaconda3\envs\botty"
|
|
"%ProgramData%\miniforge3\envs\botty"
|
|
"%ProgramData%\miniconda3\envs\botty"
|
|
"%ProgramData%\anaconda3\envs\botty"
|
|
) do (
|
|
if exist %%C (
|
|
set "BOTTY_ENV_DIR=%%~C"
|
|
goto :env_found
|
|
)
|
|
)
|
|
echo ERROR: Could not find botty env directory.
|
|
pause
|
|
exit /b 1
|
|
|
|
:env_found
|
|
set "TESS_PATH=%BOTTY_ENV_DIR%\Library\bin;%BOTTY_ENV_DIR%\Library\lib;%BOTTY_ENV_DIR%\DLLs;%BOTTY_ENV_DIR%\Scripts"
|
|
|
|
:: --- Backend 1: tesserocr (fast path, best-effort) ---
|
|
:: Needs tesseract 4.x DLLs from conda + the bundled Python wheel.
|
|
:: If anything here fails the bot still works via pytesseract below.
|
|
|
|
:: Remove any existing pip tesserocr (conda-forge build is broken on Windows)
|
|
"%PYTHON%" -m pip uninstall tesserocr -y >nul 2>&1
|
|
|
|
:: conda tesseract 4.x provides tesseract.dll / liblept.dll for the wheel
|
|
"%CONDA_EXE%" install -n botty "tesseract=4.*" -c conda-forge -y >nul 2>&1
|
|
|
|
:: conda tesseract.exe crashes on Win10 and Win11 — disable it, keep the DLLs
|
|
if exist "%BOTTY_ENV_DIR%\Library\bin\tesseract.exe" (
|
|
rename "%BOTTY_ENV_DIR%\Library\bin\tesseract.exe" "tesseract_disabled.exe" >nul 2>&1
|
|
)
|
|
|
|
:: Fix DLL names: conda calls them tesseract41.dll / leptonica-X.Y.Z.dll
|
|
if not exist "%BOTTY_ENV_DIR%\Library\bin\tesseract.dll" (
|
|
for %%F in ("%BOTTY_ENV_DIR%\Library\bin\tesseract4*.dll" "%BOTTY_ENV_DIR%\Library\bin\tesseract41.dll") do (
|
|
if exist %%F ( copy /y %%F "%BOTTY_ENV_DIR%\Library\bin\tesseract.dll" >nul )
|
|
)
|
|
)
|
|
if not exist "%BOTTY_ENV_DIR%\Library\bin\liblept.dll" (
|
|
for %%F in ("%BOTTY_ENV_DIR%\Library\bin\leptonica-*.dll") do (
|
|
if exist %%F ( copy /y %%F "%BOTTY_ENV_DIR%\Library\bin\liblept.dll" >nul )
|
|
)
|
|
)
|
|
|
|
:: Install bundled wheel (best-effort — skip if missing or wrong Python version)
|
|
if exist "dependencies\tesserocr-2.5.2-cp310-cp310-win_amd64.whl" (
|
|
"%CONDA_EXE%" run -n botty python -m pip install --quiet --force-reinstall --no-deps "dependencies\tesserocr-2.5.2-cp310-cp310-win_amd64.whl" >nul 2>&1
|
|
if %errorlevel% neq 0 (
|
|
echo tesserocr wheel install failed ^(wrong Python version?^) -- will use pytesseract
|
|
)
|
|
) else (
|
|
echo Bundled tesserocr wheel not found -- will use pytesseract
|
|
)
|
|
|
|
:: --- Backend 2: pytesseract (reliable fallback) ---
|
|
:: Needs tesseract.exe from winget. Works on any Python version.
|
|
:: On Win10: winget may not be available -- if install fails, offer manual link.
|
|
if not exist "C:\Program Files\Tesseract-OCR\tesseract.exe" (
|
|
echo Installing Tesseract OCR via winget...
|
|
winget install --id tesseract-ocr.tesseract --silent --accept-package-agreements --accept-source-agreements 2>nul
|
|
if %errorlevel% neq 0 (
|
|
echo winget failed -- on Windows 10 you may need to install manually:
|
|
echo https://github.com/tesseract-ocr/tesseract/releases
|
|
echo Download the win64 installer, run it, keep the default install path.
|
|
)
|
|
)
|
|
|
|
:: --- Verify OCR: at least one backend must work ---
|
|
echo.
|
|
echo Checking OCR backends...
|
|
set "PATH=%TESS_PATH%;%PATH%"
|
|
set "OCR_READY=0"
|
|
|
|
"%CONDA_EXE%" run -n botty python -c "import os; os.add_dll_directory(r'%BOTTY_ENV_DIR%\Library\bin'); from tesserocr import PyTessBaseAPI, OEM; PyTessBaseAPI(psm=7,oem=OEM.LSTM_ONLY,path='assets/tessdata',lang='hover-eng_inconsolata_inv_th_fast').End()" >nul 2>&1
|
|
if %errorlevel% == 0 (
|
|
echo tesserocr: OK ^(fast path^)
|
|
set "OCR_READY=1"
|
|
) else (
|
|
echo tesserocr: not available ^(DLL mismatch -- normal on some systems^)
|
|
)
|
|
|
|
if exist "C:\Program Files\Tesseract-OCR\tesseract.exe" (
|
|
"%CONDA_EXE%" run -n botty python -c "import pytesseract; pytesseract.pytesseract.tesseract_cmd=r'C:\Program Files\Tesseract-OCR\tesseract.exe'; pytesseract.get_tesseract_version()" >nul 2>&1
|
|
if %errorlevel% == 0 (
|
|
echo pytesseract: OK ^(reliable fallback^)
|
|
set "OCR_READY=1"
|
|
) else (
|
|
echo pytesseract: tesseract.exe found but call failed
|
|
)
|
|
) else (
|
|
echo pytesseract: tesseract.exe not found -- install from link above if needed
|
|
)
|
|
|
|
if "%OCR_READY%"=="0" (
|
|
echo.
|
|
echo WARNING: No OCR backend is working. Item hover text will not be read.
|
|
echo Install Tesseract OCR: https://github.com/tesseract-ocr/tesseract/releases
|
|
echo Then re-run install.bat.
|
|
)
|
|
|
|
:: --- Verify all dependencies ---
|
|
echo.
|
|
echo Verifying all dependencies...
|
|
set "ALL_OK=1"
|
|
for %%M in (cv2 mss numpy discord transitions rapidfuzz) do (
|
|
set "PATH=%TESS_PATH%;%PATH%"
|
|
"%CONDA_EXE%" run -n botty python -c "import %%M" >nul 2>&1
|
|
if %errorlevel% neq 0 (
|
|
echo FAILED: %%M
|
|
set "ALL_OK=0"
|
|
) else (
|
|
echo %%M: OK
|
|
)
|
|
)
|
|
if "%OCR_READY%"=="0" set "ALL_OK=0"
|
|
|
|
if "%ALL_OK%"=="1" (
|
|
echo.
|
|
echo All dependencies verified.
|
|
) else (
|
|
echo.
|
|
echo WARNING: Some dependencies failed above.
|
|
echo This is often a PATH issue. Try running from a fresh CMD/PowerShell:
|
|
echo conda activate botty
|
|
echo python -c "import cv2"
|
|
echo.
|
|
)
|
|
|
|
:install_done
|
|
echo.
|
|
echo ============================================
|
|
echo Installation complete!
|
|
echo Run botty with: run_botty.bat
|
|
echo ============================================
|
|
echo.
|
|
pause
|