Merge branch 'main-fix' into main-fix
This commit is contained in:
17
.github/pull_request_template.md
vendored
Normal file
17
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!-- 提交前必读 -->
|
||||||
|
- 🔴**当前项目处于重构阶段(2025.3.14-)**
|
||||||
|
- ✅ 接受:与main直接相关的Bug修复:提交到main-fix分支
|
||||||
|
- ⚠️ 冻结:所有新功能开发和非紧急重构
|
||||||
|
|
||||||
|
# 请填写以下内容
|
||||||
|
(删除掉中括号内的空格,并替换为**小写的x**)
|
||||||
|
1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支**
|
||||||
|
2. - [ ] 本次更新 **包含破坏性变更**(如数据库结构变更、配置文件修改等)
|
||||||
|
3. - [ ] 本次更新是否经过测试
|
||||||
|
4. - [ ] 请**不要**在数据库中添加group_id字段,这会影响本项目对其他平台的兼容
|
||||||
|
5. 请填写破坏性更新的具体内容(如有):
|
||||||
|
6. 请简要说明本次更新的内容和目的:
|
||||||
|
# 其他信息
|
||||||
|
- **关联 Issue**:Close #
|
||||||
|
- **截图/GIF**:
|
||||||
|
- **附加信息**:
|
||||||
29
.github/workflows/precheck.yml
vendored
Normal file
29
.github/workflows/precheck.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# .github/workflows/precheck.yml
|
||||||
|
name: PR Precheck
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
conflict-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Check Conflicts
|
||||||
|
run: |
|
||||||
|
git fetch origin main
|
||||||
|
if git diff --name-only --diff-filter=U origin/main...HEAD | grep .; then
|
||||||
|
echo "CONFLICT=true" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
labeler:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: conflict-check
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v6
|
||||||
|
if: env.CONFLICT == 'true'
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
labels: ['🚫冲突需处理']
|
||||||
|
})
|
||||||
1
.github/workflows/ruff.yml
vendored
1
.github/workflows/ruff.yml
vendored
@@ -6,3 +6,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: astral-sh/ruff-action@v3
|
- uses: astral-sh/ruff-action@v3
|
||||||
|
|
||||||
|
|||||||
348
MaiLauncher.bat
348
MaiLauncher.bat
@@ -2,12 +2,12 @@
|
|||||||
@setlocal enabledelayedexpansion
|
@setlocal enabledelayedexpansion
|
||||||
@chcp 936
|
@chcp 936
|
||||||
|
|
||||||
@REM 设置版本号
|
@REM <EFBFBD><EFBFBD><EFBFBD>ð汾<EFBFBD><EFBFBD>
|
||||||
set "VERSION=1.0"
|
set "VERSION=1.0"
|
||||||
|
|
||||||
title 麦麦Bot控制台 v%VERSION%
|
title <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨ v%VERSION%
|
||||||
|
|
||||||
@REM 设置Python和Git环境变量
|
@REM <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Python<EFBFBD><EFBFBD>Git<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set "_root=%~dp0"
|
set "_root=%~dp0"
|
||||||
set "_root=%_root:~0,-1%"
|
set "_root=%_root:~0,-1%"
|
||||||
cd "%_root%"
|
cd "%_root%"
|
||||||
@@ -21,14 +21,14 @@ if exist "%_root%\python" (
|
|||||||
call "%_root%\venv\Scripts\activate.bat"
|
call "%_root%\venv\Scripts\activate.bat"
|
||||||
set "PYTHON_HOME=%_root%\venv\Scripts"
|
set "PYTHON_HOME=%_root%\venv\Scripts"
|
||||||
) else (
|
) else (
|
||||||
echo 正在自动查找Python解释器...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Python<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
|
|
||||||
where python >nul 2>&1
|
where python >nul 2>&1
|
||||||
if %errorlevel% equ 0 (
|
if %errorlevel% equ 0 (
|
||||||
for /f "delims=" %%i in ('where python') do (
|
for /f "delims=" %%i in ('where python') do (
|
||||||
echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul
|
echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul
|
||||||
if errorlevel 1 (
|
if errorlevel 1 (
|
||||||
echo 找到Python解释器:%%i
|
echo <EFBFBD>ҵ<EFBFBD>Python<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%%i
|
||||||
set "py_path=%%i"
|
set "py_path=%%i"
|
||||||
goto :validate_python
|
goto :validate_python
|
||||||
)
|
)
|
||||||
@@ -41,46 +41,46 @@ if exist "%_root%\python" (
|
|||||||
goto :validate_python
|
goto :validate_python
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
echo 没有找到Python解释器,要安装吗?
|
echo û<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>Python<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ҫ<><D2AA>װ<EFBFBD><D7B0>?
|
||||||
set /p pyinstall_confirm="继续?(Y/n): "
|
set /p pyinstall_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/n): "
|
||||||
if /i "!pyinstall_confirm!"=="Y" (
|
if /i "!pyinstall_confirm!"=="Y" (
|
||||||
cls
|
cls
|
||||||
echo 正在安装Python...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װPython...
|
||||||
winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements
|
winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements
|
||||||
if %errorlevel% neq 0 (
|
if %errorlevel% neq 0 (
|
||||||
echo 安装失败,请手动安装Python
|
echo <EFBFBD><EFBFBD>װʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD>װPython
|
||||||
start https://www.python.org/downloads/
|
start https://www.python.org/downloads/
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
echo 安装完成,正在验证Python...
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Python...
|
||||||
goto search_python
|
goto search_python
|
||||||
|
|
||||||
) else (
|
) else (
|
||||||
echo 取消安装Python,按任意键退出...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װPython<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
echo 错误:未找到可用的Python解释器!
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>Python<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
exit /b 1
|
exit /b 1
|
||||||
|
|
||||||
:validate_python
|
:validate_python
|
||||||
"!py_path!" --version >nul 2>&1
|
"!py_path!" --version >nul 2>&1
|
||||||
if %errorlevel% neq 0 (
|
if %errorlevel% neq 0 (
|
||||||
echo 无效的Python解释器:%py_path%
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>Python<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%py_path%
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
:: 提取安装目录
|
:: <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>װĿ¼
|
||||||
for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi"
|
for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi"
|
||||||
set "PYTHON_HOME=%PYTHON_HOME:~0,-1%"
|
set "PYTHON_HOME=%PYTHON_HOME:~0,-1%"
|
||||||
)
|
)
|
||||||
if not exist "%PYTHON_HOME%\python.exe" (
|
if not exist "%PYTHON_HOME%\python.exe" (
|
||||||
echo Python路径验证失败:%PYTHON_HOME%
|
echo Python·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ʧ<EFBFBD>ܣ<EFBFBD>%PYTHON_HOME%
|
||||||
echo 请检查Python安装路径中是否有python.exe文件
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Python<EFBFBD><EFBFBD>װ·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>python.exe<EFBFBD>ļ<EFBFBD>
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
echo 成功设置Python路径:%PYTHON_HOME%
|
echo <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Python·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>%PYTHON_HOME%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ cls
|
|||||||
if exist "%_root%\tools\git\bin" (
|
if exist "%_root%\tools\git\bin" (
|
||||||
set "GIT_HOME=%_root%\tools\git\bin"
|
set "GIT_HOME=%_root%\tools\git\bin"
|
||||||
) else (
|
) else (
|
||||||
echo 正在自动查找Git...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Git...
|
||||||
|
|
||||||
where git >nul 2>&1
|
where git >nul 2>&1
|
||||||
if %errorlevel% equ 0 (
|
if %errorlevel% equ 0 (
|
||||||
@@ -98,7 +98,7 @@ if exist "%_root%\tools\git\bin" (
|
|||||||
goto :validate_git
|
goto :validate_git
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
echo 正在扫描常见安装路径...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD>賣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ·<EFBFBD><EFBFBD>...
|
||||||
set "search_paths=!ProgramFiles!\Git\cmd"
|
set "search_paths=!ProgramFiles!\Git\cmd"
|
||||||
for /f "tokens=*" %%d in ("!search_paths!") do (
|
for /f "tokens=*" %%d in ("!search_paths!") do (
|
||||||
if exist "%%d\git.exe" (
|
if exist "%%d\git.exe" (
|
||||||
@@ -106,31 +106,31 @@ if exist "%_root%\tools\git\bin" (
|
|||||||
goto :validate_git
|
goto :validate_git
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
echo 没有找到Git,要安装吗?
|
echo û<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>Git<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p confirm="继续?(Y/N): "
|
set /p confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
cls
|
cls
|
||||||
echo 正在安装Git...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װGit...
|
||||||
set "custom_url=https://ghfast.top/https://github.com/git-for-windows/git/releases/download/v2.48.1.windows.1/Git-2.48.1-64-bit.exe"
|
set "custom_url=https://ghfast.top/https://github.com/git-for-windows/git/releases/download/v2.48.1.windows.1/Git-2.48.1-64-bit.exe"
|
||||||
|
|
||||||
set "download_path=%TEMP%\Git-Installer.exe"
|
set "download_path=%TEMP%\Git-Installer.exe"
|
||||||
|
|
||||||
echo 正在下载Git安装包...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Git<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>...
|
||||||
curl -L -o "!download_path!" "!custom_url!"
|
curl -L -o "!download_path!" "!custom_url!"
|
||||||
|
|
||||||
if exist "!download_path!" (
|
if exist "!download_path!" (
|
||||||
echo 下载成功,开始安装Git...
|
echo <EFBFBD><EFBFBD><EFBFBD>سɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>װGit...
|
||||||
start /wait "" "!download_path!" /SILENT /NORESTART
|
start /wait "" "!download_path!" /SILENT /NORESTART
|
||||||
) else (
|
) else (
|
||||||
echo 下载失败,请手动安装Git
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD>װGit
|
||||||
start https://git-scm.com/download/win
|
start https://git-scm.com/download/win
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
del "!download_path!"
|
del "!download_path!"
|
||||||
echo 临时文件已清理。
|
echo <EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
echo 安装完成,正在验证Git...
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Git...
|
||||||
where git >nul 2>&1
|
where git >nul 2>&1
|
||||||
if %errorlevel% equ 0 (
|
if %errorlevel% equ 0 (
|
||||||
for /f "delims=" %%i in ('where git') do (
|
for /f "delims=" %%i in ('where git') do (
|
||||||
@@ -140,28 +140,28 @@ if exist "%_root%\tools\git\bin" (
|
|||||||
goto :search_git
|
goto :search_git
|
||||||
|
|
||||||
) else (
|
) else (
|
||||||
echo 安装完成,但未找到Git,请手动安装Git
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ҵ<EFBFBD>Git<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD>װGit
|
||||||
start https://git-scm.com/download/win
|
start https://git-scm.com/download/win
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
) else (
|
) else (
|
||||||
echo 取消安装Git,按任意键退出...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װGit<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
echo 错误:未找到可用的Git!
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>Git<EFBFBD><EFBFBD>
|
||||||
exit /b 1
|
exit /b 1
|
||||||
|
|
||||||
:validate_git
|
:validate_git
|
||||||
"%git_path%" --version >nul 2>&1
|
"%git_path%" --version >nul 2>&1
|
||||||
if %errorlevel% neq 0 (
|
if %errorlevel% neq 0 (
|
||||||
echo 无效的Git:%git_path%
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>Git<EFBFBD><EFBFBD>%git_path%
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
:: 提取安装目录
|
:: <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>װĿ¼
|
||||||
for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi"
|
for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi"
|
||||||
set "GIT_HOME=%GIT_HOME:~0,-1%"
|
set "GIT_HOME=%GIT_HOME:~0,-1%"
|
||||||
)
|
)
|
||||||
@@ -170,40 +170,40 @@ if exist "%_root%\tools\git\bin" (
|
|||||||
cls
|
cls
|
||||||
sc query | findstr /i "MongoDB" >nul
|
sc query | findstr /i "MongoDB" >nul
|
||||||
if !errorlevel! neq 0 (
|
if !errorlevel! neq 0 (
|
||||||
echo MongoDB服务未运行,是否尝试运行服务?
|
echo MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p confirm="是否启动?(Y/N): "
|
set /p confirm="<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
echo 正在尝试启动MongoDB服务...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'"
|
powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'"
|
||||||
echo 正在等待MongoDB服务启动...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڵȴ<EFBFBD>MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
echo 按下任意键跳过等待...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>...
|
||||||
timeout /t 30 >nul
|
timeout /t 30 >nul
|
||||||
sc query | findstr /i "MongoDB" >nul
|
sc query | findstr /i "MongoDB" >nul
|
||||||
if !errorlevel! neq 0 (
|
if !errorlevel! neq 0 (
|
||||||
echo MongoDB服务启动失败,可能是没有安装,要安装吗?
|
echo MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>а<EFBFBD>װ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p install_confirm="继续安装?(Y/N): "
|
set /p install_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!install_confirm!"=="Y" (
|
if /i "!install_confirm!"=="Y" (
|
||||||
echo 正在安装MongoDB...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װMongoDB...
|
||||||
winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements
|
winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements
|
||||||
echo 安装完成,正在启动MongoDB服务...
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
net start MongoDB
|
net start MongoDB
|
||||||
if !errorlevel! neq 0 (
|
if !errorlevel! neq 0 (
|
||||||
echo 启动MongoDB服务失败,请手动启动
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
exit /b
|
exit /b
|
||||||
) else (
|
) else (
|
||||||
echo MongoDB服务已成功启动
|
echo MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
)
|
)
|
||||||
) else (
|
) else (
|
||||||
echo 取消安装MongoDB,按任意键退出...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װMongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
) else (
|
) else (
|
||||||
echo "警告:MongoDB服务未运行,将导致MaiMBot无法访问数据库!"
|
echo "<EFBFBD><EFBFBD><EFBFBD>棺MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MaiMBot<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ⣡"
|
||||||
)
|
)
|
||||||
) else (
|
) else (
|
||||||
echo MongoDB服务已运行
|
echo MongoDB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
)
|
)
|
||||||
|
|
||||||
@REM set "GIT_HOME=%_root%\tools\git\bin"
|
@REM set "GIT_HOME=%_root%\tools\git\bin"
|
||||||
@@ -212,47 +212,47 @@ set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%"
|
|||||||
:install_maim
|
:install_maim
|
||||||
if not exist "!_root!\bot.py" (
|
if not exist "!_root!\bot.py" (
|
||||||
cls
|
cls
|
||||||
echo 你似乎没有安装麦麦Bot,要安装在当前目录吗?
|
echo <EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD>û<EFBFBD>а<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>װ<EFBFBD>ڵ<EFBFBD>ǰĿ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p confirm="继续?(Y/N): "
|
set /p confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
echo 要使用Git代理下载吗?
|
echo Ҫʹ<EFBFBD><EFBFBD>Git<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p proxy_confirm="继续?(Y/N): "
|
set /p proxy_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!proxy_confirm!"=="Y" (
|
if /i "!proxy_confirm!"=="Y" (
|
||||||
echo 正在安装麦麦Bot...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot...
|
||||||
git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot
|
git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot
|
||||||
) else (
|
) else (
|
||||||
echo 正在安装麦麦Bot...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot...
|
||||||
git clone https://github.com/SengokuCola/MaiMBot
|
git clone https://github.com/SengokuCola/MaiMBot
|
||||||
)
|
)
|
||||||
xcopy /E /H /I MaiMBot . >nul 2>&1
|
xcopy /E /H /I MaiMBot . >nul 2>&1
|
||||||
rmdir /s /q MaiMBot
|
rmdir /s /q MaiMBot
|
||||||
git checkout main-fix
|
git checkout main-fix
|
||||||
|
|
||||||
echo 安装完成,正在安装依赖...
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||||
python -m pip install virtualenv
|
python -m pip install virtualenv
|
||||||
python -m virtualenv venv
|
python -m virtualenv venv
|
||||||
call venv\Scripts\activate.bat
|
call venv\Scripts\activate.bat
|
||||||
python -m pip install -r requirements.txt
|
python -m pip install -r requirements.txt
|
||||||
|
|
||||||
echo 安装完成,要编辑配置文件吗?
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>Ҫ<EFBFBD>༭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p edit_confirm="继续?(Y/N): "
|
set /p edit_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!edit_confirm!"=="Y" (
|
if /i "!edit_confirm!"=="Y" (
|
||||||
goto config_menu
|
goto config_menu
|
||||||
) else (
|
) else (
|
||||||
echo 取消编辑配置文件,按任意键返回主菜单...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD>༭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@REM git获取当前分支名并保存在变量里
|
@REM git<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do (
|
for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do (
|
||||||
set "BRANCH=%%b"
|
set "BRANCH=%%b"
|
||||||
)
|
)
|
||||||
|
|
||||||
@REM 根据不同分支名给分支名字符串使用不同颜色
|
@REM <EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ͬ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ò<EFBFBD>ͬ<EFBFBD><EFBFBD>ɫ
|
||||||
echo 分支名: %BRANCH%
|
echo <EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>: %BRANCH%
|
||||||
if "!BRANCH!"=="main" (
|
if "!BRANCH!"=="main" (
|
||||||
set "BRANCH_COLOR=[92m"
|
set "BRANCH_COLOR=[92m"
|
||||||
) else if "!BRANCH!"=="main-fix" (
|
) else if "!BRANCH!"=="main-fix" (
|
||||||
@@ -266,78 +266,78 @@ if "!BRANCH!"=="main" (
|
|||||||
@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%"
|
@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%"
|
||||||
|
|
||||||
:check_is_venv
|
:check_is_venv
|
||||||
echo 正在检查虚拟环境状态...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬...
|
||||||
if exist "%_root%\config\no_venv" (
|
if exist "%_root%\config\no_venv" (
|
||||||
echo 检测到no_venv,跳过虚拟环境检查
|
echo <EFBFBD><EFBFBD><EFBFBD>no_venv,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
goto menu
|
goto menu
|
||||||
)
|
)
|
||||||
|
|
||||||
:: 环境检测
|
:: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if defined VIRTUAL_ENV (
|
if defined VIRTUAL_ENV (
|
||||||
goto menu
|
goto menu
|
||||||
)
|
)
|
||||||
|
|
||||||
echo =====================================
|
echo =====================================
|
||||||
echo 虚拟环境检测警告:
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⾯<EFBFBD>棺
|
||||||
echo 当前使用系统Python路径:!PYTHON_HOME!
|
echo <EFBFBD><EFBFBD>ǰʹ<EFBFBD><EFBFBD>ϵͳPython·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>!PYTHON_HOME!
|
||||||
echo 未检测到激活的虚拟环境!
|
echo δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
:env_interaction
|
:env_interaction
|
||||||
echo =====================================
|
echo =====================================
|
||||||
echo 请选择操作:
|
echo <EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 1 - 创建并激活Venv虚拟环境
|
echo 1 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Venv<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 2 - 创建/激活Conda虚拟环境
|
echo 2 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>Conda<64><61><EFBFBD><EFBFBD><E2BBB7>
|
||||||
echo 3 - 临时跳过本次检查
|
echo 3 - <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 4 - 永久跳过虚拟环境检查
|
echo 4 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p choice="请输入选项(1-4): "
|
set /p choice="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>(1-4): "
|
||||||
|
|
||||||
if "!choice!" = "4" (
|
if "!choice!"=="4" (
|
||||||
echo 要永久跳过虚拟环境检查吗?
|
echo Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p no_venv_confirm="继续?(Y/N): ....."
|
set /p no_venv_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): ....."
|
||||||
if /i "!no_venv_confirm!"=="Y" (
|
if /i "!no_venv_confirm!"=="Y" (
|
||||||
echo 1 > "%_root%\config\no_venv"
|
echo 1 > "%_root%\config\no_venv"
|
||||||
echo 已创建no_venv文件
|
echo <EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD>no_venv<EFBFBD>ļ<EFBFBD>
|
||||||
pause >nul
|
pause >nul
|
||||||
goto menu
|
goto menu
|
||||||
) else (
|
) else (
|
||||||
echo 取消跳过虚拟环境检查,按任意键返回...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
goto env_interaction
|
goto env_interaction
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if "!choice!" = "3"(
|
if "!choice!"=="3" (
|
||||||
echo 警告:使用系统环境可能导致依赖冲突!
|
echo <EFBFBD><EFBFBD><EFBFBD>棺ʹ<EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD>
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
goto menu
|
goto menu
|
||||||
)
|
)
|
||||||
|
|
||||||
if "!choice!" = "2" goto handle_conda
|
if "!choice!"=="2" goto handle_conda
|
||||||
if "!choice!" = "1" goto handle_venv
|
if "!choice!"=="1" goto handle_venv
|
||||||
|
|
||||||
echo 无效的输入,请输入1-4之间的数字
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-4֮<34><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
goto env_interaction
|
goto env_interaction
|
||||||
|
|
||||||
:handle_venv
|
:handle_venv
|
||||||
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||||
echo 正在初始化Venv环境...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD>Venv<EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
python -m pip install virtualenv || (
|
python -m pip install virtualenv || (
|
||||||
echo 安装环境失败,错误码:!errorlevel!
|
echo <EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺!errorlevel!
|
||||||
pause
|
pause
|
||||||
goto env_interaction
|
goto env_interaction
|
||||||
)
|
)
|
||||||
echo 创建虚拟环境到:venv
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>venv
|
||||||
python -m virtualenv venv || (
|
python -m virtualenv venv || (
|
||||||
echo 环境创建失败,错误码:!errorlevel!
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺!errorlevel!
|
||||||
pause
|
pause
|
||||||
goto env_interaction
|
goto env_interaction
|
||||||
)
|
)
|
||||||
|
|
||||||
call venv\Scripts\activate.bat
|
call venv\Scripts\activate.bat
|
||||||
echo 已激活Venv环境
|
echo <EFBFBD>Ѽ<EFBFBD><EFBFBD><EFBFBD>Venv<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 要安装依赖吗?
|
echo Ҫ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p install_confirm="继续?(Y/N): "
|
set /p install_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!install_confirm!"=="Y" (
|
if /i "!install_confirm!"=="Y" (
|
||||||
goto update_dependencies
|
goto update_dependencies
|
||||||
)
|
)
|
||||||
@@ -345,66 +345,70 @@ goto menu
|
|||||||
|
|
||||||
:handle_conda
|
:handle_conda
|
||||||
where conda >nul 2>&1 || (
|
where conda >nul 2>&1 || (
|
||||||
echo 未检测到conda,可能原因:
|
echo δ<EFBFBD><EFBFBD><EFBFBD>conda<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 1. 未安装Miniconda
|
echo 1. δ<EFBFBD><EFBFBD>װMiniconda
|
||||||
echo 2. conda配置异常
|
echo 2. conda<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||||
timeout /t 10 >nul
|
timeout /t 10 >nul
|
||||||
goto env_interaction
|
goto env_interaction
|
||||||
)
|
)
|
||||||
|
|
||||||
:conda_menu
|
:conda_menu
|
||||||
echo 请选择Conda操作:
|
echo <EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Conda<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 1 - 创建新环境
|
echo 1 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 2 - 激活已有环境
|
echo 2 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 3 - 返回上级菜单
|
echo 3 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD>˵<EFBFBD>
|
||||||
set /p choice="请输入选项(1-3): "
|
set /p choice="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>(1-3): "
|
||||||
|
|
||||||
if "!choice!"=="3" goto env_interaction
|
if "!choice!"=="3" goto env_interaction
|
||||||
if "!choice!"=="2" goto activate_conda
|
if "!choice!"=="2" goto activate_conda
|
||||||
if "!choice!"=="1" goto create_conda
|
if "!choice!"=="1" goto create_conda
|
||||||
|
|
||||||
|
echo <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-3֮<33><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
timeout /t 2 >nul
|
||||||
|
goto conda_menu
|
||||||
|
|
||||||
:create_conda
|
:create_conda
|
||||||
set /p "CONDA_ENV=请输入新环境名称:"
|
set /p "CONDA_ENV=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>"
|
||||||
if "!CONDA_ENV!"=="" (
|
if "!CONDA_ENV!"=="" (
|
||||||
echo 环境名称不能为空!
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
|
||||||
goto create_conda
|
goto create_conda
|
||||||
)
|
)
|
||||||
conda create -n !CONDA_ENV! python=3.13 -y || (
|
conda create -n !CONDA_ENV! python=3.13 -y || (
|
||||||
echo 环境创建失败,错误码:!errorlevel!
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺!errorlevel!
|
||||||
pause
|
timeout /t 10 >nul
|
||||||
goto conda_menu
|
goto conda_menu
|
||||||
)
|
)
|
||||||
goto activate_conda
|
goto activate_conda
|
||||||
|
|
||||||
:activate_conda
|
:activate_conda
|
||||||
set /p "CONDA_ENV=请输入要激活的环境名称:"
|
set /p "CONDA_ENV=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>"
|
||||||
conda activate !CONDA_ENV! || (
|
call conda activate !CONDA_ENV! || (
|
||||||
echo 激活失败,可能原因:
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 1. 环境不存在
|
echo 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 2. conda配置异常
|
echo 2. conda<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||||
pause
|
pause
|
||||||
goto conda_menu
|
goto conda_menu
|
||||||
)
|
)
|
||||||
echo 成功激活conda环境:!CONDA_ENV!
|
echo <EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>conda<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!CONDA_ENV!
|
||||||
echo 要安装依赖吗?
|
echo Ҫ<EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p install_confirm="继续?(Y/N): "
|
set /p install_confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!install_confirm!"=="Y" (
|
if /i "!install_confirm!"=="Y" (
|
||||||
goto update_dependencies
|
goto update_dependencies
|
||||||
)
|
)
|
||||||
:menu
|
:menu
|
||||||
@chcp 936
|
@chcp 936
|
||||||
cls
|
cls
|
||||||
echo 麦麦Bot控制台 v%VERSION% 当前分支: %BRANCH_COLOR%%BRANCH%[0m
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨ v%VERSION% <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>֧: %BRANCH_COLOR%%BRANCH%[0m
|
||||||
echo 当前Python环境: [96m!PYTHON_HOME![0m
|
echo <EFBFBD><EFBFBD>ǰPython<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: [96m!PYTHON_HOME![0m
|
||||||
echo ======================
|
echo ======================
|
||||||
echo 1. 更新并启动麦麦Bot (默认)
|
echo 1. <EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot (Ĭ<EFBFBD><EFBFBD>)
|
||||||
echo 2. 直接启动麦麦Bot
|
echo 2. ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bot
|
||||||
echo 3. 启动麦麦配置界面
|
echo 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 4. 打开麦麦神奇工具箱
|
echo 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>湤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 5. 退出
|
echo 5. <EFBFBD>˳<EFBFBD>
|
||||||
echo ======================
|
echo ======================
|
||||||
|
|
||||||
set /p choice="请输入选项数字 (1-5)并按下回车以选择: "
|
set /p choice="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1-5)<29><><EFBFBD><EFBFBD><EFBFBD>»س<C2BB><D8B3><EFBFBD>ѡ<EFBFBD><D1A1>: "
|
||||||
|
|
||||||
if "!choice!"=="" set choice=1
|
if "!choice!"=="" set choice=1
|
||||||
|
|
||||||
@@ -414,7 +418,7 @@ if "!choice!"=="3" goto config_menu
|
|||||||
if "!choice!"=="4" goto tools_menu
|
if "!choice!"=="4" goto tools_menu
|
||||||
if "!choice!"=="5" exit /b
|
if "!choice!"=="5" exit /b
|
||||||
|
|
||||||
echo 无效的输入,请输入1-5之间的数字
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-5֮<35><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
goto menu
|
goto menu
|
||||||
|
|
||||||
@@ -437,18 +441,18 @@ goto menu
|
|||||||
:tools_menu
|
:tools_menu
|
||||||
@chcp 936
|
@chcp 936
|
||||||
cls
|
cls
|
||||||
echo 麦麦时尚工具箱 当前分支: %BRANCH_COLOR%%BRANCH%[0m
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ<EFBFBD><C7B0>֧: %BRANCH_COLOR%%BRANCH%[0m
|
||||||
echo ======================
|
echo ======================
|
||||||
echo 1. 更新依赖
|
echo 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 2. 切换分支
|
echo 2. <EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>֧
|
||||||
echo 3. 重置当前分支
|
echo 3. <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD>֧
|
||||||
echo 4. 更新配置文件
|
echo 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||||
echo 5. 学习新的知识库
|
echo 5. ѧϰ<EFBFBD>µ<EFBFBD>֪ʶ<EFBFBD><EFBFBD>
|
||||||
echo 6. 打开知识库文件夹
|
echo 6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ʶ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 7. 返回主菜单
|
echo 7. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>
|
||||||
echo ======================
|
echo ======================
|
||||||
|
|
||||||
set /p choice="请输入选项数字: "
|
set /p choice="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: "
|
||||||
if "!choice!"=="1" goto update_dependencies
|
if "!choice!"=="1" goto update_dependencies
|
||||||
if "!choice!"=="2" goto switch_branch
|
if "!choice!"=="2" goto switch_branch
|
||||||
if "!choice!"=="3" goto reset_branch
|
if "!choice!"=="3" goto reset_branch
|
||||||
@@ -457,29 +461,29 @@ if "!choice!"=="5" goto learn_new_knowledge
|
|||||||
if "!choice!"=="6" goto open_knowledge_folder
|
if "!choice!"=="6" goto open_knowledge_folder
|
||||||
if "!choice!"=="7" goto menu
|
if "!choice!"=="7" goto menu
|
||||||
|
|
||||||
echo 无效的输入,请输入1-6之间的数字
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-6֮<36><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
|
|
||||||
:update_dependencies
|
:update_dependencies
|
||||||
cls
|
cls
|
||||||
echo 正在更新依赖...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||||
python.exe -m pip install -r requirements.txt
|
python.exe -m pip install -r requirements.txt
|
||||||
|
|
||||||
echo 依赖更新完成,按任意键返回工具箱菜单...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
pause
|
pause
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
|
|
||||||
:switch_branch
|
:switch_branch
|
||||||
cls
|
cls
|
||||||
echo 正在切换分支...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>֧...
|
||||||
echo 当前分支: %BRANCH%
|
echo <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>֧: %BRANCH%
|
||||||
@REM echo 可用分支: main, debug, stable-dev
|
@REM echo <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>֧: main, debug, stable-dev
|
||||||
echo 1. 切换到[92mmain[0m
|
echo 1. <EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>[92mmain[0m
|
||||||
echo 2. 切换到[91mmain-fix[0m
|
echo 2. <EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>[91mmain-fix[0m
|
||||||
echo 请输入要切换到的分支:
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>֧:
|
||||||
set /p branch_name="分支名: "
|
set /p branch_name="<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>: "
|
||||||
if "%branch_name%"=="" set branch_name=main
|
if "%branch_name%"=="" set branch_name=main
|
||||||
if "%branch_name%"=="main" (
|
if "%branch_name%"=="main" (
|
||||||
set "BRANCH_COLOR=[92m"
|
set "BRANCH_COLOR=[92m"
|
||||||
@@ -494,32 +498,32 @@ if "%branch_name%"=="main" (
|
|||||||
set "BRANCH_COLOR=[91m"
|
set "BRANCH_COLOR=[91m"
|
||||||
set "branch_name=main-fix"
|
set "branch_name=main-fix"
|
||||||
) else (
|
) else (
|
||||||
echo 无效的分支名, 请重新输入
|
echo <EFBFBD><EFBFBD>Ч<EFBFBD>ķ<EFBFBD>֧<EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
goto switch_branch
|
goto switch_branch
|
||||||
)
|
)
|
||||||
|
|
||||||
echo 正在切换到分支 %branch_name%...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧ %branch_name%...
|
||||||
git checkout %branch_name%
|
git checkout %branch_name%
|
||||||
echo 分支切换完成,当前分支: %BRANCH_COLOR%%branch_name%[0m
|
echo <EFBFBD><EFBFBD>֧<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>֧: %BRANCH_COLOR%%branch_name%[0m
|
||||||
set "BRANCH=%branch_name%"
|
set "BRANCH=%branch_name%"
|
||||||
echo 按任意键返回工具箱菜单...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
|
|
||||||
|
|
||||||
:reset_branch
|
:reset_branch
|
||||||
cls
|
cls
|
||||||
echo 正在重置当前分支...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD>֧...
|
||||||
echo 当前分支: !BRANCH!
|
echo <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>֧: !BRANCH!
|
||||||
echo 确认要重置当前分支吗?
|
echo ȷ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
set /p confirm="继续?(Y/N): "
|
set /p confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
echo 正在重置当前分支...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD>֧...
|
||||||
git reset --hard !BRANCH!
|
git reset --hard !BRANCH!
|
||||||
echo 分支重置完成,按任意键返回工具箱菜单...
|
echo <EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
) else (
|
) else (
|
||||||
echo 取消重置当前分支,按任意键返回工具箱菜单...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
)
|
)
|
||||||
pause >nul
|
pause >nul
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
@@ -527,44 +531,44 @@ goto tools_menu
|
|||||||
|
|
||||||
:update_config
|
:update_config
|
||||||
cls
|
cls
|
||||||
echo 正在更新配置文件...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>...
|
||||||
echo 请确保已备份重要数据,继续将修改当前配置文件。
|
echo <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
echo 继续请按Y,取消请按任意键...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴Y<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>밴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
set /p confirm="继续?(Y/N): "
|
set /p confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
echo 正在更新配置文件...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>...
|
||||||
python.exe config\auto_update.py
|
python.exe config\auto_update.py
|
||||||
echo 配置文件更新完成,按任意键返回工具箱菜单...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
) else (
|
) else (
|
||||||
echo 取消更新配置文件,按任意键返回工具箱菜单...
|
echo ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
)
|
)
|
||||||
pause >nul
|
pause >nul
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
|
|
||||||
:learn_new_knowledge
|
:learn_new_knowledge
|
||||||
cls
|
cls
|
||||||
echo 正在学习新的知识库...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧϰ<EFBFBD>µ<EFBFBD>֪ʶ<EFBFBD><EFBFBD>...
|
||||||
echo 请确保已备份重要数据,继续将修改当前知识库。
|
echo <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰ֪ʶ<EFBFBD>⡣
|
||||||
echo 继续请按Y,取消请按任意键...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴Y<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>밴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
set /p confirm="继续?(Y/N): "
|
set /p confirm="<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Y/N): "
|
||||||
if /i "!confirm!"=="Y" (
|
if /i "!confirm!"=="Y" (
|
||||||
echo 正在学习新的知识库...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧϰ<EFBFBD>µ<EFBFBD>֪ʶ<EFBFBD><EFBFBD>...
|
||||||
python.exe src\plugins\zhishi\knowledge_library.py
|
python.exe src\plugins\zhishi\knowledge_library.py
|
||||||
echo 学习完成,按任意键返回工具箱菜单...
|
echo ѧϰ<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
) else (
|
) else (
|
||||||
echo 取消学习新的知识库,按任意键返回工具箱菜单...
|
echo ȡ<EFBFBD><EFBFBD>ѧϰ<EFBFBD>µ<EFBFBD>֪ʶ<EFBFBD>⣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
)
|
)
|
||||||
pause >nul
|
pause >nul
|
||||||
goto tools_menu
|
goto tools_menu
|
||||||
|
|
||||||
:open_knowledge_folder
|
:open_knowledge_folder
|
||||||
cls
|
cls
|
||||||
echo 正在打开知识库文件夹...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>֪ʶ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>...
|
||||||
if exist data\raw_info (
|
if exist data\raw_info (
|
||||||
start explorer data\raw_info
|
start explorer data\raw_info
|
||||||
) else (
|
) else (
|
||||||
echo 知识库文件夹不存在!
|
echo ֪ʶ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
||||||
echo 正在创建文件夹...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>...
|
||||||
mkdir data\raw_info
|
mkdir data\raw_info
|
||||||
timeout /t 2 >nul
|
timeout /t 2 >nul
|
||||||
)
|
)
|
||||||
@@ -577,18 +581,18 @@ cls
|
|||||||
git pull > temp.log 2>&1
|
git pull > temp.log 2>&1
|
||||||
findstr /C:"detected dubious ownership" temp.log >nul
|
findstr /C:"detected dubious ownership" temp.log >nul
|
||||||
if %errorlevel% equ 0 (
|
if %errorlevel% equ 0 (
|
||||||
echo 检测到仓库权限问题,正在自动修复...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>...
|
||||||
git config --global --add safe.directory "%cd%"
|
git config --global --add safe.directory "%cd%"
|
||||||
echo 已添加例外,正在重试git pull...
|
echo <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>git pull...
|
||||||
del temp.log
|
del temp.log
|
||||||
goto retry_git_pull
|
goto retry_git_pull
|
||||||
)
|
)
|
||||||
del temp.log
|
del temp.log
|
||||||
echo 正在更新依赖...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||||
python -m pip install -r requirements.txt && cls
|
python -m pip install -r requirements.txt && cls
|
||||||
|
|
||||||
echo 当前代理设置:
|
echo <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||||
echo HTTP_PROXY=%HTTP_PROXY%
|
echo HTTP_PROXY=%HTTP_PROXY%
|
||||||
echo HTTPS_PROXY=%HTTPS_PROXY%
|
echo HTTPS_PROXY=%HTTPS_PROXY%
|
||||||
|
|
||||||
@@ -600,17 +604,17 @@ set no_proxy=0.0.0.0/32
|
|||||||
REM chcp 65001
|
REM chcp 65001
|
||||||
python bot.py
|
python bot.py
|
||||||
echo.
|
echo.
|
||||||
echo Bot已停止运行,按任意键返回主菜单...
|
echo Bot<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
goto menu
|
goto menu
|
||||||
|
|
||||||
:start_bot
|
:start_bot
|
||||||
cls
|
cls
|
||||||
echo 正在更新依赖...
|
echo <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||||
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||||
python -m pip install -r requirements.txt && cls
|
python -m pip install -r requirements.txt && cls
|
||||||
|
|
||||||
echo 当前代理设置:
|
echo <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||||
echo HTTP_PROXY=%HTTP_PROXY%
|
echo HTTP_PROXY=%HTTP_PROXY%
|
||||||
echo HTTPS_PROXY=%HTTPS_PROXY%
|
echo HTTPS_PROXY=%HTTPS_PROXY%
|
||||||
|
|
||||||
@@ -622,7 +626,7 @@ set no_proxy=0.0.0.0/32
|
|||||||
REM chcp 65001
|
REM chcp 65001
|
||||||
python bot.py
|
python bot.py
|
||||||
echo.
|
echo.
|
||||||
echo Bot已停止运行,按任意键返回主菜单...
|
echo Bot<EFBFBD><EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>...
|
||||||
pause >nul
|
pause >nul
|
||||||
goto menu
|
goto menu
|
||||||
|
|
||||||
|
|||||||
78
README.md
78
README.md
@@ -1,3 +1,81 @@
|
|||||||
|
# 关于项目分支调整与贡献指南的重要通知
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
- 📂 致所有为麦麦提交过贡献,以及想要为麦麦提交贡献的朋友们!</summary>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**📢 关于项目分支调整与贡献指南的重要通知**
|
||||||
|
**致所有关注MaiMBot的开发者与贡献者:**
|
||||||
|
|
||||||
|
首先,我们由衷感谢大家近期的热情参与!感谢大家对MaiMBot的喜欢,项目突然受到广泛关注让我们倍感惊喜,也深深感受到开源社区的温暖力量。为了保障项目长期健康发展,我们不得不对开发流程做出重要调整,恳请理解与支持。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **📌 本次调整的核心原因**
|
||||||
|
|
||||||
|
1. **维护团队精力有限**
|
||||||
|
核心成员(包括我本人)均为在校学生/在职开发者,近期涌入的大量PR和意见已远超我们的处理能力。为确保本职工作与项目质量,我们必须优化协作流程。
|
||||||
|
|
||||||
|
2. **重构核心架构的紧迫性**
|
||||||
|
当前我们正与核心团队全力重构项目底层逻辑,这是为未来扩展性、性能提升打下的必要基础,需要高度专注。
|
||||||
|
|
||||||
|
3. **保障现有用户的稳定性**
|
||||||
|
我们深知许多用户已依赖当前版本,因此必须划分清晰的维护边界,确保生产环境可用性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **🌿 全新分支策略与贡献指南**
|
||||||
|
|
||||||
|
为平衡上述目标,即日起启用以下分支结构:
|
||||||
|
|
||||||
|
| 分支 | 定位 | 接受PR类型 | 提交对象 |
|
||||||
|
| ---------- | ---------------------------- | --------------------------------------------- | ---------------- |
|
||||||
|
| `main` | **稳定版**(供下载使用) | 仅接受来自`main-fix`的合并 | 维护团队直接管理 |
|
||||||
|
| `main-fix` | 生产环境紧急修复 | 明确的功能缺陷修复(需附带复现步骤/测试用例) | 所有开发者 |
|
||||||
|
| `refactor` | 重构版(**不兼容当前main**) | 仅重构与相关Bug修复 | 重构小组维护 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **⚠️ 对现有PR的处理说明**
|
||||||
|
|
||||||
|
由于分支结构调整,**GitHub已自动关闭所有未合并的PR**,这并非否定您的贡献价值!如果您认为自己的PR符合以下条件:
|
||||||
|
|
||||||
|
- 属于`main-fix`明确的**功能性缺陷修复**(非功能增强) ,包括非预期行为和严重报错,需要发布issue讨论确定。
|
||||||
|
- 属于`refactor`分支的**重构适配性修复**
|
||||||
|
|
||||||
|
**欢迎您重新提交到对应分支**,并在PR描述中标注`[Re-submit from closed PR]`,我们将优先审查。其他类型PR暂缓受理,但您的创意我们已记录在案,未来重构完成后将重新评估。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **🙏 致谢与协作倡议**
|
||||||
|
|
||||||
|
- 感谢每一位提交Issue、PR、参与讨论的开发者!您的每一行代码都是maim吃的
|
||||||
|
- 特别致敬在交流群中积极答疑的社区成员,你们自发维护的氛围令人感动❤️ ,maim哭了
|
||||||
|
- **重构期间的非代码贡献同样珍贵**:文档改进、测试用例补充、用户反馈整理等,欢迎通过Issue认领任务!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **📬 高效协作小贴士**
|
||||||
|
|
||||||
|
1. **提交前请先讨论**:创建Issue描述问题,确认是否符合`main-fix`修复范围
|
||||||
|
2. **对重构提出您的想法**:如果您对重构版有自己的想法,欢迎提交讨论issue亟需测试伙伴,欢迎邮件联系`team@xxx.org`报名
|
||||||
|
3. **部分main-fix的功能在issue讨论后,经过严格讨论,一致决定可以添加功能改动或修复的,可以提交pr**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**谢谢大家谢谢大家谢谢大家谢谢大家谢谢大家谢谢大家!**
|
||||||
|
虽然此刻不得不放缓脚步,但这一切都是为了跳得更高。期待在重构完成后与各位共建更强大的版本!
|
||||||
|
|
||||||
|
千石可乐 敬上
|
||||||
|
2025年3月14日
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 麦麦!MaiMBot (编辑中)
|
# 麦麦!MaiMBot (编辑中)
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|||||||
280
run.sh
280
run.sh
@@ -1,280 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Maimbot 一键安装脚本 by Cookie987
|
|
||||||
# 适用于Debian系
|
|
||||||
# 请小心使用任何一键脚本!
|
|
||||||
|
|
||||||
# 如无法访问GitHub请修改此处镜像地址
|
|
||||||
|
|
||||||
LANG=C.UTF-8
|
|
||||||
|
|
||||||
GITHUB_REPO="https://ghfast.top/https://github.com/SengokuCola/MaiMBot.git"
|
|
||||||
|
|
||||||
# 颜色输出
|
|
||||||
GREEN="\e[32m"
|
|
||||||
RED="\e[31m"
|
|
||||||
RESET="\e[0m"
|
|
||||||
|
|
||||||
# 需要的基本软件包
|
|
||||||
REQUIRED_PACKAGES=("git" "sudo" "python3" "python3-venv" "curl" "gnupg" "python3-pip")
|
|
||||||
|
|
||||||
# 默认项目目录
|
|
||||||
DEFAULT_INSTALL_DIR="/opt/maimbot"
|
|
||||||
|
|
||||||
# 服务名称
|
|
||||||
SERVICE_NAME="maimbot"
|
|
||||||
|
|
||||||
IS_INSTALL_MONGODB=false
|
|
||||||
IS_INSTALL_NAPCAT=false
|
|
||||||
|
|
||||||
# 1/6: 检测是否安装 whiptail
|
|
||||||
if ! command -v whiptail &>/dev/null; then
|
|
||||||
echo -e "${RED}[1/6] whiptail 未安装,正在安装...${RESET}"
|
|
||||||
apt update && apt install -y whiptail
|
|
||||||
fi
|
|
||||||
|
|
||||||
get_os_info() {
|
|
||||||
if command -v lsb_release &>/dev/null; then
|
|
||||||
OS_INFO=$(lsb_release -d | cut -f2)
|
|
||||||
elif [[ -f /etc/os-release ]]; then
|
|
||||||
OS_INFO=$(grep "^PRETTY_NAME=" /etc/os-release | cut -d '"' -f2)
|
|
||||||
else
|
|
||||||
OS_INFO="Unknown OS"
|
|
||||||
fi
|
|
||||||
echo "$OS_INFO"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查系统
|
|
||||||
check_system() {
|
|
||||||
# 检查是否为 root 用户
|
|
||||||
if [[ "$(id -u)" -ne 0 ]]; then
|
|
||||||
whiptail --title "🚫 权限不足" --msgbox "请使用 root 用户运行此脚本!\n执行方式: sudo bash $0" 10 60
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f /etc/os-release ]]; then
|
|
||||||
source /etc/os-release
|
|
||||||
if [[ "$ID" != "debian" || "$VERSION_ID" != "12" ]]; then
|
|
||||||
whiptail --title "🚫 不支持的系统" --msgbox "此脚本仅支持 Debian 12 (Bookworm)!\n当前系统: $PRETTY_NAME\n安装已终止。" 10 60
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
whiptail --title "⚠️ 无法检测系统" --msgbox "无法识别系统版本,安装已终止。" 10 60
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 3/6: 询问用户是否安装缺失的软件包
|
|
||||||
install_packages() {
|
|
||||||
missing_packages=()
|
|
||||||
for package in "${REQUIRED_PACKAGES[@]}"; do
|
|
||||||
if ! dpkg -s "$package" &>/dev/null; then
|
|
||||||
missing_packages+=("$package")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#missing_packages[@]} -gt 0 ]]; then
|
|
||||||
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到以下必须的依赖项目缺失:\n${missing_packages[*]}\n\n是否要自动安装?" 12 60
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
whiptail --title "⚠️ 注意" --yesno "某些必要的依赖项未安装,可能会影响运行!\n是否继续?" 10 60 || exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 4/6: Python 版本检查
|
|
||||||
check_python() {
|
|
||||||
PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
|
|
||||||
|
|
||||||
python3 -c "import sys; exit(0) if sys.version_info >= (3,9) else exit(1)"
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
whiptail --title "⚠️ [4/6] Python 版本过低" --msgbox "检测到 Python 版本为 $PYTHON_VERSION,需要 3.9 或以上!\n请升级 Python 后重新运行本脚本。" 10 60
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 5/6: 选择分支
|
|
||||||
choose_branch() {
|
|
||||||
BRANCH=$(whiptail --title "🔀 [5/6] 选择 Maimbot 分支" --menu "请选择要安装的 Maimbot 分支:" 15 60 2 \
|
|
||||||
"main" "稳定版本(推荐,供下载使用)" \
|
|
||||||
"main-fix" "生产环境紧急修复" 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
if [[ -z "$BRANCH" ]]; then
|
|
||||||
BRANCH="main"
|
|
||||||
whiptail --title "🔀 默认选择" --msgbox "未选择分支,默认安装稳定版本(main)" 10 60
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 6/6: 选择安装路径
|
|
||||||
choose_install_dir() {
|
|
||||||
INSTALL_DIR=$(whiptail --title "📂 [6/6] 选择安装路径" --inputbox "请输入 Maimbot 的安装目录:" 10 60 "$DEFAULT_INSTALL_DIR" 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
if [[ -z "$INSTALL_DIR" ]]; then
|
|
||||||
whiptail --title "⚠️ 取消输入" --yesno "未输入安装路径,是否退出安装?" 10 60
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
INSTALL_DIR="$DEFAULT_INSTALL_DIR"
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示确认界面
|
|
||||||
confirm_install() {
|
|
||||||
local confirm_message="请确认以下更改:\n\n"
|
|
||||||
|
|
||||||
if [[ ${#missing_packages[@]} -gt 0 ]]; then
|
|
||||||
confirm_message+="📦 安装缺失的依赖项: ${missing_packages[*]}\n"
|
|
||||||
else
|
|
||||||
confirm_message+="✅ 所有依赖项已安装\n"
|
|
||||||
fi
|
|
||||||
|
|
||||||
confirm_message+="📂 安装麦麦Bot到: $INSTALL_DIR\n"
|
|
||||||
confirm_message+="🔀 分支: $BRANCH\n"
|
|
||||||
|
|
||||||
if [[ "$MONGODB_INSTALLED" == "true" ]]; then
|
|
||||||
confirm_message+="✅ MongoDB 已安装\n"
|
|
||||||
else
|
|
||||||
if [[ "$IS_INSTALL_MONGODB" == "true" ]]; then
|
|
||||||
confirm_message+="📦 安装 MongoDB\n"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$NAPCAT_INSTALLED" == "true" ]]; then
|
|
||||||
confirm_message+="✅ NapCat 已安装\n"
|
|
||||||
else
|
|
||||||
if [[ "$IS_INSTALL_NAPCAT" == "true" ]]; then
|
|
||||||
confirm_message+="📦 安装 NapCat\n"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
confirm_message+="🛠️ 添加麦麦Bot作为系统服务 ($SERVICE_NAME.service)\n"
|
|
||||||
|
|
||||||
confitm_message+="\n\n注意:本脚本默认使用ghfast.top为GitHub进行加速,如不想使用请手动修改脚本开头的GITHUB_REPO变量。"
|
|
||||||
whiptail --title "🔧 安装确认" --yesno "$confirm_message\n\n是否继续安装?" 15 60
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
whiptail --title "🚫 取消安装" --msgbox "安装已取消。" 10 60
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_mongodb() {
|
|
||||||
if command -v mongod &>/dev/null; then
|
|
||||||
MONGO_INSTALLED=true
|
|
||||||
else
|
|
||||||
MONGO_INSTALLED=false
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 安装 MongoDB
|
|
||||||
install_mongodb() {
|
|
||||||
if [[ "$MONGO_INSTALLED" == "true" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装MongoDB,是否安装?\n如果您想使用远程数据库,请跳过此步。" 10 60
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
IS_INSTALL_MONGODB=true
|
|
||||||
}
|
|
||||||
|
|
||||||
check_napcat() {
|
|
||||||
if command -v napcat &>/dev/null; then
|
|
||||||
NAPCAT_INSTALLED=true
|
|
||||||
else
|
|
||||||
NAPCAT_INSTALLED=false
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
install_napcat() {
|
|
||||||
if [[ "$NAPCAT_INSTALLED" == "true" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装NapCat,是否安装?\n如果您想使用远程NapCat,请跳过此步。" 10 60
|
|
||||||
if [[ $? -ne 0 ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
IS_INSTALL_NAPCAT=true
|
|
||||||
}
|
|
||||||
|
|
||||||
# 运行安装步骤
|
|
||||||
whiptail --title "⚠️ 警告:安装前详阅" --msgbox "项目处于活跃开发阶段,代码可能随时更改\n文档未完善,有问题可以提交 Issue 或者 Discussion\nQQ机器人存在被限制风险,请自行了解,谨慎使用\n由于持续迭代,可能存在一些已知或未知的bug\n由于开发中,可能消耗较多token\n\n本脚本可能更新不及时,如遇到bug请优先尝试手动部署以确定是否为脚本问题" 14 60
|
|
||||||
|
|
||||||
check_system
|
|
||||||
check_mongodb
|
|
||||||
check_napcat
|
|
||||||
install_packages
|
|
||||||
install_mongodb
|
|
||||||
install_napcat
|
|
||||||
check_python
|
|
||||||
choose_branch
|
|
||||||
choose_install_dir
|
|
||||||
confirm_install
|
|
||||||
|
|
||||||
# 开始安装
|
|
||||||
whiptail --title "🚀 开始安装" --msgbox "所有环境检查完毕,即将开始安装麦麦Bot!" 10 60
|
|
||||||
|
|
||||||
echo -e "${GREEN}安装依赖项...${RESET}"
|
|
||||||
|
|
||||||
apt update && apt install -y "${missing_packages[@]}"
|
|
||||||
|
|
||||||
|
|
||||||
if [[ "$IS_INSTALL_MONGODB" == "true" ]]; then
|
|
||||||
echo -e "${GREEN}安装 MongoDB...${RESET}"
|
|
||||||
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
|
|
||||||
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y mongodb-org
|
|
||||||
|
|
||||||
systemctl enable mongod
|
|
||||||
systemctl start mongod
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$IS_INSTALL_NAPCAT" == "true" ]]; then
|
|
||||||
echo -e "${GREEN}安装 NapCat...${RESET}"
|
|
||||||
curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh && bash napcat.sh --cli y --docker n
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${GREEN}创建 Python 虚拟环境...${RESET}"
|
|
||||||
mkdir -p "$INSTALL_DIR"
|
|
||||||
cd "$INSTALL_DIR" || exit
|
|
||||||
python3 -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
|
|
||||||
echo -e "${GREEN}克隆仓库...${RESET}"
|
|
||||||
# 安装 Maimbot
|
|
||||||
mkdir -p "$INSTALL_DIR/repo"
|
|
||||||
cd "$INSTALL_DIR/repo" || exit 1
|
|
||||||
git clone -b "$BRANCH" $GITHUB_REPO .
|
|
||||||
|
|
||||||
echo -e "${GREEN}安装 Python 依赖...${RESET}"
|
|
||||||
pip install -r requirements.txt
|
|
||||||
|
|
||||||
echo -e "${GREEN}设置服务...${RESET}"
|
|
||||||
|
|
||||||
# 设置 Maimbot 服务
|
|
||||||
cat <<EOF | tee /etc/systemd/system/$SERVICE_NAME.service
|
|
||||||
[Unit]
|
|
||||||
Description=MaiMbot 麦麦
|
|
||||||
After=network.target mongod.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=$INSTALL_DIR/repo/
|
|
||||||
ExecStart=$INSTALL_DIR/venv/bin/python3 bot.py
|
|
||||||
ExecStop=/bin/kill -2 $MAINPID
|
|
||||||
Restart=always
|
|
||||||
RestartSec=10s
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable maimbot
|
|
||||||
systemctl start maimbot
|
|
||||||
|
|
||||||
whiptail --title "🎉 安装完成" --msgbox "麦麦Bot安装完成!\n已经启动麦麦Bot服务。\n\n安装路径: $INSTALL_DIR\n分支: $BRANCH" 12 60
|
|
||||||
422
run_debian12.sh
Normal file
422
run_debian12.sh
Normal file
@@ -0,0 +1,422 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 麦麦Bot一键安装脚本 by Cookie_987
|
||||||
|
# 适用于Debian12
|
||||||
|
# 请小心使用任何一键脚本!
|
||||||
|
|
||||||
|
LANG=C.UTF-8
|
||||||
|
|
||||||
|
# 如无法访问GitHub请修改此处镜像地址
|
||||||
|
GITHUB_REPO="https://ghfast.top/https://github.com/SengokuCola/MaiMBot.git"
|
||||||
|
|
||||||
|
# 颜色输出
|
||||||
|
GREEN="\e[32m"
|
||||||
|
RED="\e[31m"
|
||||||
|
RESET="\e[0m"
|
||||||
|
|
||||||
|
# 需要的基本软件包
|
||||||
|
REQUIRED_PACKAGES=("git" "sudo" "python3" "python3-venv" "curl" "gnupg" "python3-pip")
|
||||||
|
|
||||||
|
# 默认项目目录
|
||||||
|
DEFAULT_INSTALL_DIR="/opt/maimbot"
|
||||||
|
|
||||||
|
# 服务名称
|
||||||
|
SERVICE_NAME="maimbot-daemon"
|
||||||
|
SERVICE_NAME_WEB="maimbot-web"
|
||||||
|
|
||||||
|
IS_INSTALL_MONGODB=false
|
||||||
|
IS_INSTALL_NAPCAT=false
|
||||||
|
IS_INSTALL_DEPENDENCIES=false
|
||||||
|
|
||||||
|
INSTALLER_VERSION="0.0.1"
|
||||||
|
|
||||||
|
# 检查是否已安装
|
||||||
|
check_installed() {
|
||||||
|
[[ -f /etc/systemd/system/${SERVICE_NAME}.service ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# 加载安装信息
|
||||||
|
load_install_info() {
|
||||||
|
if [[ -f /etc/maimbot_install.conf ]]; then
|
||||||
|
source /etc/maimbot_install.conf
|
||||||
|
else
|
||||||
|
INSTALL_DIR="$DEFAULT_INSTALL_DIR"
|
||||||
|
BRANCH="main"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示管理菜单
|
||||||
|
show_menu() {
|
||||||
|
while true; do
|
||||||
|
choice=$(whiptail --title "麦麦Bot管理菜单" --menu "请选择要执行的操作:" 15 60 7 \
|
||||||
|
"1" "启动麦麦Bot" \
|
||||||
|
"2" "停止麦麦Bot" \
|
||||||
|
"3" "重启麦麦Bot" \
|
||||||
|
"4" "启动WebUI" \
|
||||||
|
"5" "停止WebUI" \
|
||||||
|
"6" "重启WebUI" \
|
||||||
|
"7" "更新麦麦Bot及其依赖" \
|
||||||
|
"8" "切换分支" \
|
||||||
|
"9" "更新配置文件" \
|
||||||
|
"10" "退出" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
[[ $? -ne 0 ]] && exit 0
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
1)
|
||||||
|
systemctl start ${SERVICE_NAME}
|
||||||
|
whiptail --msgbox "✅麦麦Bot已启动" 10 60
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
systemctl stop ${SERVICE_NAME}
|
||||||
|
whiptail --msgbox "🛑麦麦Bot已停止" 10 60
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
systemctl restart ${SERVICE_NAME}
|
||||||
|
whiptail --msgbox "🔄麦麦Bot已重启" 10 60
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
systemctl start ${SERVICE_NAME_WEB}
|
||||||
|
whiptail --msgbox "✅WebUI已启动" 10 60
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
systemctl stop ${SERVICE_NAME_WEB}
|
||||||
|
whiptail --msgbox "🛑WebUI已停止" 10 60
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
systemctl restart ${SERVICE_NAME_WEB}
|
||||||
|
whiptail --msgbox "🔄WebUI已重启" 10 60
|
||||||
|
;;
|
||||||
|
7)
|
||||||
|
update_dependencies
|
||||||
|
;;
|
||||||
|
8)
|
||||||
|
switch_branch
|
||||||
|
;;
|
||||||
|
9)
|
||||||
|
update_config
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
whiptail --msgbox "无效选项!" 10 60
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# 更新依赖
|
||||||
|
update_dependencies() {
|
||||||
|
cd "${INSTALL_DIR}/repo" || {
|
||||||
|
whiptail --msgbox "🚫 无法进入安装目录!" 10 60
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
if ! git pull origin "${BRANCH}"; then
|
||||||
|
whiptail --msgbox "🚫 代码更新失败!" 10 60
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
source "${INSTALL_DIR}/venv/bin/activate"
|
||||||
|
if ! pip install -r requirements.txt; then
|
||||||
|
whiptail --msgbox "🚫 依赖安装失败!" 10 60
|
||||||
|
deactivate
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
deactivate
|
||||||
|
systemctl restart ${SERVICE_NAME}
|
||||||
|
whiptail --msgbox "✅ 依赖已更新并重启服务!" 10 60
|
||||||
|
}
|
||||||
|
|
||||||
|
# 切换分支
|
||||||
|
switch_branch() {
|
||||||
|
new_branch=$(whiptail --inputbox "请输入要切换的分支名称:" 10 60 "${BRANCH}" 3>&1 1>&2 2>&3)
|
||||||
|
[[ -z "$new_branch" ]] && {
|
||||||
|
whiptail --msgbox "🚫 分支名称不能为空!" 10 60
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
cd "${INSTALL_DIR}/repo" || {
|
||||||
|
whiptail --msgbox "🚫 无法进入安装目录!" 10 60
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! git ls-remote --exit-code --heads origin "${new_branch}" >/dev/null 2>&1; then
|
||||||
|
whiptail --msgbox "🚫 分支 ${new_branch} 不存在!" 10 60
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git checkout "${new_branch}"; then
|
||||||
|
whiptail --msgbox "🚫 分支切换失败!" 10 60
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git pull origin "${new_branch}"; then
|
||||||
|
whiptail --msgbox "🚫 代码拉取失败!" 10 60
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
source "${INSTALL_DIR}/venv/bin/activate"
|
||||||
|
pip install -r requirements.txt
|
||||||
|
deactivate
|
||||||
|
|
||||||
|
sed -i "s/^BRANCH=.*/BRANCH=${new_branch}/" /etc/maimbot_install.conf
|
||||||
|
BRANCH="${new_branch}"
|
||||||
|
systemctl restart ${SERVICE_NAME}
|
||||||
|
touch "${INSTALL_DIR}/repo/elua.confirmed"
|
||||||
|
whiptail --msgbox "✅ 已切换到分支 ${new_branch} 并重启服务!" 10 60
|
||||||
|
}
|
||||||
|
|
||||||
|
# 更新配置文件
|
||||||
|
update_config() {
|
||||||
|
cd "${INSTALL_DIR}/repo" || {
|
||||||
|
whiptail --msgbox "🚫 无法进入安装目录!" 10 60
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
if [[ -f config/bot_config.toml ]]; then
|
||||||
|
cp config/bot_config.toml config/bot_config.toml.bak
|
||||||
|
whiptail --msgbox "📁 原配置文件已备份为 bot_config.toml.bak" 10 60
|
||||||
|
source "${INSTALL_DIR}/venv/bin/activate"
|
||||||
|
python3 config/auto_update.py
|
||||||
|
deactivate
|
||||||
|
whiptail --msgbox "🆕 已更新配置文件,请重启麦麦Bot!" 10 60
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
whiptail --msgbox "🚫 未找到配置文件 bot_config.toml\n 请先运行一次麦麦Bot" 10 60
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------- 主安装流程 -----------
|
||||||
|
run_installation() {
|
||||||
|
# 1/6: 检测是否安装 whiptail
|
||||||
|
if ! command -v whiptail &>/dev/null; then
|
||||||
|
echo -e "${RED}[1/6] whiptail 未安装,正在安装...${RESET}"
|
||||||
|
apt update && apt install -y whiptail
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 协议确认
|
||||||
|
if ! (whiptail --title "ℹ️ [1/6] 使用协议" --yes-button "我同意" --no-button "我拒绝" --yesno "使用麦麦Bot及此脚本前请先阅读ELUA协议\nhttps://github.com/SengokuCola/MaiMBot/blob/main/EULA.md\n\n您是否同意此协议?" 12 70); then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 欢迎信息
|
||||||
|
whiptail --title "[2/6] 欢迎使用麦麦Bot一键安装脚本 by Cookie987" --msgbox "检测到您未安装麦麦Bot,将自动进入安装流程,安装完成后再次运行此脚本即可进入管理菜单。\n\n项目处于活跃开发阶段,代码可能随时更改\n文档未完善,有问题可以提交 Issue 或者 Discussion\nQQ机器人存在被限制风险,请自行了解,谨慎使用\n由于持续迭代,可能存在一些已知或未知的bug\n由于开发中,可能消耗较多token\n\n本脚本可能更新不及时,如遇到bug请优先尝试手动部署以确定是否为脚本问题" 17 60
|
||||||
|
|
||||||
|
# 系统检查
|
||||||
|
check_system() {
|
||||||
|
if [[ "$(id -u)" -ne 0 ]]; then
|
||||||
|
whiptail --title "🚫 权限不足" --msgbox "请使用 root 用户运行此脚本!\n执行方式: sudo bash $0" 10 60
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f /etc/os-release ]]; then
|
||||||
|
source /etc/os-release
|
||||||
|
if [[ "$ID" != "debian" || "$VERSION_ID" != "12" ]]; then
|
||||||
|
whiptail --title "🚫 不支持的系统" --msgbox "此脚本仅支持 Debian 12 (Bookworm)!\n当前系统: $PRETTY_NAME\n安装已终止。" 10 60
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
whiptail --title "⚠️ 无法检测系统" --msgbox "无法识别系统版本,安装已终止。" 10 60
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
check_system
|
||||||
|
|
||||||
|
# 检查MongoDB
|
||||||
|
check_mongodb() {
|
||||||
|
if command -v mongod &>/dev/null; then
|
||||||
|
MONGO_INSTALLED=true
|
||||||
|
else
|
||||||
|
MONGO_INSTALLED=false
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
check_mongodb
|
||||||
|
|
||||||
|
# 检查NapCat
|
||||||
|
check_napcat() {
|
||||||
|
if command -v napcat &>/dev/null; then
|
||||||
|
NAPCAT_INSTALLED=true
|
||||||
|
else
|
||||||
|
NAPCAT_INSTALLED=false
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
check_napcat
|
||||||
|
|
||||||
|
# 安装必要软件包
|
||||||
|
install_packages() {
|
||||||
|
missing_packages=()
|
||||||
|
for package in "${REQUIRED_PACKAGES[@]}"; do
|
||||||
|
if ! dpkg -s "$package" &>/dev/null; then
|
||||||
|
missing_packages+=("$package")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#missing_packages[@]} -gt 0 ]]; then
|
||||||
|
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到以下必须的依赖项目缺失:\n${missing_packages[*]}\n\n是否要自动安装?" 12 60
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
IS_INSTALL_DEPENDENCIES=true
|
||||||
|
else
|
||||||
|
whiptail --title "⚠️ 注意" --yesno "某些必要的依赖项未安装,可能会影响运行!\n是否继续?" 10 60 || exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
install_packages
|
||||||
|
|
||||||
|
# 安装MongoDB
|
||||||
|
install_mongodb() {
|
||||||
|
[[ $MONGO_INSTALLED == true ]] && return
|
||||||
|
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装MongoDB,是否安装?\n如果您想使用远程数据库,请跳过此步。" 10 60 && {
|
||||||
|
echo -e "${GREEN}安装 MongoDB...${RESET}"
|
||||||
|
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
|
||||||
|
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | tee /etc/apt/sources.list.d/mongodb-org-8.0.list
|
||||||
|
apt update
|
||||||
|
apt install -y mongodb-org
|
||||||
|
systemctl enable --now mongod
|
||||||
|
IS_INSTALL_MONGODB=true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
install_mongodb
|
||||||
|
|
||||||
|
# 安装NapCat
|
||||||
|
install_napcat() {
|
||||||
|
[[ $NAPCAT_INSTALLED == true ]] && return
|
||||||
|
whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装NapCat,是否安装?\n如果您想使用远程NapCat,请跳过此步。" 10 60 && {
|
||||||
|
echo -e "${GREEN}安装 NapCat...${RESET}"
|
||||||
|
curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh && bash napcat.sh --cli y --docker n
|
||||||
|
IS_INSTALL_NAPCAT=true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
install_napcat
|
||||||
|
|
||||||
|
# Python版本检查
|
||||||
|
check_python() {
|
||||||
|
PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
|
||||||
|
if ! python3 -c "import sys; exit(0) if sys.version_info >= (3,9) else exit(1)"; then
|
||||||
|
whiptail --title "⚠️ [4/6] Python 版本过低" --msgbox "检测到 Python 版本为 $PYTHON_VERSION,需要 3.9 或以上!\n请升级 Python 后重新运行本脚本。" 10 60
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
check_python
|
||||||
|
|
||||||
|
# 选择分支
|
||||||
|
choose_branch() {
|
||||||
|
BRANCH=$(whiptail --title "🔀 [5/6] 选择麦麦Bot分支" --menu "请选择要安装的麦麦Bot分支:" 15 60 2 \
|
||||||
|
"main" "稳定版本(推荐,供下载使用)" \
|
||||||
|
"main-fix" "生产环境紧急修复" 3>&1 1>&2 2>&3)
|
||||||
|
[[ -z "$BRANCH" ]] && BRANCH="main"
|
||||||
|
}
|
||||||
|
choose_branch
|
||||||
|
|
||||||
|
# 选择安装路径
|
||||||
|
choose_install_dir() {
|
||||||
|
INSTALL_DIR=$(whiptail --title "📂 [6/6] 选择安装路径" --inputbox "请输入麦麦Bot的安装目录:" 10 60 "$DEFAULT_INSTALL_DIR" 3>&1 1>&2 2>&3)
|
||||||
|
[[ -z "$INSTALL_DIR" ]] && {
|
||||||
|
whiptail --title "⚠️ 取消输入" --yesno "未输入安装路径,是否退出安装?" 10 60 && exit 1
|
||||||
|
INSTALL_DIR="$DEFAULT_INSTALL_DIR"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
choose_install_dir
|
||||||
|
|
||||||
|
# 确认安装
|
||||||
|
confirm_install() {
|
||||||
|
local confirm_msg="请确认以下信息:\n\n"
|
||||||
|
confirm_msg+="📂 安装麦麦Bot到: $INSTALL_DIR\n"
|
||||||
|
confirm_msg+="🔀 分支: $BRANCH\n"
|
||||||
|
[[ $IS_INSTALL_DEPENDENCIES == true ]] && confirm_msg+="📦 安装依赖:${missing_packages}\n"
|
||||||
|
[[ $IS_INSTALL_MONGODB == true || $IS_INSTALL_NAPCAT == true ]] && confirm_msg+="📦 安装额外组件:\n"
|
||||||
|
|
||||||
|
[[ $IS_INSTALL_MONGODB == true ]] && confirm_msg+=" - MongoDB\n"
|
||||||
|
[[ $IS_INSTALL_NAPCAT == true ]] && confirm_msg+=" - NapCat\n"
|
||||||
|
confirm_msg+="\n注意:本脚本默认使用ghfast.top为GitHub进行加速,如不想使用请手动修改脚本开头的GITHUB_REPO变量。"
|
||||||
|
|
||||||
|
whiptail --title "🔧 安装确认" --yesno "$confirm_msg" 16 60 || exit 1
|
||||||
|
}
|
||||||
|
confirm_install
|
||||||
|
|
||||||
|
# 开始安装
|
||||||
|
echo -e "${GREEN}安装依赖...${RESET}"
|
||||||
|
[[ $IS_INSTALL_DEPENDENCIES == true ]] && apt update && apt install -y "${missing_packages[@]}"
|
||||||
|
|
||||||
|
echo -e "${GREEN}创建安装目录...${RESET}"
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
cd "$INSTALL_DIR" || exit 1
|
||||||
|
|
||||||
|
echo -e "${GREEN}设置Python虚拟环境...${RESET}"
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
echo -e "${GREEN}克隆仓库...${RESET}"
|
||||||
|
git clone -b "$BRANCH" "$GITHUB_REPO" repo || {
|
||||||
|
echo -e "${RED}克隆仓库失败!${RESET}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo -e "${GREEN}安装Python依赖...${RESET}"
|
||||||
|
pip install -r repo/requirements.txt
|
||||||
|
|
||||||
|
echo -e "${GREEN}同意协议...${RESET}"
|
||||||
|
touch repo/elua.confirmed
|
||||||
|
|
||||||
|
echo -e "${GREEN}创建系统服务...${RESET}"
|
||||||
|
cat > /etc/systemd/system/${SERVICE_NAME}.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=麦麦Bot 主进程
|
||||||
|
After=network.target mongod.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=${INSTALL_DIR}/repo
|
||||||
|
ExecStart=$INSTALL_DIR/venv/bin/python3 bot.py
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/${SERVICE_NAME_WEB}.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=麦麦Bot WebUI
|
||||||
|
After=network.target mongod.service ${SERVICE_NAME}.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=${INSTALL_DIR}/repo
|
||||||
|
ExecStart=$INSTALL_DIR/venv/bin/python3 webui.py
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable ${SERVICE_NAME}
|
||||||
|
|
||||||
|
# 保存安装信息
|
||||||
|
echo "INSTALLER_VERSION=${INSTALLER_VERSION}" > /etc/maimbot_install.conf
|
||||||
|
echo "INSTALL_DIR=${INSTALL_DIR}" >> /etc/maimbot_install.conf
|
||||||
|
echo "BRANCH=${BRANCH}" >> /etc/maimbot_install.conf
|
||||||
|
|
||||||
|
whiptail --title "🎉 安装完成" --msgbox "麦麦Bot安装完成!\n已创建系统服务:${SERVICE_NAME},${SERVICE_NAME_WEB}\n\n使用以下命令管理服务:\n启动服务:systemctl start ${SERVICE_NAME}\n查看状态:systemctl status ${SERVICE_NAME}" 14 60
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------- 主执行流程 -----------
|
||||||
|
# 检查root权限
|
||||||
|
[[ $(id -u) -ne 0 ]] && {
|
||||||
|
echo -e "${RED}请使用root用户运行此脚本!${RESET}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 如果已安装显示菜单
|
||||||
|
if check_installed; then
|
||||||
|
load_install_info
|
||||||
|
show_menu
|
||||||
|
else
|
||||||
|
run_installation
|
||||||
|
# 安装完成后询问是否启动
|
||||||
|
if whiptail --title "安装完成" --yesno "是否立即启动麦麦Bot服务?" 10 60; then
|
||||||
|
systemctl start ${SERVICE_NAME}
|
||||||
|
whiptail --msgbox "✅ 服务已启动!\n使用 systemctl status ${SERVICE_NAME} 查看状态" 10 60
|
||||||
|
fi
|
||||||
|
fi
|
||||||
319
src/plugins/memory_system/manually_alter_memory.py
Normal file
319
src/plugins/memory_system/manually_alter_memory.py
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
import datetime
|
||||||
|
from rich.console import Console
|
||||||
|
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
我想 总有那么一个瞬间
|
||||||
|
你会想和某天才变态少女助手一样
|
||||||
|
往Bot的海马体里插上几个电极 不是吗
|
||||||
|
|
||||||
|
Let's do some dirty job.
|
||||||
|
'''
|
||||||
|
|
||||||
|
# 获取当前文件的目录
|
||||||
|
current_dir = Path(__file__).resolve().parent
|
||||||
|
# 获取项目根目录(上三层目录)
|
||||||
|
project_root = current_dir.parent.parent.parent
|
||||||
|
# env.dev文件路径
|
||||||
|
env_path = project_root / ".env.dev"
|
||||||
|
|
||||||
|
# from chat.config import global_config
|
||||||
|
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
||||||
|
sys.path.append(root_path)
|
||||||
|
|
||||||
|
from src.common.logger import get_module_logger
|
||||||
|
from src.common.database import db
|
||||||
|
from src.plugins.memory_system.offline_llm import LLMModel
|
||||||
|
|
||||||
|
logger = get_module_logger('mem_alter')
|
||||||
|
console = Console()
|
||||||
|
|
||||||
|
# 加载环境变量
|
||||||
|
if env_path.exists():
|
||||||
|
logger.info(f"从 {env_path} 加载环境变量")
|
||||||
|
load_dotenv(env_path)
|
||||||
|
else:
|
||||||
|
logger.warning(f"未找到环境变量文件: {env_path}")
|
||||||
|
logger.info("将使用默认配置")
|
||||||
|
|
||||||
|
from memory_manual_build import Memory_graph, Hippocampus #海马体和记忆图
|
||||||
|
|
||||||
|
# 查询节点信息
|
||||||
|
def query_mem_info(memory_graph: Memory_graph):
|
||||||
|
while True:
|
||||||
|
query = input("\n请输入新的查询概念(输入'退出'以结束):")
|
||||||
|
if query.lower() == '退出':
|
||||||
|
break
|
||||||
|
|
||||||
|
items_list = memory_graph.get_related_item(query)
|
||||||
|
if items_list:
|
||||||
|
have_memory = False
|
||||||
|
first_layer, second_layer = items_list
|
||||||
|
if first_layer:
|
||||||
|
have_memory = True
|
||||||
|
print("\n直接相关的记忆:")
|
||||||
|
for item in first_layer:
|
||||||
|
print(f"- {item}")
|
||||||
|
if second_layer:
|
||||||
|
have_memory = True
|
||||||
|
print("\n间接相关的记忆:")
|
||||||
|
for item in second_layer:
|
||||||
|
print(f"- {item}")
|
||||||
|
if not have_memory:
|
||||||
|
print("\n未找到相关记忆。")
|
||||||
|
else:
|
||||||
|
print("未找到相关记忆。")
|
||||||
|
|
||||||
|
# 增加概念节点
|
||||||
|
def add_mem_node(hippocampus: Hippocampus):
|
||||||
|
while True:
|
||||||
|
concept = input("请输入节点概念名:\n")
|
||||||
|
result = db.graph_data.nodes.count_documents({'concept': concept})
|
||||||
|
|
||||||
|
if result != 0:
|
||||||
|
console.print("[yellow]已存在名为“{concept}”的节点,行为已取消[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
memory_items = list()
|
||||||
|
while True:
|
||||||
|
context = input("请输入节点描述信息(输入'终止'以结束)")
|
||||||
|
if context.lower() == "终止": break
|
||||||
|
memory_items.append(context)
|
||||||
|
|
||||||
|
current_time = datetime.datetime.now().timestamp()
|
||||||
|
hippocampus.memory_graph.G.add_node(concept,
|
||||||
|
memory_items=memory_items,
|
||||||
|
created_time=current_time,
|
||||||
|
last_modified=current_time)
|
||||||
|
# 删除概念节点(及连接到它的边)
|
||||||
|
def remove_mem_node(hippocampus: Hippocampus):
|
||||||
|
concept = input("请输入节点概念名:\n")
|
||||||
|
result = db.graph_data.nodes.count_documents({'concept': concept})
|
||||||
|
|
||||||
|
if result == 0:
|
||||||
|
console.print(f"[red]不存在名为“{concept}”的节点[/red]")
|
||||||
|
|
||||||
|
edges = db.graph_data.edges.find({
|
||||||
|
'$or': [
|
||||||
|
{'source': concept},
|
||||||
|
{'target': concept}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
for edge in edges:
|
||||||
|
console.print(f"[yellow]存在边“{edge['source']} -> {edge['target']}”, 请慎重考虑[/yellow]")
|
||||||
|
|
||||||
|
console.print(f"[yellow]确定要移除名为“{concept}”的节点以及其相关边吗[/yellow]")
|
||||||
|
destory = console.input(f"[red]请输入“{concept}”以删除节点 其他输入将被视为取消操作[/red]\n")
|
||||||
|
if destory == concept:
|
||||||
|
hippocampus.memory_graph.G.remove_node(concept)
|
||||||
|
else:
|
||||||
|
logger.info("[green]删除操作已取消[/green]")
|
||||||
|
# 增加节点间边
|
||||||
|
def add_mem_edge(hippocampus: Hippocampus):
|
||||||
|
while True:
|
||||||
|
source = input("请输入 **第一个节点** 名称(输入'退出'以结束):\n")
|
||||||
|
if source.lower() == "退出": break
|
||||||
|
if db.graph_data.nodes.count_documents({'concept': source}) == 0:
|
||||||
|
console.print(f"[yellow]“{source}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
target = input("请输入 **第二个节点** 名称:\n")
|
||||||
|
if db.graph_data.nodes.count_documents({'concept': target}) == 0:
|
||||||
|
console.print(f"[yellow]“{target}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if source == target:
|
||||||
|
console.print(f"[yellow]试图创建“{source} <-> {target}”自环,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
hippocampus.memory_graph.connect_dot(source, target)
|
||||||
|
edge = hippocampus.memory_graph.G.get_edge_data(source, target)
|
||||||
|
if edge['strength'] == 1:
|
||||||
|
console.print(f"[green]成功创建边“{source} <-> {target}”,默认权重1[/green]")
|
||||||
|
else:
|
||||||
|
console.print(f"[yellow]边“{source} <-> {target}”已存在,更新权重: {edge['strength']-1} <-> {edge['strength']}[/yellow]")
|
||||||
|
# 删除节点间边
|
||||||
|
def remove_mem_edge(hippocampus: Hippocampus):
|
||||||
|
while True:
|
||||||
|
source = input("请输入 **第一个节点** 名称(输入'退出'以结束):\n")
|
||||||
|
if source.lower() == "退出": break
|
||||||
|
if db.graph_data.nodes.count_documents({'concept': source}) == 0:
|
||||||
|
console.print("[yellow]“{source}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
target = input("请输入 **第二个节点** 名称:\n")
|
||||||
|
if db.graph_data.nodes.count_documents({'concept': target}) == 0:
|
||||||
|
console.print("[yellow]“{target}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if source == target:
|
||||||
|
console.print("[yellow]试图创建“{source} <-> {target}”自环,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
edge = hippocampus.memory_graph.G.get_edge_data(source, target)
|
||||||
|
if edge is None:
|
||||||
|
console.print("[yellow]边“{source} <-> {target}”不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
accept = console.input("[orange]请输入“确认”以确认删除操作(其他输入视为取消)[/orange]\n")
|
||||||
|
if accept.lower() == "确认":
|
||||||
|
hippocampus.memory_graph.G.remove_edge(source, target)
|
||||||
|
console.print(f"[green]边“{source} <-> {target}”已删除。[green]")
|
||||||
|
|
||||||
|
# 修改节点信息
|
||||||
|
def alter_mem_node(hippocampus: Hippocampus):
|
||||||
|
batchEnviroment = dict()
|
||||||
|
while True:
|
||||||
|
concept = input("请输入节点概念名(输入'终止'以结束):\n")
|
||||||
|
if concept.lower() == "终止": break
|
||||||
|
_, node = hippocampus.memory_graph.get_dot(concept)
|
||||||
|
if node is None:
|
||||||
|
console.print(f"[yellow]“{concept}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
console.print("[yellow]注意,请确保你知道自己在做什么[/yellow]")
|
||||||
|
console.print("[yellow]你将获得一个执行任意代码的环境[/yellow]")
|
||||||
|
console.print("[red]你已经被警告过了。[/red]\n")
|
||||||
|
|
||||||
|
nodeEnviroment = {"concept": '<节点名>', 'memory_items': '<记忆文本数组>'}
|
||||||
|
console.print("[green]环境变量中会有env与batchEnv两个dict, env在切换节点时会清空, batchEnv在操作终止时才会清空[/green]")
|
||||||
|
console.print(f"[green] env 会被初始化为[/green]\n{nodeEnviroment}\n[green]且会在用户代码执行完毕后被提交 [/green]")
|
||||||
|
console.print("[yellow]为便于书写临时脚本,请手动在输入代码通过Ctrl+C等方式触发KeyboardInterrupt来结束代码执行[/yellow]")
|
||||||
|
|
||||||
|
# 拷贝数据以防操作炸了
|
||||||
|
nodeEnviroment = dict(node)
|
||||||
|
nodeEnviroment['concept'] = concept
|
||||||
|
|
||||||
|
while True:
|
||||||
|
userexec = lambda script, env, batchEnv: eval(script)
|
||||||
|
try:
|
||||||
|
command = console.input()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# 稍微防一下小天才
|
||||||
|
try:
|
||||||
|
if isinstance(nodeEnviroment['memory_items'], list):
|
||||||
|
node['memory_items'] = nodeEnviroment['memory_items']
|
||||||
|
else:
|
||||||
|
raise Exception
|
||||||
|
|
||||||
|
except:
|
||||||
|
console.print("[red]我不知道你做了什么,但显然nodeEnviroment['memory_items']已经不是个数组了,操作已取消[/red]")
|
||||||
|
break
|
||||||
|
|
||||||
|
try:
|
||||||
|
userexec(command, nodeEnviroment, batchEnviroment)
|
||||||
|
except Exception as e:
|
||||||
|
console.print(e)
|
||||||
|
console.print("[red]自定义代码执行时发生异常,已捕获,请重试(可通过 console.print(locals()) 检查环境状态)[/red]")
|
||||||
|
# 修改边信息
|
||||||
|
def alter_mem_edge(hippocampus: Hippocampus):
|
||||||
|
batchEnviroment = dict()
|
||||||
|
while True:
|
||||||
|
source = input("请输入 **第一个节点** 名称(输入'终止'以结束):\n")
|
||||||
|
if source.lower() == "终止": break
|
||||||
|
if hippocampus.memory_graph.get_dot(source) is None:
|
||||||
|
console.print(f"[yellow]“{source}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
target = input("请输入 **第二个节点** 名称:\n")
|
||||||
|
if hippocampus.memory_graph.get_dot(target) is None:
|
||||||
|
console.print(f"[yellow]“{target}”节点不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
edge = hippocampus.memory_graph.G.get_edge_data(source, target)
|
||||||
|
if edge is None:
|
||||||
|
console.print(f"[yellow]边“{source} <-> {target}”不存在,操作已取消。[/yellow]")
|
||||||
|
continue
|
||||||
|
|
||||||
|
console.print("[yellow]注意,请确保你知道自己在做什么[/yellow]")
|
||||||
|
console.print("[yellow]你将获得一个执行任意代码的环境[/yellow]")
|
||||||
|
console.print("[red]你已经被警告过了。[/red]\n")
|
||||||
|
|
||||||
|
edgeEnviroment = {"source": '<节点名>', "target": '<节点名>', 'strength': '<强度值,装在一个list里>'}
|
||||||
|
console.print("[green]环境变量中会有env与batchEnv两个dict, env在切换节点时会清空, batchEnv在操作终止时才会清空[/green]")
|
||||||
|
console.print(f"[green] env 会被初始化为[/green]\n{edgeEnviroment}\n[green]且会在用户代码执行完毕后被提交 [/green]")
|
||||||
|
console.print("[yellow]为便于书写临时脚本,请手动在输入代码通过Ctrl+C等方式触发KeyboardInterrupt来结束代码执行[/yellow]")
|
||||||
|
|
||||||
|
# 拷贝数据以防操作炸了
|
||||||
|
edgeEnviroment['strength'] = [edge["strength"]]
|
||||||
|
edgeEnviroment['source'] = source
|
||||||
|
edgeEnviroment['target'] = target
|
||||||
|
|
||||||
|
while True:
|
||||||
|
userexec = lambda script, env, batchEnv: eval(script)
|
||||||
|
try:
|
||||||
|
command = console.input()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# 稍微防一下小天才
|
||||||
|
try:
|
||||||
|
if isinstance(edgeEnviroment['strength'][0], int):
|
||||||
|
edge['strength'] = edgeEnviroment['strength'][0]
|
||||||
|
else:
|
||||||
|
raise Exception
|
||||||
|
|
||||||
|
except:
|
||||||
|
console.print("[red]我不知道你做了什么,但显然edgeEnviroment['strength']已经不是个int了,操作已取消[/red]")
|
||||||
|
break
|
||||||
|
|
||||||
|
try:
|
||||||
|
userexec(command, edgeEnviroment, batchEnviroment)
|
||||||
|
except Exception as e:
|
||||||
|
console.print(e)
|
||||||
|
console.print("[red]自定义代码执行时发生异常,已捕获,请重试(可通过 console.print(locals()) 检查环境状态)[/red]")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
# 创建记忆图
|
||||||
|
memory_graph = Memory_graph()
|
||||||
|
|
||||||
|
# 创建海马体
|
||||||
|
hippocampus = Hippocampus(memory_graph)
|
||||||
|
|
||||||
|
# 从数据库同步数据
|
||||||
|
hippocampus.sync_memory_from_db()
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
logger.info(f"\033[32m[加载海马体耗时: {end_time - start_time:.2f} 秒]\033[0m")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
query = int(input("请输入操作类型\n0 -> 查询节点; 1 -> 增加节点; 2 -> 移除节点; 3 -> 增加边; 4 -> 移除边;\n5 -> 修改节点; 6 -> 修改边; 其他任意输入 -> 退出\n"))
|
||||||
|
except:
|
||||||
|
query = -1
|
||||||
|
|
||||||
|
if query == 0:
|
||||||
|
query_mem_info(memory_graph)
|
||||||
|
elif query == 1:
|
||||||
|
add_mem_node(hippocampus)
|
||||||
|
elif query == 2:
|
||||||
|
remove_mem_node(hippocampus)
|
||||||
|
elif query == 3:
|
||||||
|
add_mem_edge(hippocampus)
|
||||||
|
elif query == 4:
|
||||||
|
remove_mem_edge(hippocampus)
|
||||||
|
elif query == 5:
|
||||||
|
alter_mem_node(hippocampus)
|
||||||
|
elif query == 6:
|
||||||
|
alter_mem_edge(hippocampus)
|
||||||
|
else:
|
||||||
|
print("已结束操作")
|
||||||
|
break
|
||||||
|
|
||||||
|
hippocampus.sync_memory_to_db()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import asyncio
|
||||||
|
asyncio.run(main())
|
||||||
Reference in New Issue
Block a user