Files
my-botty/install.bat

291 lines
8.8 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())"
:: --- Fix tesserocr ---
echo.
echo Setting up tesserocr...
:: Uninstall any pip tesserocr (conda-forge build fails on Windows)
"%PYTHON%" -m pip uninstall tesserocr -y >nul 2>&1
:: 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
:: Install tesseract 4.x from conda (bundled wheel needs tesseract.dll not tesseract52.dll)
echo Installing tesseract 4.x...
"%CONDA_EXE%" install -n botty "tesseract=4.*" -c conda-forge -y --force-reinstall >nul 2>&1
:: Fix: conda tesseract.exe crashes with access violation - rename it
if exist "%BOTTY_ENV_DIR%\Library\bin\tesseract.exe" (
rename "%BOTTY_ENV_DIR%\Library\bin\tesseract.exe" "tesseract_broken.exe" >nul 2>&1
echo Renamed broken conda tesseract.exe
)
:: Install working tesseract 5.5.0 via winget (conda version crashes)
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 WARNING: winget tesseract install failed. pytesseract may not work.
)
)
:: Ensure tesseract.dll exists (conda may name it tesseract41.dll)
if not exist "%BOTTY_ENV_DIR%\Library\bin\tesseract.dll" (
if exist "%BOTTY_ENV_DIR%\Library\bin\tesseract41.dll" (
copy /y "%BOTTY_ENV_DIR%\Library\bin\tesseract41.dll" "%BOTTY_ENV_DIR%\Library\bin\tesseract.dll" >nul
echo Created tesseract.dll symlink from tesseract41.dll
)
)
:: Ensure liblept.dll exists (conda names it leptonica-X.Y.Z.dll)
if not exist "%BOTTY_ENV_DIR%\Library\bin\liblept.dll" (
for %%L in ("%BOTTY_ENV_DIR%\Library\bin\leptonica-*.dll") do (
copy /y "%%L" "%BOTTY_ENV_DIR%\Library\bin\liblept.dll" >nul
echo Created liblept.dll from %%~nL
)
)
:: Install bundled tesserocr wheel
if exist "dependencies\tesserocr-2.5.2-cp310-cp310-win_amd64.whl" (
echo Installing bundled tesserocr wheel...
"%CONDA_EXE%" run -n botty python -m pip install --force-reinstall --no-deps "dependencies\tesserocr-2.5.2-cp310-cp310-win_amd64.whl"
if %errorlevel% neq 0 (
echo ERROR: Bundled tesserocr wheel install failed.
pause
exit /b 1
)
echo tesserocr wheel installed.
) else (
echo ERROR: Missing bundled wheel: dependencies\tesserocr-2.5.2-cp310-cp310-win_amd64.whl
pause
exit /b 1
)
:: Patch pytesseract to handle tesseract --version crashes (access violation on some systems)
echo Patching pytesseract...
"%PYTHON%" -c "
import os
f = os.path.join(os.path.dirname(__import__('pathlib').Path(__import__('site').getsitepackages()[0]).parent, 'pytesseract', 'pytesseract.py')
for p in __import__('site').getsitepackages():
fp = os.path.join(p, 'pytesseract', 'pytesseract.py')
if os.path.exists(fp):
f = fp
break
if os.path.exists(f):
with open(f, 'r') as fh:
content = fh.read()
if 'subprocess.CalledProcessError' not in content:
old = ''' except OSError:
raise TesseractNotFoundError()'''
new = ''' except OSError:
raise TesseractNotFoundError()
except subprocess.CalledProcessError:
import warnings
warnings.warn('tesseract --version failed, skipping version check')
return None'''
content = content.replace(old, new)
with open(f, 'w') as fh:
fh.write(content)
print(' pytesseract patched')
else:
print(' pytesseract already patched')
else:
print(' pytesseract not found')
"
:: Set PATH for tesseract DLL before testing
set "TESS_PATH=%BOTTY_ENV_DIR%\Library\bin;%BOTTY_ENV_DIR%\Library\lib;%BOTTY_ENV_DIR%\DLLs;%BOTTY_ENV_DIR%\Scripts"
:: --- Verify all dependencies ---
echo.
echo Verifying all dependencies...
set "ALL_OK=1"
for %%M in (cv2 mss numpy tesserocr 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 "%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 tesserocr"
echo.
)
:install_done
echo.
echo ============================================
echo Installation complete!
echo Run botty with: run_botty.bat
echo ============================================
echo.
pause