diff --git a/.gitattributes b/.gitattributes index be87b21..683c8eb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,6 @@ # Enforce CRLF for Windows batch files to prevent CMD parsing bugs on multi-byte UTF-8 -*.bat text eol=crlf -*.cmd text eol=crlf +*.bat text eol=crlf whitespace=-blank-at-eol +*.cmd text eol=crlf whitespace=-blank-at-eol # Enforce LF for shell scripts *.sh text eol=lf diff --git a/setup.bat b/setup.bat index 2f2739c..885a687 100644 --- a/setup.bat +++ b/setup.bat @@ -1,8 +1,10 @@ @echo off -chcp 65001 > nul -set AUTO_START=0 -if /i "%~1"=="--start" set AUTO_START=1 -if /i "%MIBAND_BOT_AUTO_START%"=="1" set AUTO_START=1 +chcp 65001 >nul +setlocal EnableExtensions + +set "AUTO_START=0" +if /i "%~1"=="--start" set "AUTO_START=1" +if /i "%MIBAND_BOT_AUTO_START%"=="1" set "AUTO_START=1" cls echo. @@ -11,75 +13,124 @@ echo. :CHOOSE_MODE if "%AUTO_START%"=="1" if exist secrets.env goto MODE_PYTHON -set install_mode=1 -set /p install_mode=" [1] Python (рек.) [2] Docker Выбор [1]: " +set "install_mode=1" +set /p "install_mode= [1] Python (recommended) [2] Docker Choice [1]: " if "%install_mode%"=="1" goto MODE_PYTHON if "%install_mode%"=="2" goto MODE_DOCKER goto CHOOSE_MODE :MODE_DOCKER where docker >nul 2>nul -if errorlevel 1 ( echo ! Docker не найден. Установите Docker Desktop. & pause & exit /b 1 ) +if errorlevel 1 goto DOCKER_MISSING docker info >nul 2>nul -if errorlevel 1 ( echo ! Docker не запущен. Запустите Docker Desktop. & pause & exit /b 1 ) -echo OK Docker готов -set DOCKER_ACTIVE=1 +if errorlevel 1 goto DOCKER_NOT_RUNNING +echo OK Docker is ready +set "DOCKER_ACTIVE=1" goto SETUP_ENV -:MODE_PYTHON -python --version >nul 2>nul -if not errorlevel 1 ( - python -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul - if not errorlevel 1 goto PYTHON_OK - echo ! Найден Python, но нужна версия 3.11 или новее. -) - -echo ! Python 3.11+ не найден: https://www.python.org/downloads/ -echo. -set install_python=y -set /p install_python=" Установить Python 3.11 автоматически? [Y/n]: " -if /i not "%install_python%"=="y" ( echo Установите Python вручную и повторите. & pause & exit /b 1 ) +:DOCKER_MISSING +echo ERROR Docker was not found. Install Docker Desktop. +pause +exit /b 1 -echo Скачивание Python 3.11.9... -powershell -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe' -OutFile 'python_installer.exe'" -echo Установка... +:DOCKER_NOT_RUNNING +echo ERROR Docker is not running. Start Docker Desktop and try again. +pause +exit /b 1 + +:MODE_PYTHON +call :FIND_PYTHON +if defined PYTHON_CMD goto PYTHON_OK + +echo ERROR Python 3.11+ was not found: https://www.python.org/downloads/ +echo. +set "install_python=y" +set /p "install_python= Install Python 3.11 automatically? [Y/n]: " +if /i not "%install_python%"=="y" goto PYTHON_INSTALL_DECLINED + +echo Downloading Python 3.11.9... +powershell -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe' -OutFile 'python_installer.exe'" +if errorlevel 1 goto PYTHON_DOWNLOAD_FAILED + +echo Installing Python... python_installer.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0 -del python_installer.exe +if errorlevel 1 goto PYTHON_INSTALL_FAILED +del python_installer.exe >nul 2>nul set "PATH=%LocalAppData%\Programs\Python\Python311;%LocalAppData%\Programs\Python\Python311\Scripts;%PATH%" -python --version >nul 2>nul -if errorlevel 1 ( echo ! Не удалось установить Python. & pause & exit /b 1 ) +set "PYTHON_CMD=python" +%PYTHON_CMD% -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul +if errorlevel 1 goto PYTHON_INSTALL_FAILED +goto PYTHON_OK + +:PYTHON_INSTALL_DECLINED +echo Install Python manually and run setup.bat again. +pause +exit /b 1 + +:PYTHON_DOWNLOAD_FAILED +echo ERROR Could not download Python installer. +pause +exit /b 1 + +:PYTHON_INSTALL_FAILED +echo ERROR Could not install Python. +pause +exit /b 1 :PYTHON_OK -echo OK Python готов -set DOCKER_ACTIVE=0 +echo OK Python is ready: %PYTHON_CMD% +set "DOCKER_ACTIVE=0" goto SETUP_ENV +:FIND_PYTHON +set "PYTHON_CMD=" +where py >nul 2>nul +if not errorlevel 1 ( + py -3.13 -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul + if not errorlevel 1 set "PYTHON_CMD=py -3.13" & exit /b 0 + py -3.12 -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul + if not errorlevel 1 set "PYTHON_CMD=py -3.12" & exit /b 0 + py -3.11 -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul + if not errorlevel 1 set "PYTHON_CMD=py -3.11" & exit /b 0 +) +where python >nul 2>nul +if not errorlevel 1 ( + python -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul + if not errorlevel 1 set "PYTHON_CMD=python" & exit /b 0 +) +where python3 >nul 2>nul +if not errorlevel 1 ( + python3 -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)" >nul 2>nul + if not errorlevel 1 set "PYTHON_CMD=python3" & exit /b 0 +) +exit /b 0 + :SETUP_ENV echo. if not exist secrets.env goto INPUT_ENV_VALUES if "%AUTO_START%"=="1" goto LAUNCH_PHASE -set overwrite_env=n -set /p overwrite_env=" Конфигурация уже есть. Перенастроить? [y/N]: " +set "overwrite_env=n" +set /p "overwrite_env= Config already exists. Reconfigure? [y/N]: " if /i not "%overwrite_env%"=="y" goto LAUNCH_PHASE :INPUT_ENV_VALUES echo. -echo Токен бота от @BotFather в Telegram: +echo Telegram bot token from @BotFather: :INPUT_TOKEN -set bot_token= -set /p bot_token=" Токен: " +set "bot_token=" +set /p "bot_token= Token: " if "%bot_token%"=="" goto TOKEN_EMPTY echo %bot_token% | find ":" >nul 2>nul if errorlevel 1 goto TOKEN_INVALID goto TOKEN_OK :TOKEN_EMPTY -echo Токен не может быть пустым. +echo Token cannot be empty. goto INPUT_TOKEN :TOKEN_INVALID -echo Неверный формат - токен должен содержать двоеточие. +echo Invalid token format. It must contain a colon. goto INPUT_TOKEN :TOKEN_OK @@ -91,56 +142,83 @@ echo SYNC_INTERVAL=900 echo QUERY_DURATION=2 echo ENABLE_FDS_SLEEP_DETAILS=true ) > secrets.env -echo OK Конфигурация сохранена +echo OK Config saved :LAUNCH_PHASE echo. if not "%DOCKER_ACTIVE%"=="1" goto PYTHON_LAUNCH :DOCKER_LAUNCH -set launch_now=y -set /p launch_now=" Запустить в Docker сейчас? [Y/n]: " -if /i not "%launch_now%"=="y" ( echo Запуск вручную: docker compose up -d --build & goto END_LAUNCH ) +set "launch_now=y" +set /p "launch_now= Start in Docker now? [Y/n]: " +if /i not "%launch_now%"=="y" goto DOCKER_MANUAL docker compose up -d --build -if not errorlevel 1 ( - echo. - echo OK Бот запущен в Docker. Отправьте /start в Telegram. - echo Логи: docker compose logs -f fitness-bot -) else ( - echo ! Ошибка запуска Docker. -) +if errorlevel 1 goto DOCKER_LAUNCH_FAILED +echo. +echo OK Bot started in Docker. Send /start in Telegram. +echo Logs: docker compose logs -f fitness-bot +goto END_LAUNCH + +:DOCKER_MANUAL +echo Manual start: docker compose up -d --build +goto END_LAUNCH + +:DOCKER_LAUNCH_FAILED +echo ERROR Docker startup failed. goto END_LAUNCH :PYTHON_LAUNCH -echo Подготовка... -if not exist .venv ( python -m venv .venv >nul 2>nul ) -call .venv\Scripts\activate -python -m pip install --upgrade pip setuptools wheel > pip_install.log 2>&1 -if errorlevel 1 goto PIP_INSTALL_FAILED -python -m pip install -r requirements.txt -e mi-fitness-python >> pip_install.log 2>&1 -if errorlevel 1 goto PIP_INSTALL_FAILED -goto PIP_INSTALL_OK - -:PIP_INSTALL_FAILED -echo ! Ошибка установки зависимостей: -type pip_install.log -del pip_install.log >nul 2>nul -pause & exit /b 1 - -:PIP_INSTALL_OK -del pip_install.log >nul 2>nul -echo OK Готово - ->run_local.bat echo @echo off ->>run_local.bat echo chcp 65001 ^> nul +echo Preparing Python environment... +if not exist .venv ( + %PYTHON_CMD% -m venv .venv >nul 2>nul + if errorlevel 1 goto VENV_FAILED +) +call .venv\Scripts\activate +python -m pip install --upgrade pip setuptools wheel > pip_install.log 2>&1 +if errorlevel 1 goto PIP_INSTALL_FAILED +python -m pip install -r requirements.txt -e mi-fitness-python >> pip_install.log 2>&1 +if errorlevel 1 goto PIP_INSTALL_FAILED +del pip_install.log >nul 2>nul +echo OK Dependencies installed +call :WRITE_RUN_LOCAL +if errorlevel 1 goto RUN_LOCAL_FAILED + +if "%AUTO_START%"=="1" goto RUN_LOCAL_NOW + +echo. +set "launch_now=y" +set /p "launch_now= Start bot now? [Y/n]: " +if /i "%launch_now%"=="y" call run_local.bat +goto END_LAUNCH + +:VENV_FAILED +echo ERROR Could not create .venv. +pause +exit /b 1 + +:PIP_INSTALL_FAILED +echo ERROR Dependency installation failed: +type pip_install.log +del pip_install.log >nul 2>nul +pause +exit /b 1 + +:RUN_LOCAL_FAILED +echo ERROR Could not create run_local.bat. +pause +exit /b 1 + +:WRITE_RUN_LOCAL +>run_local.bat echo @echo off +>>run_local.bat echo chcp 65001 ^>nul >>run_local.bat echo cd /d "%%~dp0" >>run_local.bat echo if not exist .venv ^( ->>run_local.bat echo echo ! .venv не найдено. Запустите setup.bat заново. +>>run_local.bat echo echo ERROR .venv was not found. Run setup.bat again. >>run_local.bat echo pause >>run_local.bat echo exit /b 1 >>run_local.bat echo ^) >>run_local.bat echo if not exist run.py ^( ->>run_local.bat echo echo ! run.py не найден. Обновите проект и запустите setup.bat заново. +>>run_local.bat echo echo ERROR run.py was not found. Update project and run setup.bat again. >>run_local.bat echo pause >>run_local.bat echo exit /b 1 >>run_local.bat echo ^) @@ -152,22 +230,15 @@ echo OK Готово >>run_local.bat echo echo. >>run_local.bat echo echo miband-bot >>run_local.bat echo echo. ->>run_local.bat echo echo OK Бот запущен. Не закрывайте это окно. ->>run_local.bat echo echo Логи: data\bot.log / data\sync.log +>>run_local.bat echo echo OK Bot started. Keep this window open. +>>run_local.bat echo echo Logs: data\bot.log / data\sync.log >>run_local.bat echo echo. >>run_local.bat echo python -u run.py >>run_local.bat echo echo. ->>run_local.bat echo echo Бот остановлен. Можно закрыть окно. +>>run_local.bat echo echo Bot stopped. You can close this window. >>run_local.bat echo echo. >>run_local.bat echo pause - -if "%AUTO_START%"=="1" goto RUN_LOCAL_NOW - -echo. -set launch_now=y -set /p launch_now=" Запустить бота сейчас? [Y/n]: " -if /i "%launch_now%"=="y" ( call run_local.bat ) -goto END_LAUNCH +exit /b 0 :RUN_LOCAL_NOW call run_local.bat @@ -175,3 +246,4 @@ call run_local.bat :END_LAUNCH echo. pause +endlocal