From 8bceb1a589f1983ffd45f55996958cc33be8d466 Mon Sep 17 00:00:00 2001 From: jiajiu123 <60831923+jiajiu123@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:46:03 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E8=A7=84=E8=8C=83Pull=20Request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull_request_template.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..aa0870f27 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,17 @@ +--- +name: Pull Request +about: Pull Request +labels: "Pull Request" +--- +# 请填写以下内容 +1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** +2. - [ ] 本次更新 **包含破坏性变更**(如数据库结构变更、配置文件修改等) +3. - [ ] 本次更新是否经过测试 +4. 请填写破坏性更新的具体内容(如有): + +5. 请简要说明本次更新的内容和目的: + +--- +# 其他信息 +- **关联 Issue**:Closes # +- **截图/GIF**: From 4cd4e4fba9d65ae0207fbd759bbc00e67ec06b48 Mon Sep 17 00:00:00 2001 From: jiajiu123 <60831923+jiajiu123@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:54:47 +0800 Subject: [PATCH 02/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Pull=20Request=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull_request_template.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index aa0870f27..305e1d360 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,14 +4,12 @@ about: Pull Request labels: "Pull Request" --- # 请填写以下内容 +(删除掉中括号内的空格,并替换为**小写的x**) 1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** 2. - [ ] 本次更新 **包含破坏性变更**(如数据库结构变更、配置文件修改等) 3. - [ ] 本次更新是否经过测试 4. 请填写破坏性更新的具体内容(如有): - 5. 请简要说明本次更新的内容和目的: - ---- # 其他信息 -- **关联 Issue**:Closes # +- **关联 Issue**:Close # - **截图/GIF**: From de80db4463bb8b0275e5de1507737e6dd4e5ba18 Mon Sep 17 00:00:00 2001 From: jiajiu123 <60831923+jiajiu123@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:56:57 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Pull=20Request=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull_request_template.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 305e1d360..9c3f58dc4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,8 +1,3 @@ ---- -name: Pull Request -about: Pull Request -labels: "Pull Request" ---- # 请填写以下内容 (删除掉中括号内的空格,并替换为**小写的x**) 1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** From 0ee03bd7c327afac50663f64ed232a83bdd6fdf1 Mon Sep 17 00:00:00 2001 From: jiajiu123 <60831923+jiajiu123@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:57:50 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Pull=20Request=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9c3f58dc4..adca3069c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,3 +8,4 @@ # 其他信息 - **关联 Issue**:Close # - **截图/GIF**: +- **附加信息**: From 49029c0af7ad0c04dbff019721317fac456dc295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Thu, 13 Mar 2025 02:14:44 +0900 Subject: [PATCH 05/28] Create main.yml --- .github/workflows/main.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..4adeffd74 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,8 @@ +name: Ruff +on: [ push, pull_request ] +jobs: + ruff: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/ruff-action@v3 From 8a2f21f75fa90d798693f0aa72e633e857396ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Thu, 13 Mar 2025 02:21:07 +0900 Subject: [PATCH 06/28] rename ruff acion config file --- .github/workflows/{main.yml => ruff.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{main.yml => ruff.yml} (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/ruff.yml similarity index 100% rename from .github/workflows/main.yml rename to .github/workflows/ruff.yml From 2578f3a3ae30d69f9460db7688def32f0275d880 Mon Sep 17 00:00:00 2001 From: jiajiu123 <60831923+jiajiu123@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:22:56 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20pull=5Frequest=5Ftem?= =?UTF-8?q?plate.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull_request_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index adca3069c..864ede18b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,8 +3,9 @@ 1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** 2. - [ ] 本次更新 **包含破坏性变更**(如数据库结构变更、配置文件修改等) 3. - [ ] 本次更新是否经过测试 -4. 请填写破坏性更新的具体内容(如有): -5. 请简要说明本次更新的内容和目的: +4. - [ ] 请**不要**在数据库中添加group_id字段,这会影响本项目对其他平台的兼容 +5. 请填写破坏性更新的具体内容(如有): +6. 请简要说明本次更新的内容和目的: # 其他信息 - **关联 Issue**:Close # - **截图/GIF**: From d75f1046ebc7f94744bbc5ac9dd0eca5d7b0f5ff Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 14 Mar 2025 09:50:56 +0800 Subject: [PATCH 08/28] Update pull_request_template.md --- .github/pull_request_template.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 864ede18b..d15ecd035 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,3 +1,9 @@ + +🔴 **当前项目处于重构阶段(2025.3.14-)** +✅ 接受:与main直接相关的Bug修复:提交到main-fix分支 +✅ 接受:部分与重构分支refractor直接相关的Bug修复:提交到refractor分支 +⚠️ 冻结:所有新功能开发和非紧急重构 + # 请填写以下内容 (删除掉中括号内的空格,并替换为**小写的x**) 1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** From 62dd1a0979801051d891e219efdbb50029549818 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 14 Mar 2025 09:51:28 +0800 Subject: [PATCH 09/28] Update pull_request_template.md --- .github/pull_request_template.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d15ecd035..254a554ef 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,8 +1,8 @@ -🔴 **当前项目处于重构阶段(2025.3.14-)** -✅ 接受:与main直接相关的Bug修复:提交到main-fix分支 -✅ 接受:部分与重构分支refractor直接相关的Bug修复:提交到refractor分支 -⚠️ 冻结:所有新功能开发和非紧急重构 +- 🔴**当前项目处于重构阶段(2025.3.14-)** +- ✅ 接受:与main直接相关的Bug修复:提交到main-fix分支 +- ✅ 接受:部分与重构分支refractor直接相关的Bug修复:提交到refractor分支 +- ⚠️ 冻结:所有新功能开发和非紧急重构 # 请填写以下内容 (删除掉中括号内的空格,并替换为**小写的x**) From a0bf0ea75de8d92beb7a55462101293f993d0ace Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 14 Mar 2025 09:52:48 +0800 Subject: [PATCH 10/28] Create precheck.yml --- .github/workflows/precheck.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/precheck.yml diff --git a/.github/workflows/precheck.yml b/.github/workflows/precheck.yml new file mode 100644 index 000000000..a7524ccb3 --- /dev/null +++ b/.github/workflows/precheck.yml @@ -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: ['🚫冲突需处理'] + }) From 7d4c0c9a0f51b2201a8d4ff460c7abad0c12e46b Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 14 Mar 2025 11:00:47 +0800 Subject: [PATCH 11/28] Update README.md --- README.md | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/README.md b/README.md index ad318aecc..2fc8961e5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,81 @@ +# 关于项目分支调整与贡献指南的重要通知 +
+ + - 📂 致所有为麦麦提交过贡献,以及想要为麦麦提交贡献的朋友们! + +--- + +**📢 关于项目分支调整与贡献指南的重要通知** +**致所有关注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日 + +
+ + + + + # 麦麦!MaiMBot (编辑中)
From 15bde8ab2de2a5f8ce58f3dbb5efc9657c4f3de8 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Fri, 14 Mar 2025 17:43:52 +0800 Subject: [PATCH 12/28] Update pull_request_template.md --- .github/pull_request_template.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 254a554ef..19a587960 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,6 @@ - 🔴**当前项目处于重构阶段(2025.3.14-)** - ✅ 接受:与main直接相关的Bug修复:提交到main-fix分支 -- ✅ 接受:部分与重构分支refractor直接相关的Bug修复:提交到refractor分支 - ⚠️ 冻结:所有新功能开发和非紧急重构 # 请填写以下内容 From 37674bcab7c5999b4eb415d57fa9f5374716f241 Mon Sep 17 00:00:00 2001 From: Cookie987 Date: Sat, 15 Mar 2025 13:04:41 +0800 Subject: [PATCH 13/28] =?UTF-8?q?feat:=20=E8=84=9A=E6=9C=AC=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E6=8F=90=E7=A4=BA=E7=94=A8=E6=88=B7=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E7=94=A8=E6=88=B7=E5=8D=8F=E8=AE=AE=E5=B9=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BAeula.confirmed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/run.sh b/run.sh index 663fc8a67..c96293c10 100644 --- a/run.sh +++ b/run.sh @@ -1,13 +1,12 @@ #!/bin/bash -# Maimbot 一键安装脚本 by Cookie987 -# 适用于Debian系 +# Maimbot 一键安装脚本 by Cookie_987 +# 适用于Debian12 # 请小心使用任何一键脚本! -# 如无法访问GitHub请修改此处镜像地址 - LANG=C.UTF-8 +# 如无法访问GitHub请修改此处镜像地址 GITHUB_REPO="https://ghfast.top/https://github.com/SengokuCola/MaiMBot.git" # 颜色输出 @@ -201,7 +200,11 @@ install_napcat() { } # 运行安装步骤 -whiptail --title "⚠️ 警告:安装前详阅" --msgbox "项目处于活跃开发阶段,代码可能随时更改\n文档未完善,有问题可以提交 Issue 或者 Discussion\nQQ机器人存在被限制风险,请自行了解,谨慎使用\n由于持续迭代,可能存在一些已知或未知的bug\n由于开发中,可能消耗较多token\n\n本脚本可能更新不及时,如遇到bug请优先尝试手动部署以确定是否为脚本问题" 14 60 +if (whiptail --title "ℹ️ [1/6] 使用协议" --yes-button "我同意" --no-button "我拒绝" --yesno "使用MaiMBot及此脚本前请先阅读ELUA协议\nhttps://github.com/SengokuCola/MaiMBot/blob/main/EULA.md\n\n您是否同意此协议?" 10 70) then + whiptail --title "[2/6] 欢迎使用麦麦Bot一键安装脚本 by Cookie987" --msgbox "项目处于活跃开发阶段,代码可能随时更改\n文档未完善,有问题可以提交 Issue 或者 Discussion\nQQ机器人存在被限制风险,请自行了解,谨慎使用\n由于持续迭代,可能存在一些已知或未知的bug\n由于开发中,可能消耗较多token\n\n本脚本可能更新不及时,如遇到bug请优先尝试手动部署以确定是否为脚本问题" 14 60 +else + exit 5 +fi check_system check_mongodb @@ -253,6 +256,9 @@ git clone -b "$BRANCH" $GITHUB_REPO . echo -e "${GREEN}安装 Python 依赖...${RESET}" pip install -r requirements.txt +echo -e "${GREEN}同意协议...${RESET}" +touch elua.confirmed + echo -e "${GREEN}设置服务...${RESET}" # 设置 Maimbot 服务 @@ -264,7 +270,7 @@ After=network.target mongod.service [Service] Type=simple WorkingDirectory=$INSTALL_DIR/repo/ -ExecStart=$INSTALL_DIR/venv/bin/python3 bot.py +ExecStart=/bin/bash -c "source $INSTALL_DIR/venv/bin/activate && nb run" ExecStop=/bin/kill -2 $MAINPID Restart=always RestartSec=10s From a49f2774d0588bf448101d6ce59b05a72cfa73c4 Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Sun, 16 Mar 2025 19:57:11 +0800 Subject: [PATCH 14/28] =?UTF-8?q?fix=EF=BC=9A=E6=B7=BB=E5=8A=A0conda?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=80=89=E9=A1=B9=20=E6=9B=B4=E6=94=B9MongoD?= =?UTF-8?q?B=E5=90=AF=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MaiLauncher.bat | 1173 +++++++++++++++++++++++++---------------------- 1 file changed, 636 insertions(+), 537 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index c3dce052a..adb7a1a7e 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -1,537 +1,636 @@ -@echo off -@setlocal enabledelayedexpansion -@chcp 936 - -@REM 设置版本号 -set "VERSION=1.0" - -title 麦麦Bot控制台 v%VERSION% - -@REM 设置Python和Git环境变量 -set "_root=%~dp0" -set "_root=%_root:~0,-1%" -cd "%_root%" - - -:search_python -cls -if exist "%_root%\python" ( - set "PYTHON_HOME=%_root%\python" -) else if exist "%_root%\venv" ( - call "%_root%\venv\Scripts\activate.bat" - set "PYTHON_HOME=%_root%\venv\Scripts" -) else ( - echo 正在自动查找Python解释器... - - where python >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where python') do ( - echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul - if errorlevel 1 ( - echo 找到Python解释器:%%i - set "py_path=%%i" - goto :validate_python - ) - ) - ) - set "search_paths=%ProgramFiles%\Git*;!LocalAppData!\Programs\Python\Python*" - for /d %%d in (!search_paths!) do ( - if exist "%%d\python.exe" ( - set "py_path=%%d\python.exe" - goto :validate_python - ) - ) - echo 没有找到Python解释器,要安装吗? - set /p pyinstall_confirm="继续?(Y/n): " - if /i "!pyinstall_confirm!"=="Y" ( - cls - echo 正在安装Python... - winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements - if %errorlevel% neq 0 ( - echo 安装失败,请手动安装Python - start https://www.python.org/downloads/ - exit /b - ) - echo 安装完成,正在验证Python... - goto search_python - - ) else ( - echo 取消安装Python,按任意键退出... - pause >nul - exit /b - ) - - echo 错误:未找到可用的Python解释器! - exit /b 1 - - :validate_python - "!py_path!" --version >nul 2>&1 - if %errorlevel% neq 0 ( - echo 无效的Python解释器:%py_path% - exit /b 1 - ) - - :: 提取安装目录 - for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" - set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" -) -if not exist "%PYTHON_HOME%\python.exe" ( - echo Python路径验证失败:%PYTHON_HOME% - echo 请检查Python安装路径中是否有python.exe文件 - exit /b 1 -) -echo 成功设置Python路径:%PYTHON_HOME% - - - -:search_git -cls -if exist "%_root%\tools\git\bin" ( - set "GIT_HOME=%_root%\tools\git\bin" -) else ( - echo 正在自动查找Git... - - where git >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where git') do ( - set "git_path=%%i" - goto :validate_git - ) - ) - echo 正在扫描常见安装路径... - set "search_paths=!ProgramFiles!\Git\cmd" - for /f "tokens=*" %%d in ("!search_paths!") do ( - if exist "%%d\git.exe" ( - set "git_path=%%d\git.exe" - goto :validate_git - ) - ) - echo 没有找到Git,要安装吗? - set /p confirm="继续?(Y/N): " - if /i "!confirm!"=="Y" ( - cls - echo 正在安装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 "download_path=%TEMP%\Git-Installer.exe" - - echo 正在下载Git安装包... - curl -L -o "!download_path!" "!custom_url!" - - if exist "!download_path!" ( - echo 下载成功,开始安装Git... - start /wait "" "!download_path!" /SILENT /NORESTART - ) else ( - echo 下载失败,请手动安装Git - start https://git-scm.com/download/win - exit /b - ) - - del "!download_path!" - echo 临时文件已清理。 - - echo 安装完成,正在验证Git... - where git >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where git') do ( - set "git_path=%%i" - goto :validate_git - ) - goto :search_git - - ) else ( - echo 安装完成,但未找到Git,请手动安装Git - start https://git-scm.com/download/win - exit /b - ) - - ) else ( - echo 取消安装Git,按任意键退出... - pause >nul - exit /b - ) - - echo 错误:未找到可用的Git! - exit /b 1 - - :validate_git - "%git_path%" --version >nul 2>&1 - if %errorlevel% neq 0 ( - echo 无效的Git:%git_path% - exit /b 1 - ) - - :: 提取安装目录 - for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" - set "GIT_HOME=%GIT_HOME:~0,-1%" -) - -:search_mongodb -cls -sc query | findstr /i "MongoDB" >nul -if !errorlevel! neq 0 ( - echo MongoDB服务未运行,正在尝试启动... - powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" - echo 正在等待MongoDB服务启动... - echo 按下任意键跳过等待... - timeout /t 30 >nul - sc query | findstr /i "MongoDB" >nul - if !errorlevel! neq 0 ( - echo MongoDB服务启动失败,可能是没有安装,要安装吗? - set /p confirm="继续?(Y/N): " - if /i "!confirm!"=="Y" ( - echo 正在安装MongoDB... - winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements - echo 安装完成,正在启动MongoDB服务... - net start MongoDB - if %errorlevel% neq 0 ( - echo 启动MongoDB服务失败,请手动启动 - exit /b - ) - echo MongoDB服务已启动 - ) else ( - echo 取消安装MongoDB,按任意键退出... - pause >nul - exit /b - ) - ) -) else ( - echo MongoDB服务已运行 -) - -@REM set "GIT_HOME=%_root%\tools\git\bin" -set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" - -:install_maim -if not exist "!_root!\bot.py" ( - cls - echo 你似乎没有安装麦麦Bot,要安装在当前目录吗? - set /p confirm="继续?(Y/N): " - if /i "!confirm!"=="Y" ( - echo 要使用Git代理下载吗? - set /p proxy_confirm="继续?(Y/N): " - if /i "!proxy_confirm!"=="Y" ( - echo 正在安装麦麦Bot... - git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot - ) else ( - echo 正在安装麦麦Bot... - git clone https://github.com/SengokuCola/MaiMBot - ) - xcopy /E /H /I MaiMBot . >nul 2>&1 - rmdir /s /q MaiMBot - git checkout main-fix - - echo 安装完成,正在安装依赖... - python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple - python -m pip install virtualenv - python -m virtualenv venv - call venv\Scripts\activate.bat - python -m pip install -r requirements.txt - - echo 安装完成,要编辑配置文件吗? - set /p edit_confirm="继续?(Y/N): " - if /i "!edit_confirm!"=="Y" ( - goto config_menu - ) else ( - echo 取消编辑配置文件,按任意键返回主菜单... - ) - ) -) - - -@REM git获取当前分支名并保存在变量里 -for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( - set "BRANCH=%%b" -) - -@REM 根据不同分支名给分支名字符串使用不同颜色 -echo 分支名: %BRANCH% -if "!BRANCH!"=="main" ( - set "BRANCH_COLOR=" -) else if "!BRANCH!"=="main-fix" ( - set "BRANCH_COLOR=" -@REM ) else if "%BRANCH%"=="stable-dev" ( -@REM set "BRANCH_COLOR=" -) else ( - set "BRANCH_COLOR=" -) - -@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" - -:check_is_venv -echo 正在检查是否在虚拟环境中... -if exist "%_root%\config\no_venv" ( - echo 检测到no_venv,跳过虚拟环境检查 - goto menu -) -if not defined VIRTUAL_ENV ( - echo 当前使用的Python环境为: - echo !PYTHON_HOME! - echo 似乎没有使用虚拟环境,是否要创建一个新的虚拟环境? - set /p confirm="继续?(Y/N): " - if /i "!confirm!"=="Y" ( - echo 正在创建虚拟环境... - python -m virtualenv venv - call venv\Scripts\activate.bat - echo 要安装依赖吗? - set /p install_confirm="继续?(Y/N): " - if /i "%install_confirm%"=="Y" ( - echo 正在安装依赖... - python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple - python -m pip install -r requirements.txt - ) - echo 虚拟环境创建完成,按任意键返回... - ) else ( - echo 要永久跳过虚拟环境检查吗? - set /p no_venv_confirm="继续?(Y/N): " - if /i "!no_venv_confirm!"=="Y" ( - echo 正在创建no_venv文件... - echo 1 > "%_root%\config\no_venv" - echo 已创建no_venv文件,按任意键返回... - ) else ( - echo 取消跳过虚拟环境检查,按任意键返回... - ) - ) - pause >nul -) -goto menu - -:menu -@chcp 936 -cls -echo 麦麦Bot控制台 v%VERSION% 当前分支: %BRANCH_COLOR%%BRANCH% -echo 当前Python环境: !PYTHON_HOME! -echo ====================== -echo 1. 更新并启动麦麦Bot (默认) -echo 2. 直接启动麦麦Bot -echo 3. 启动麦麦配置界面 -echo 4. 打开麦麦神奇工具箱 -echo 5. 退出 -echo ====================== - -set /p choice="请输入选项数字 (1-5)并按下回车以选择: " - -if "!choice!"=="" set choice=1 - -if "!choice!"=="1" goto update_and_start -if "!choice!"=="2" goto start_bot -if "!choice!"=="3" goto config_menu -if "!choice!"=="4" goto tools_menu -if "!choice!"=="5" exit /b - -echo 无效的输入,请输入1-5之间的数字 -timeout /t 2 >nul -goto menu - -:config_menu -@chcp 936 -cls -if not exist config/bot_config.toml ( - copy /Y "template\bot_config_template.toml" "config\bot_config.toml" - -) -if not exist .env.prod ( - copy /Y "template\.env.prod" ".env.prod" -) - -start python webui.py - -goto menu - - -:tools_menu -@chcp 936 -cls -echo 麦麦时尚工具箱 当前分支: %BRANCH_COLOR%%BRANCH% -echo ====================== -echo 1. 更新依赖 -echo 2. 切换分支 -echo 3. 重置当前分支 -echo 4. 更新配置文件 -echo 5. 学习新的知识库 -echo 6. 打开知识库文件夹 -echo 7. 返回主菜单 -echo ====================== - -set /p choice="请输入选项数字: " -if "!choice!"=="1" goto update_dependencies -if "!choice!"=="2" goto switch_branch -if "!choice!"=="3" goto reset_branch -if "!choice!"=="4" goto update_config -if "!choice!"=="5" goto learn_new_knowledge -if "!choice!"=="6" goto open_knowledge_folder -if "!choice!"=="7" goto menu - -echo 无效的输入,请输入1-6之间的数字 -timeout /t 2 >nul -goto tools_menu - -:update_dependencies -cls -echo 正在更新依赖... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python.exe -m pip install -r requirements.txt - -echo 依赖更新完成,按任意键返回工具箱菜单... -pause -goto tools_menu - -:switch_branch -cls -echo 正在切换分支... -echo 当前分支: %BRANCH% -@REM echo 可用分支: main, debug, stable-dev -echo 1. 切换到main -echo 2. 切换到main-fix -echo 请输入要切换到的分支: -set /p branch_name="分支名: " -if "%branch_name%"=="" set branch_name=main -if "%branch_name%"=="main" ( - set "BRANCH_COLOR=" -) else if "%branch_name%"=="main-fix" ( - set "BRANCH_COLOR=" -@REM ) else if "%branch_name%"=="stable-dev" ( -@REM set "BRANCH_COLOR=" -) else if "%branch_name%"=="1" ( - set "BRANCH_COLOR=" - set "branch_name=main" -) else if "%branch_name%"=="2" ( - set "BRANCH_COLOR=" - set "branch_name=main-fix" -) else ( - echo 无效的分支名, 请重新输入 - timeout /t 2 >nul - goto switch_branch -) - -echo 正在切换到分支 %branch_name%... -git checkout %branch_name% -echo 分支切换完成,当前分支: %BRANCH_COLOR%%branch_name% -set "BRANCH=%branch_name%" -echo 按任意键返回工具箱菜单... -pause >nul -goto tools_menu - - -:reset_branch -cls -echo 正在重置当前分支... -echo 当前分支: !BRANCH! -echo 确认要重置当前分支吗? -set /p confirm="继续?(Y/N): " -if /i "!confirm!"=="Y" ( - echo 正在重置当前分支... - git reset --hard !BRANCH! - echo 分支重置完成,按任意键返回工具箱菜单... -) else ( - echo 取消重置当前分支,按任意键返回工具箱菜单... -) -pause >nul -goto tools_menu - - -:update_config -cls -echo 正在更新配置文件... -echo 请确保已备份重要数据,继续将修改当前配置文件。 -echo 继续请按Y,取消请按任意键... -set /p confirm="继续?(Y/N): " -if /i "!confirm!"=="Y" ( - echo 正在更新配置文件... - python.exe config\auto_update.py - echo 配置文件更新完成,按任意键返回工具箱菜单... -) else ( - echo 取消更新配置文件,按任意键返回工具箱菜单... -) -pause >nul -goto tools_menu - -:learn_new_knowledge -cls -echo 正在学习新的知识库... -echo 请确保已备份重要数据,继续将修改当前知识库。 -echo 继续请按Y,取消请按任意键... -set /p confirm="继续?(Y/N): " -if /i "!confirm!"=="Y" ( - echo 正在学习新的知识库... - python.exe src\plugins\zhishi\knowledge_library.py - echo 学习完成,按任意键返回工具箱菜单... -) else ( - echo 取消学习新的知识库,按任意键返回工具箱菜单... -) -pause >nul -goto tools_menu - -:open_knowledge_folder -cls -echo 正在打开知识库文件夹... -if exist data\raw_info ( - start explorer data\raw_info -) else ( - echo 知识库文件夹不存在! - echo 正在创建文件夹... - mkdir data\raw_info - timeout /t 2 >nul -) -goto tools_menu - - -:update_and_start -cls -:retry_git_pull -git pull > temp.log 2>&1 -findstr /C:"detected dubious ownership" temp.log >nul -if %errorlevel% equ 0 ( - echo 检测到仓库权限问题,正在自动修复... - git config --global --add safe.directory "%cd%" - echo 已添加例外,正在重试git pull... - del temp.log - goto retry_git_pull -) -del temp.log -echo 正在更新依赖... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python -m pip install -r requirements.txt && cls - -echo 当前代理设置: -echo HTTP_PROXY=%HTTP_PROXY% -echo HTTPS_PROXY=%HTTPS_PROXY% - -echo Disable Proxy... -set HTTP_PROXY= -set HTTPS_PROXY= -set no_proxy=0.0.0.0/32 - -REM chcp 65001 -python bot.py -echo. -echo Bot已停止运行,按任意键返回主菜单... -pause >nul -goto menu - -:start_bot -cls -echo 正在更新依赖... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python -m pip install -r requirements.txt && cls - -echo 当前代理设置: -echo HTTP_PROXY=%HTTP_PROXY% -echo HTTPS_PROXY=%HTTPS_PROXY% - -echo Disable Proxy... -set HTTP_PROXY= -set HTTPS_PROXY= -set no_proxy=0.0.0.0/32 - -REM chcp 65001 -python bot.py -echo. -echo Bot已停止运行,按任意键返回主菜单... -pause >nul -goto menu - - -:open_dir -start explorer "%cd%" -goto menu +@echo off +@setlocal enabledelayedexpansion +@chcp 936 + +@REM ð汾 +set "VERSION=1.0" + +title Bot̨ v%VERSION% + +@REM PythonGit +set "_root=%~dp0" +set "_root=%_root:~0,-1%" +cd "%_root%" + + +:search_python +cls +if exist "%_root%\python" ( + set "PYTHON_HOME=%_root%\python" +) else if exist "%_root%\venv" ( + call "%_root%\venv\Scripts\activate.bat" + set "PYTHON_HOME=%_root%\venv\Scripts" +) else ( + echo ԶPython... + + where python >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where python') do ( + echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul + if errorlevel 1 ( + echo ҵPython%%i + set "py_path=%%i" + goto :validate_python + ) + ) + ) + set "search_paths=%ProgramFiles%\Git*;!LocalAppData!\Programs\Python\Python*" + for /d %%d in (!search_paths!) do ( + if exist "%%d\python.exe" ( + set "py_path=%%d\python.exe" + goto :validate_python + ) + ) + echo ûҵPython,Ҫװ? + set /p pyinstall_confirm="(Y/n): " + if /i "!pyinstall_confirm!"=="Y" ( + cls + echo ڰװPython... + winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements + if %errorlevel% neq 0 ( + echo װʧܣֶװPython + start https://www.python.org/downloads/ + exit /b + ) + echo װɣ֤Python... + goto search_python + + ) else ( + echo ȡװPython˳... + pause >nul + exit /b + ) + + echo δҵõPython + exit /b 1 + + :validate_python + "!py_path!" --version >nul 2>&1 + if %errorlevel% neq 0 ( + echo ЧPython%py_path% + exit /b 1 + ) + + :: ȡװĿ¼ + for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" + set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" +) +if not exist "%PYTHON_HOME%\python.exe" ( + echo Python·֤ʧܣ%PYTHON_HOME% + echo Pythonװ·Ƿpython.exeļ + exit /b 1 +) +echo ɹPython·%PYTHON_HOME% + + + +:search_git +cls +if exist "%_root%\tools\git\bin" ( + set "GIT_HOME=%_root%\tools\git\bin" +) else ( + echo ԶGit... + + where git >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where git') do ( + set "git_path=%%i" + goto :validate_git + ) + ) + echo ɨ賣װ·... + set "search_paths=!ProgramFiles!\Git\cmd" + for /f "tokens=*" %%d in ("!search_paths!") do ( + if exist "%%d\git.exe" ( + set "git_path=%%d\git.exe" + goto :validate_git + ) + ) + echo ûҵGitҪװ + set /p confirm="(Y/N): " + if /i "!confirm!"=="Y" ( + cls + echo ڰװ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 "download_path=%TEMP%\Git-Installer.exe" + + echo Gitװ... + curl -L -o "!download_path!" "!custom_url!" + + if exist "!download_path!" ( + echo سɹʼװGit... + start /wait "" "!download_path!" /SILENT /NORESTART + ) else ( + echo ʧܣֶװGit + start https://git-scm.com/download/win + exit /b + ) + + del "!download_path!" + echo ʱļ + + echo װɣ֤Git... + where git >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where git') do ( + set "git_path=%%i" + goto :validate_git + ) + goto :search_git + + ) else ( + echo װɣδҵGitֶװGit + start https://git-scm.com/download/win + exit /b + ) + + ) else ( + echo ȡװGit˳... + pause >nul + exit /b + ) + + echo δҵõGit + exit /b 1 + + :validate_git + "%git_path%" --version >nul 2>&1 + if %errorlevel% neq 0 ( + echo ЧGit%git_path% + exit /b 1 + ) + + :: ȡװĿ¼ + for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" + set "GIT_HOME=%GIT_HOME:~0,-1%" +) + +:search_mongodb +cls +sc query | findstr /i "MongoDB" >nul +if !errorlevel! neq 0 ( + echo MongoDBδУǷз + set /p confirm="Ƿ(Y/N): " + if /i "!confirm!"=="Y" ( + echo ڳMongoDB... + powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" + echo ڵȴMongoDB... + echo ȴ... + timeout /t 30 >nul + sc query | findstr /i "MongoDB" >nul + if !errorlevel! neq 0 ( + echo MongoDBʧܣûаװҪװ + set /p install_confirm="װ(Y/N): " + if /i "!install_confirm!"=="Y" ( + echo ڰװMongoDB... + winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements + echo װɣMongoDB... + net start MongoDB + if !errorlevel! neq 0 ( + echo MongoDBʧܣֶ + exit /b + ) else ( + echo MongoDBѳɹ + ) + ) else ( + echo ȡװMongoDB˳... + pause >nul + exit /b + ) + ) + ) else ( + echo 棺MongoDBδУMaiMBot޷ݿ⣡ + ) +) else ( + echo MongoDB +) + +@REM set "GIT_HOME=%_root%\tools\git\bin" +set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" + +:install_maim +if not exist "!_root!\bot.py" ( + cls + echo ƺûаװBotҪװڵǰĿ¼ + set /p confirm="(Y/N): " + if /i "!confirm!"=="Y" ( + echo ҪʹGit + set /p proxy_confirm="(Y/N): " + if /i "!proxy_confirm!"=="Y" ( + echo ڰװBot... + git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot + ) else ( + echo ڰװBot... + git clone https://github.com/SengokuCola/MaiMBot + ) + xcopy /E /H /I MaiMBot . >nul 2>&1 + rmdir /s /q MaiMBot + git checkout main-fix + + echo װɣڰװ... + python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple + python -m pip install virtualenv + python -m virtualenv venv + call venv\Scripts\activate.bat + python -m pip install -r requirements.txt + + echo װɣҪ༭ļ + set /p edit_confirm="(Y/N): " + if /i "!edit_confirm!"=="Y" ( + goto config_menu + ) else ( + echo ȡ༭ļ˵... + ) + ) +) + + +@REM gitȡǰ֧ڱ +for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( + set "BRANCH=%%b" +) + +@REM ݲַ֧֧ͬʹòͬɫ +echo ֧: %BRANCH% +if "!BRANCH!"=="main" ( + set "BRANCH_COLOR=" +) else if "!BRANCH!"=="main-fix" ( + set "BRANCH_COLOR=" +@REM ) else if "%BRANCH%"=="stable-dev" ( +@REM set "BRANCH_COLOR=" +) else ( + set "BRANCH_COLOR=" +) + +@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" + +:check_is_venv +echo ڼ⻷״̬... +if exist "%_root%\config\no_venv" ( + echo ⵽no_venv,⻷ + goto menu +) + +set "ENV_STATUS=δ" +set "ENV_TYPE=ϵͳ" + +:: +if defined VIRTUAL_ENV ( + goto menu +) + +echo ===================================== +echo ⻷⾯棺 +echo ǰʹϵͳPython·!PYTHON_HOME! +echo δ⵽⻷ + +:env_interaction +echo ===================================== +echo ѡ +echo 1 - Venv⻷ +echo 2 - /Conda⻷ +echo 3 - ʱμ +echo 4 - ⻷ +choice /c 1234 /n /m "ѡ(1-4): " + +if errorlevel 4 ( + echo Ҫ⻷ + set /p no_venv_confirm="(Y/N): ....." + if /i "!no_venv_confirm!"=="Y" ( + echo 1 > "%_root%\config\no_venv" + echo Ѵno_venvļ + pause >nul + goto menu + ) else ( + echo ȡ⻷飬... + goto env_interaction + ) +) + +if errorlevel 3 ( + echo 棺ʹϵͳܵͻ + timeout /t 2 >nul + goto menu +) + +if errorlevel 2 goto handle_conda +if errorlevel 1 goto handle_venv + +:handle_venv +echo ڳʼVenv... +echo ⻷venv + python -m virtualenv venv || ( + echo ʧܣ룺!errorlevel! + pause + goto env_interaction +) + +call venv\Scripts\activate.bat +echo ѼVenv +goto install_dependencies + +:handle_conda +where conda >nul 2>&1 || ( + echo δ⵽condaǷװMiniconda + choice /c YN /n /m "ѡ(Y/N): " + if errorlevel 2 goto env_interaction + echo ڰװMiniconda... + winget install --id Anaconda.Miniconda3 -e || ( + echo װʧܣ룺!errorlevel! + pause + goto env_interaction + ) + if exist "%UserProfile%\Miniconda3\Scripts\conda.exe" ( + call "%UserProfile%\Miniconda3\Scripts\conda.exe" init cmd.exe + echo װɺű + timeout /t 10 >nul + exit /b + ) +) + +:conda_menu +echo ѡConda +echo 1 - » +echo 2 - л +echo 3 - ϼ˵ +choice /c 123 /n /m "ѡ(1-3): " + +if errorlevel 3 goto env_interaction +if errorlevel 2 goto activate_conda +if errorlevel 1 goto create_conda + +:create_conda +set /p "CONDA_ENV=»ƣ" +if "!CONDA_ENV!"=="" ( + echo ƲΪգ + goto create_conda +) +conda create -n !CONDA_ENV! python=3.13 -y || ( + echo ʧܣ룺!errorlevel! + pause + goto conda_menu +) +goto activate_conda + +:activate_conda +set /p "CONDA_ENV=ҪĻƣ" +conda activate !CONDA_ENV! || ( + echo ʧܣԭ + echo 1. + echo 2. conda쳣 + pause + goto conda_menu +) +echo ɹconda!CONDA_ENV! + +:install_dependencies +echo ǷҪװĿ +choice /c YN /n /m "ѡ(Y/N): " +if errorlevel 2 goto menu +echo ڰװ... +python -m pip install -r "%_root%\requirements.txt" || ( + echo װʧܣ룺!errorlevel! + pause +) +goto menu + +:menu +@chcp 936 +cls +echo Bot̨ v%VERSION% ǰ֧: %BRANCH_COLOR%%BRANCH% +echo ǰPython: !PYTHON_HOME! +echo ====================== +echo 1. ²Bot (Ĭ) +echo 2. ֱBot +echo 3. ý +echo 4. 湤 +echo 5. ˳ +echo ====================== + +set /p choice="ѡ (1-5)»سѡ: " + +if "!choice!"=="" set choice=1 + +if "!choice!"=="1" goto update_and_start +if "!choice!"=="2" goto start_bot +if "!choice!"=="3" goto config_menu +if "!choice!"=="4" goto tools_menu +if "!choice!"=="5" exit /b + +echo Ч룬1-5֮ +timeout /t 2 >nul +goto menu + +:config_menu +@chcp 936 +cls +if not exist config/bot_config.toml ( + copy /Y "template\bot_config_template.toml" "config\bot_config.toml" + +) +if not exist .env.prod ( + copy /Y "template.env" ".env.prod" +) + +start python webui.py + +goto menu + + +:tools_menu +@chcp 936 +cls +echo ʱй ǰ֧: %BRANCH_COLOR%%BRANCH% +echo ====================== +echo 1. +echo 2. л֧ +echo 3. õǰ֧ +echo 4. ļ +echo 5. ѧϰµ֪ʶ +echo 6. ֪ʶļ +echo 7. ˵ +echo ====================== + +set /p choice="ѡ: " +if "!choice!"=="1" goto update_dependencies +if "!choice!"=="2" goto switch_branch +if "!choice!"=="3" goto reset_branch +if "!choice!"=="4" goto update_config +if "!choice!"=="5" goto learn_new_knowledge +if "!choice!"=="6" goto open_knowledge_folder +if "!choice!"=="7" goto menu + +echo Ч룬1-6֮ +timeout /t 2 >nul +goto tools_menu + +:update_dependencies +cls +echo ڸ... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python.exe -m pip install -r requirements.txt + +echo ɣع˵... +pause +goto tools_menu + +:switch_branch +cls +echo л֧... +echo ǰ֧: %BRANCH% +@REM echo ÷֧: main, debug, stable-dev +echo 1. лmain +echo 2. лmain-fix +echo Ҫлķ֧: +set /p branch_name="֧: " +if "%branch_name%"=="" set branch_name=main +if "%branch_name%"=="main" ( + set "BRANCH_COLOR=" +) else if "%branch_name%"=="main-fix" ( + set "BRANCH_COLOR=" +@REM ) else if "%branch_name%"=="stable-dev" ( +@REM set "BRANCH_COLOR=" +) else if "%branch_name%"=="1" ( + set "BRANCH_COLOR=" + set "branch_name=main" +) else if "%branch_name%"=="2" ( + set "BRANCH_COLOR=" + set "branch_name=main-fix" +) else ( + echo Чķ֧, + timeout /t 2 >nul + goto switch_branch +) + +echo л֧ %branch_name%... +git checkout %branch_name% +echo ֧лɣǰ֧: %BRANCH_COLOR%%branch_name% +set "BRANCH=%branch_name%" +echo ع˵... +pause >nul +goto tools_menu + + +:reset_branch +cls +echo õǰ֧... +echo ǰ֧: !BRANCH! +echo ȷҪõǰ֧ +set /p confirm="(Y/N): " +if /i "!confirm!"=="Y" ( + echo õǰ֧... + git reset --hard !BRANCH! + echo ֧ɣع˵... +) else ( + echo ȡõǰ֧ع˵... +) +pause >nul +goto tools_menu + + +:update_config +cls +echo ڸļ... +echo ȷѱҪݣ޸ĵǰļ +echo 밴Yȡ밴... +set /p confirm="(Y/N): " +if /i "!confirm!"=="Y" ( + echo ڸļ... + python.exe config\auto_update.py + echo ļɣع˵... +) else ( + echo ȡļع˵... +) +pause >nul +goto tools_menu + +:learn_new_knowledge +cls +echo ѧϰµ֪ʶ... +echo ȷѱҪݣ޸ĵǰ֪ʶ⡣ +echo 밴Yȡ밴... +set /p confirm="(Y/N): " +if /i "!confirm!"=="Y" ( + echo ѧϰµ֪ʶ... + python.exe src\plugins\zhishi\knowledge_library.py + echo ѧϰɣع˵... +) else ( + echo ȡѧϰµ֪ʶ⣬ع˵... +) +pause >nul +goto tools_menu + +:open_knowledge_folder +cls +echo ڴ֪ʶļ... +if exist data\raw_info ( + start explorer data\raw_info +) else ( + echo ֪ʶļвڣ + echo ڴļ... + mkdir data\raw_info + timeout /t 2 >nul +) +goto tools_menu + + +:update_and_start +cls +:retry_git_pull +git pull > temp.log 2>&1 +findstr /C:"detected dubious ownership" temp.log >nul +if %errorlevel% equ 0 ( + echo ⵽ֿȨ⣬Զ޸... + git config --global --add safe.directory "%cd%" + echo ⣬git pull... + del temp.log + goto retry_git_pull +) +del temp.log +echo ڸ... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python -m pip install -r requirements.txt && cls + +echo ǰ: +echo HTTP_PROXY=%HTTP_PROXY% +echo HTTPS_PROXY=%HTTPS_PROXY% + +echo Disable Proxy... +set HTTP_PROXY= +set HTTPS_PROXY= +set no_proxy=0.0.0.0/32 + +REM chcp 65001 +python bot.py +echo. +echo BotֹͣУ˵... +pause >nul +goto menu + +:start_bot +cls +echo ڸ... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python -m pip install -r requirements.txt && cls + +echo ǰ: +echo HTTP_PROXY=%HTTP_PROXY% +echo HTTPS_PROXY=%HTTPS_PROXY% + +echo Disable Proxy... +set HTTP_PROXY= +set HTTPS_PROXY= +set no_proxy=0.0.0.0/32 + +REM chcp 65001 +python bot.py +echo. +echo BotֹͣУ˵... +pause >nul +goto menu + + +:open_dir +start explorer "%cd%" +goto menu From aaa11eb4e54034167dd1663872b4b0f7e21c464b Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Sun, 16 Mar 2025 20:27:52 +0800 Subject: [PATCH 15/28] =?UTF-8?q?fix=EF=BC=9A=E6=B7=BB=E5=8A=A0conda?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=80=89=E9=A1=B9=20=E6=9B=B4=E6=94=B9MongoD?= =?UTF-8?q?B=E5=90=AF=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MaiLauncher.bat | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index adb7a1a7e..0d812713c 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -375,14 +375,16 @@ goto activate_conda :activate_conda set /p "CONDA_ENV=ҪĻƣ" -conda activate !CONDA_ENV! || ( +call conda activate !CONDA_ENV! || ( echo ʧܣԭ echo 1. echo 2. conda쳣 + timeout /t >nul pause goto conda_menu ) echo ɹconda!CONDA_ENV! +timeout /t 2 >nul :install_dependencies echo ǷҪװĿ From b86bfd08b06969582486203a378f295923713422 Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:07:30 +0800 Subject: [PATCH 16/28] =?UTF-8?q?fix=EF=BC=9A=E5=B0=86choice=E6=94=B9?= =?UTF-8?q?=E4=B8=BAset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MaiLauncher.bat | 385 ++++++++++++++++++++++++------------------------ 1 file changed, 196 insertions(+), 189 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index 0d812713c..3e1c6065c 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -2,12 +2,12 @@ @setlocal enabledelayedexpansion @chcp 936 -@REM ð汾 +@REM 设置版本号 set "VERSION=1.0" -title Bot̨ v%VERSION% +title 麦麦Bot控制台 v%VERSION% -@REM PythonGit +@REM 设置Python和Git环境变量 set "_root=%~dp0" set "_root=%_root:~0,-1%" cd "%_root%" @@ -21,14 +21,14 @@ if exist "%_root%\python" ( call "%_root%\venv\Scripts\activate.bat" set "PYTHON_HOME=%_root%\venv\Scripts" ) else ( - echo ԶPython... + echo 正在自动查找Python解释器... where python >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where python') do ( echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul if errorlevel 1 ( - echo ҵPython%%i + echo 找到Python解释器:%%i set "py_path=%%i" goto :validate_python ) @@ -41,46 +41,46 @@ if exist "%_root%\python" ( goto :validate_python ) ) - echo ûҵPython,Ҫװ? - set /p pyinstall_confirm="(Y/n): " + echo 没有找到Python解释器,要安装吗? + set /p pyinstall_confirm="继续?(Y/n): " if /i "!pyinstall_confirm!"=="Y" ( cls - echo ڰװPython... + echo 正在安装Python... winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements if %errorlevel% neq 0 ( - echo װʧܣֶװPython + echo 安装失败,请手动安装Python start https://www.python.org/downloads/ exit /b ) - echo װɣ֤Python... + echo 安装完成,正在验证Python... goto search_python ) else ( - echo ȡװPython˳... + echo 取消安装Python,按任意键退出... pause >nul exit /b ) - echo δҵõPython + echo 错误:未找到可用的Python解释器! exit /b 1 :validate_python "!py_path!" --version >nul 2>&1 if %errorlevel% neq 0 ( - echo ЧPython%py_path% + echo 无效的Python解释器:%py_path% exit /b 1 ) - :: ȡװĿ¼ + :: 提取安装目录 for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" ) if not exist "%PYTHON_HOME%\python.exe" ( - echo Python·֤ʧܣ%PYTHON_HOME% - echo Pythonװ·Ƿpython.exeļ + echo Python路径验证失败:%PYTHON_HOME% + echo 请检查Python安装路径中是否有python.exe文件 exit /b 1 ) -echo ɹPython·%PYTHON_HOME% +echo 成功设置Python路径:%PYTHON_HOME% @@ -89,7 +89,7 @@ cls if exist "%_root%\tools\git\bin" ( set "GIT_HOME=%_root%\tools\git\bin" ) else ( - echo ԶGit... + echo 正在自动查找Git... where git >nul 2>&1 if %errorlevel% equ 0 ( @@ -98,7 +98,7 @@ if exist "%_root%\tools\git\bin" ( goto :validate_git ) ) - echo ɨ賣װ·... + echo 正在扫描常见安装路径... set "search_paths=!ProgramFiles!\Git\cmd" for /f "tokens=*" %%d in ("!search_paths!") do ( if exist "%%d\git.exe" ( @@ -106,31 +106,31 @@ if exist "%_root%\tools\git\bin" ( goto :validate_git ) ) - echo ûҵGitҪװ - set /p confirm="(Y/N): " + echo 没有找到Git,要安装吗? + set /p confirm="继续?(Y/N): " if /i "!confirm!"=="Y" ( cls - echo ڰװGit... + echo 正在安装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 "download_path=%TEMP%\Git-Installer.exe" - echo Gitװ... + echo 正在下载Git安装包... curl -L -o "!download_path!" "!custom_url!" if exist "!download_path!" ( - echo سɹʼװGit... + echo 下载成功,开始安装Git... start /wait "" "!download_path!" /SILENT /NORESTART ) else ( - echo ʧܣֶװGit + echo 下载失败,请手动安装Git start https://git-scm.com/download/win exit /b ) del "!download_path!" - echo ʱļ + echo 临时文件已清理。 - echo װɣ֤Git... + echo 安装完成,正在验证Git... where git >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where git') do ( @@ -140,28 +140,28 @@ if exist "%_root%\tools\git\bin" ( goto :search_git ) else ( - echo װɣδҵGitֶװGit + echo 安装完成,但未找到Git,请手动安装Git start https://git-scm.com/download/win exit /b ) ) else ( - echo ȡװGit˳... + echo 取消安装Git,按任意键退出... pause >nul exit /b ) - echo δҵõGit + echo 错误:未找到可用的Git! exit /b 1 :validate_git "%git_path%" --version >nul 2>&1 if %errorlevel% neq 0 ( - echo ЧGit%git_path% + echo 无效的Git:%git_path% exit /b 1 ) - :: ȡװĿ¼ + :: 提取安装目录 for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" set "GIT_HOME=%GIT_HOME:~0,-1%" ) @@ -170,40 +170,40 @@ if exist "%_root%\tools\git\bin" ( cls sc query | findstr /i "MongoDB" >nul if !errorlevel! neq 0 ( - echo MongoDBδУǷз - set /p confirm="Ƿ(Y/N): " + echo MongoDB服务未运行,是否尝试运行服务? + set /p confirm="是否启动?(Y/N): " if /i "!confirm!"=="Y" ( - echo ڳMongoDB... + echo 正在尝试启动MongoDB服务... powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" - echo ڵȴMongoDB... - echo ȴ... + echo 正在等待MongoDB服务启动... + echo 按下任意键跳过等待... timeout /t 30 >nul sc query | findstr /i "MongoDB" >nul if !errorlevel! neq 0 ( - echo MongoDBʧܣûаװҪװ - set /p install_confirm="װ(Y/N): " + echo MongoDB服务启动失败,可能是没有安装,要安装吗? + set /p install_confirm="继续安装?(Y/N): " if /i "!install_confirm!"=="Y" ( - echo ڰװMongoDB... + echo 正在安装MongoDB... winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements - echo װɣMongoDB... + echo 安装完成,正在启动MongoDB服务... net start MongoDB if !errorlevel! neq 0 ( - echo MongoDBʧܣֶ + echo 启动MongoDB服务失败,请手动启动 exit /b ) else ( - echo MongoDBѳɹ + echo MongoDB服务已成功启动 ) ) else ( - echo ȡװMongoDB˳... + echo 取消安装MongoDB,按任意键退出... pause >nul exit /b ) ) ) else ( - echo 棺MongoDBδУMaiMBot޷ݿ⣡ + call :RED_WARNING "警告:MongoDB服务未运行,将导致应用程序无法访问数据库!" ) ) else ( - echo MongoDB + echo MongoDB服务已运行 ) @REM set "GIT_HOME=%_root%\tools\git\bin" @@ -212,47 +212,47 @@ set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" :install_maim if not exist "!_root!\bot.py" ( cls - echo ƺûаװBotҪװڵǰĿ¼ - set /p confirm="(Y/N): " + echo 你似乎没有安装麦麦Bot,要安装在当前目录吗? + set /p confirm="继续?(Y/N): " if /i "!confirm!"=="Y" ( - echo ҪʹGit - set /p proxy_confirm="(Y/N): " + echo 要使用Git代理下载吗? + set /p proxy_confirm="继续?(Y/N): " if /i "!proxy_confirm!"=="Y" ( - echo ڰװBot... + echo 正在安装麦麦Bot... git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot ) else ( - echo ڰװBot... + echo 正在安装麦麦Bot... git clone https://github.com/SengokuCola/MaiMBot ) xcopy /E /H /I MaiMBot . >nul 2>&1 rmdir /s /q MaiMBot git checkout main-fix - echo װɣڰװ... + echo 安装完成,正在安装依赖... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install virtualenv python -m virtualenv venv call venv\Scripts\activate.bat python -m pip install -r requirements.txt - echo װɣҪ༭ļ - set /p edit_confirm="(Y/N): " + echo 安装完成,要编辑配置文件吗? + set /p edit_confirm="继续?(Y/N): " if /i "!edit_confirm!"=="Y" ( goto config_menu ) else ( - echo ȡ༭ļ˵... + echo 取消编辑配置文件,按任意键返回主菜单... ) ) ) -@REM gitȡǰ֧ڱ +@REM git获取当前分支名并保存在变量里 for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( set "BRANCH=%%b" ) -@REM ݲַ֧֧ͬʹòͬɫ -echo ֧: %BRANCH% +@REM 根据不同分支名给分支名字符串使用不同颜色 +echo 分支名: %BRANCH% if "!BRANCH!"=="main" ( set "BRANCH_COLOR=" ) else if "!BRANCH!"=="main-fix" ( @@ -266,151 +266,158 @@ if "!BRANCH!"=="main" ( @REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" :check_is_venv -echo ڼ⻷״̬... +echo 正在检查虚拟环境状态... if exist "%_root%\config\no_venv" ( - echo ⵽no_venv,⻷ + echo 检测到no_venv,跳过虚拟环境检查 goto menu ) -set "ENV_STATUS=δ" -set "ENV_TYPE=ϵͳ" - -:: +:: 环境检测 if defined VIRTUAL_ENV ( goto menu ) echo ===================================== -echo ⻷⾯棺 -echo ǰʹϵͳPython·!PYTHON_HOME! -echo δ⵽⻷ +echo 虚拟环境检测警告: +echo 当前使用系统Python路径:!PYTHON_HOME! +echo 未检测到激活的虚拟环境! :env_interaction echo ===================================== -echo ѡ -echo 1 - Venv⻷ -echo 2 - /Conda⻷ -echo 3 - ʱμ -echo 4 - ⻷ -choice /c 1234 /n /m "ѡ(1-4): " +echo 请选择操作: +echo 1 - 创建并激活Venv虚拟环境 +echo 2 - 创建/激活Conda虚拟环境 +echo 3 - 临时跳过本次检查 +echo 4 - 永久跳过虚拟环境检查 +set /p choice="请输入选项(1-4): " -if errorlevel 4 ( - echo Ҫ⻷ - set /p no_venv_confirm="(Y/N): ....." +if "!choice!" = "4" ( + echo 要永久跳过虚拟环境检查吗? + set /p no_venv_confirm="继续?(Y/N): ....." if /i "!no_venv_confirm!"=="Y" ( echo 1 > "%_root%\config\no_venv" - echo Ѵno_venvļ + echo 已创建no_venv文件 pause >nul goto menu ) else ( - echo ȡ⻷飬... + echo 取消跳过虚拟环境检查,按任意键返回... + pause >nul goto env_interaction ) ) -if errorlevel 3 ( - echo 棺ʹϵͳܵͻ +if "!choice!" = "3"( + echo 警告:使用系统环境可能导致依赖冲突! timeout /t 2 >nul goto menu ) -if errorlevel 2 goto handle_conda -if errorlevel 1 goto handle_venv +if "!choice!" = "2" goto handle_conda +if "!choice!" = "1" goto handle_venv + +echo 无效的输入,请输入1-4之间的数字 +timeout /t 2 >nul +goto env_interaction :handle_venv -echo ڳʼVenv... -echo ⻷venv +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +echo 正在初始化Venv环境... +python -m pip install virtualenv || ( + echo 安装环境失败,错误码:!errorlevel! + pause + goto env_interaction +) +echo 创建虚拟环境到:venv python -m virtualenv venv || ( - echo ʧܣ룺!errorlevel! + echo 环境创建失败,错误码:!errorlevel! pause goto env_interaction ) call venv\Scripts\activate.bat -echo ѼVenv -goto install_dependencies +echo 已激活Venv环境 +echo 要安装依赖吗? +set /p install_confirm="继续?(Y/N): " +if /i "!install_confirm!"=="Y" ( + goto update_dependencies +) +goto menu :handle_conda where conda >nul 2>&1 || ( - echo δ⵽condaǷװMiniconda - choice /c YN /n /m "ѡ(Y/N): " - if errorlevel 2 goto env_interaction - echo ڰװMiniconda... + echo 未检测到conda,是否安装Miniconda? + set /p conda_confirm="安装?(Y/N): " + if /i "!conda_confirm!"=="N" ( + goto env_interaction + ) + + echo 正在安装Miniconda... winget install --id Anaconda.Miniconda3 -e || ( - echo װʧܣ룺!errorlevel! + echo 安装失败,错误码:!errorlevel! pause goto env_interaction ) if exist "%UserProfile%\Miniconda3\Scripts\conda.exe" ( call "%UserProfile%\Miniconda3\Scripts\conda.exe" init cmd.exe - echo װɺű + echo 安装完成后请重启脚本 timeout /t 10 >nul exit /b ) ) :conda_menu -echo ѡConda -echo 1 - » -echo 2 - л -echo 3 - ϼ˵ -choice /c 123 /n /m "ѡ(1-3): " +echo 请选择Conda操作: +echo 1 - 创建新环境 +echo 2 - 激活已有环境 +echo 3 - 返回上级菜单 +set /p choice="请输入选项(1-3): " -if errorlevel 3 goto env_interaction -if errorlevel 2 goto activate_conda -if errorlevel 1 goto create_conda +if "!choice!"=="3" goto env_interaction +if "!choice!"=="2" goto activate_conda +if "!choice!"=="1" goto create_conda :create_conda -set /p "CONDA_ENV=»ƣ" +set /p "CONDA_ENV=请输入新环境名称:" if "!CONDA_ENV!"=="" ( - echo ƲΪգ + echo 环境名称不能为空! goto create_conda ) conda create -n !CONDA_ENV! python=3.13 -y || ( - echo ʧܣ룺!errorlevel! + echo 环境创建失败,错误码:!errorlevel! pause goto conda_menu ) goto activate_conda :activate_conda -set /p "CONDA_ENV=ҪĻƣ" -call conda activate !CONDA_ENV! || ( - echo ʧܣԭ - echo 1. - echo 2. conda쳣 - timeout /t >nul +set /p "CONDA_ENV=请输入要激活的环境名称:" +conda activate !CONDA_ENV! || ( + echo 激活失败,可能原因: + echo 1. 环境不存在 + echo 2. conda配置异常 pause goto conda_menu ) -echo ɹconda!CONDA_ENV! -timeout /t 2 >nul - -:install_dependencies -echo ǷҪװĿ -choice /c YN /n /m "ѡ(Y/N): " -if errorlevel 2 goto menu -echo ڰװ... -python -m pip install -r "%_root%\requirements.txt" || ( - echo װʧܣ룺!errorlevel! - pause +echo 成功激活conda环境:!CONDA_ENV! +echo 要安装依赖吗? +set /p install_confirm="继续?(Y/N): " +if /i "!install_confirm!"=="Y" ( + goto update_dependencies ) -goto menu - :menu @chcp 936 cls -echo Bot̨ v%VERSION% ǰ֧: %BRANCH_COLOR%%BRANCH% -echo ǰPython: !PYTHON_HOME! +echo 麦麦Bot控制台 v%VERSION% 当前分支: %BRANCH_COLOR%%BRANCH% +echo 当前Python环境: !PYTHON_HOME! echo ====================== -echo 1. ²Bot (Ĭ) -echo 2. ֱBot -echo 3. ý -echo 4. 湤 -echo 5. ˳ +echo 1. 更新并启动麦麦Bot (默认) +echo 2. 直接启动麦麦Bot +echo 3. 启动麦麦配置界面 +echo 4. 打开麦麦神奇工具箱 +echo 5. 退出 echo ====================== -set /p choice="ѡ (1-5)»سѡ: " +set /p choice="请输入选项数字 (1-5)并按下回车以选择: " if "!choice!"=="" set choice=1 @@ -420,7 +427,7 @@ if "!choice!"=="3" goto config_menu if "!choice!"=="4" goto tools_menu if "!choice!"=="5" exit /b -echo Ч룬1-5֮ +echo 无效的输入,请输入1-5之间的数字 timeout /t 2 >nul goto menu @@ -432,7 +439,7 @@ if not exist config/bot_config.toml ( ) if not exist .env.prod ( - copy /Y "template.env" ".env.prod" + copy /Y "template\.env.prod" ".env.prod" ) start python webui.py @@ -443,18 +450,18 @@ goto menu :tools_menu @chcp 936 cls -echo ʱй ǰ֧: %BRANCH_COLOR%%BRANCH% +echo 麦麦时尚工具箱 当前分支: %BRANCH_COLOR%%BRANCH% echo ====================== -echo 1. -echo 2. л֧ -echo 3. õǰ֧ -echo 4. ļ -echo 5. ѧϰµ֪ʶ -echo 6. ֪ʶļ -echo 7. ˵ +echo 1. 更新依赖 +echo 2. 切换分支 +echo 3. 重置当前分支 +echo 4. 更新配置文件 +echo 5. 学习新的知识库 +echo 6. 打开知识库文件夹 +echo 7. 返回主菜单 echo ====================== -set /p choice="ѡ: " +set /p choice="请输入选项数字: " if "!choice!"=="1" goto update_dependencies if "!choice!"=="2" goto switch_branch if "!choice!"=="3" goto reset_branch @@ -463,29 +470,29 @@ if "!choice!"=="5" goto learn_new_knowledge if "!choice!"=="6" goto open_knowledge_folder if "!choice!"=="7" goto menu -echo Ч룬1-6֮ +echo 无效的输入,请输入1-6之间的数字 timeout /t 2 >nul goto tools_menu :update_dependencies cls -echo ڸ... +echo 正在更新依赖... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python.exe -m pip install -r requirements.txt -echo ɣع˵... +echo 依赖更新完成,按任意键返回工具箱菜单... pause goto tools_menu :switch_branch cls -echo л֧... -echo ǰ֧: %BRANCH% -@REM echo ÷֧: main, debug, stable-dev -echo 1. лmain -echo 2. лmain-fix -echo Ҫлķ֧: -set /p branch_name="֧: " +echo 正在切换分支... +echo 当前分支: %BRANCH% +@REM echo 可用分支: main, debug, stable-dev +echo 1. 切换到main +echo 2. 切换到main-fix +echo 请输入要切换到的分支: +set /p branch_name="分支名: " if "%branch_name%"=="" set branch_name=main if "%branch_name%"=="main" ( set "BRANCH_COLOR=" @@ -500,32 +507,32 @@ if "%branch_name%"=="main" ( set "BRANCH_COLOR=" set "branch_name=main-fix" ) else ( - echo Чķ֧, + echo 无效的分支名, 请重新输入 timeout /t 2 >nul goto switch_branch ) -echo л֧ %branch_name%... +echo 正在切换到分支 %branch_name%... git checkout %branch_name% -echo ֧лɣǰ֧: %BRANCH_COLOR%%branch_name% +echo 分支切换完成,当前分支: %BRANCH_COLOR%%branch_name% set "BRANCH=%branch_name%" -echo ع˵... +echo 按任意键返回工具箱菜单... pause >nul goto tools_menu :reset_branch cls -echo õǰ֧... -echo ǰ֧: !BRANCH! -echo ȷҪõǰ֧ -set /p confirm="(Y/N): " +echo 正在重置当前分支... +echo 当前分支: !BRANCH! +echo 确认要重置当前分支吗? +set /p confirm="继续?(Y/N): " if /i "!confirm!"=="Y" ( - echo õǰ֧... + echo 正在重置当前分支... git reset --hard !BRANCH! - echo ֧ɣع˵... + echo 分支重置完成,按任意键返回工具箱菜单... ) else ( - echo ȡõǰ֧ع˵... + echo 取消重置当前分支,按任意键返回工具箱菜单... ) pause >nul goto tools_menu @@ -533,44 +540,44 @@ goto tools_menu :update_config cls -echo ڸļ... -echo ȷѱҪݣ޸ĵǰļ -echo 밴Yȡ밴... -set /p confirm="(Y/N): " +echo 正在更新配置文件... +echo 请确保已备份重要数据,继续将修改当前配置文件。 +echo 继续请按Y,取消请按任意键... +set /p confirm="继续?(Y/N): " if /i "!confirm!"=="Y" ( - echo ڸļ... + echo 正在更新配置文件... python.exe config\auto_update.py - echo ļɣع˵... + echo 配置文件更新完成,按任意键返回工具箱菜单... ) else ( - echo ȡļع˵... + echo 取消更新配置文件,按任意键返回工具箱菜单... ) pause >nul goto tools_menu :learn_new_knowledge cls -echo ѧϰµ֪ʶ... -echo ȷѱҪݣ޸ĵǰ֪ʶ⡣ -echo 밴Yȡ밴... -set /p confirm="(Y/N): " +echo 正在学习新的知识库... +echo 请确保已备份重要数据,继续将修改当前知识库。 +echo 继续请按Y,取消请按任意键... +set /p confirm="继续?(Y/N): " if /i "!confirm!"=="Y" ( - echo ѧϰµ֪ʶ... + echo 正在学习新的知识库... python.exe src\plugins\zhishi\knowledge_library.py - echo ѧϰɣع˵... + echo 学习完成,按任意键返回工具箱菜单... ) else ( - echo ȡѧϰµ֪ʶ⣬ع˵... + echo 取消学习新的知识库,按任意键返回工具箱菜单... ) pause >nul goto tools_menu :open_knowledge_folder cls -echo ڴ֪ʶļ... +echo 正在打开知识库文件夹... if exist data\raw_info ( start explorer data\raw_info ) else ( - echo ֪ʶļвڣ - echo ڴļ... + echo 知识库文件夹不存在! + echo 正在创建文件夹... mkdir data\raw_info timeout /t 2 >nul ) @@ -583,18 +590,18 @@ cls git pull > temp.log 2>&1 findstr /C:"detected dubious ownership" temp.log >nul if %errorlevel% equ 0 ( - echo ⵽ֿȨ⣬Զ޸... + echo 检测到仓库权限问题,正在自动修复... git config --global --add safe.directory "%cd%" - echo ⣬git pull... + echo 已添加例外,正在重试git pull... del temp.log goto retry_git_pull ) del temp.log -echo ڸ... +echo 正在更新依赖... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install -r requirements.txt && cls -echo ǰ: +echo 当前代理设置: echo HTTP_PROXY=%HTTP_PROXY% echo HTTPS_PROXY=%HTTPS_PROXY% @@ -606,17 +613,17 @@ set no_proxy=0.0.0.0/32 REM chcp 65001 python bot.py echo. -echo BotֹͣУ˵... +echo Bot已停止运行,按任意键返回主菜单... pause >nul goto menu :start_bot cls -echo ڸ... +echo 正在更新依赖... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install -r requirements.txt && cls -echo ǰ: +echo 当前代理设置: echo HTTP_PROXY=%HTTP_PROXY% echo HTTPS_PROXY=%HTTPS_PROXY% @@ -628,7 +635,7 @@ set no_proxy=0.0.0.0/32 REM chcp 65001 python bot.py echo. -echo BotֹͣУ˵... +echo Bot已停止运行,按任意键返回主菜单... pause >nul goto menu From ab3246460960f01d670598251d570ff8982539ae Mon Sep 17 00:00:00 2001 From: ChensenCHX <2087826155@qq.com> Date: Mon, 17 Mar 2025 16:27:45 +0800 Subject: [PATCH 17/28] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=94=A8=E4=BA=8E=E6=89=8B=E5=8A=A8=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=AE=B0=E5=BF=86=E5=BA=93=E7=9A=84=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memory_system/manually_alter_memory.py | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 src/plugins/memory_system/manually_alter_memory.py diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/plugins/memory_system/manually_alter_memory.py new file mode 100644 index 000000000..98999e4f8 --- /dev/null +++ b/src/plugins/memory_system/manually_alter_memory.py @@ -0,0 +1,223 @@ +# -*- 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"[orange]请输入“{concept}”以删除节点 其他输入将被视为取消操作[/orange]\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("[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 + + 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): + #todo... + #需要允许修改memory_items, last_modified + return +# 修改边信息 +def alter_mem_edge(hippocampus: Hippocampus): + #todo... + #需要允许修改strength, last_modified + return + +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: + query = int(input("请输入操作类型\n0 -> 查询节点; 1 -> 增加节点; 2 -> 移除节点; 3 -> 增加边; 4 -> 移除边;\n其他任意输入 -> 退出\n")) + + 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: + continue + elif query == 6: + continue + else: + print("已结束操作") + break + + hippocampus.sync_memory_to_db() + + + +if __name__ == "__main__": + import asyncio + asyncio.run(main()) From 703ba34da9c45abc209768a99d2dff92280f0469 Mon Sep 17 00:00:00 2001 From: Cookie987 Date: Mon, 17 Mar 2025 17:05:26 +0800 Subject: [PATCH 18/28] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E5=90=8E=E7=AE=A1=E7=90=86=E5=92=8CWebUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.sh | 560 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 348 insertions(+), 212 deletions(-) diff --git a/run.sh b/run.sh index c96293c10..bd904d93c 100644 --- a/run.sh +++ b/run.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Maimbot 一键安装脚本 by Cookie_987 +# 麦麦Bot一键安装脚本 by Cookie_987 # 适用于Debian12 # 请小心使用任何一键脚本! @@ -21,257 +21,352 @@ REQUIRED_PACKAGES=("git" "sudo" "python3" "python3-venv" "curl" "gnupg" "python3 DEFAULT_INSTALL_DIR="/opt/maimbot" # 服务名称 -SERVICE_NAME="maimbot" +SERVICE_NAME="maimbot-daemon" +SERVICE_NAME_WEB="maimbot-web" IS_INSTALL_MONGODB=false IS_INSTALL_NAPCAT=false +IS_INSTALL_DEPENDENCIES=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 +INSTALLER_VERSION="0.0.1" -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) +# 检查是否已安装 +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 - 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 + INSTALL_DIR="$DEFAULT_INSTALL_DIR" 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) +# 显示管理菜单 +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) - if [[ -z "$INSTALL_DIR" ]]; then - whiptail --title "⚠️ 取消输入" --yesno "未输入安装路径,是否退出安装?" 10 60 - if [[ $? -ne 0 ]]; then - INSTALL_DIR="$DEFAULT_INSTALL_DIR" - else - exit 1 - fi + [[ $? -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 } -# 显示确认界面 -confirm_install() { - local confirm_message="请确认以下更改:\n\n" - - if [[ ${#missing_packages[@]} -gt 0 ]]; then - confirm_message+="📦 安装缺失的依赖项: ${missing_packages[*]}\n" - else - confirm_message+="✅ 所有依赖项已安装\n" +# ----------- 主安装流程 ----------- +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 - 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 + # 协议确认 + 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 -} -check_mongodb() { - if command -v mongod &>/dev/null; then - MONGO_INSTALLED=true - else - MONGO_INSTALLED=false - 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 -# 安装 MongoDB -install_mongodb() { - if [[ "$MONGO_INSTALLED" == "true" ]]; then - return 0 - fi + # 系统检查 + check_system() { + if [[ "$(id -u)" -ne 0 ]]; then + whiptail --title "🚫 权限不足" --msgbox "请使用 root 用户运行此脚本!\n执行方式: sudo bash $0" 10 60 + exit 1 + fi - whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装MongoDB,是否安装?\n如果您想使用远程数据库,请跳过此步。" 10 60 - if [[ $? -ne 0 ]]; then - return 1 - fi - IS_INSTALL_MONGODB=true -} + 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 -check_napcat() { - if command -v napcat &>/dev/null; then - NAPCAT_INSTALLED=true - else - NAPCAT_INSTALLED=false - fi -} + # 检查MongoDB + check_mongodb() { + if command -v mongod &>/dev/null; then + MONGO_INSTALLED=true + else + MONGO_INSTALLED=false + fi + } + check_mongodb -install_napcat() { - if [[ "$NAPCAT_INSTALLED" == "true" ]]; then - return 0 - fi + # 检查NapCat + check_napcat() { + if command -v napcat &>/dev/null; then + NAPCAT_INSTALLED=true + else + NAPCAT_INSTALLED=false + fi + } + check_napcat - whiptail --title "📦 [3/6] 软件包检查" --yesno "检测到未安装NapCat,是否安装?\n如果您想使用远程NapCat,请跳过此步。" 10 60 - if [[ $? -ne 0 ]]; then - return 1 - fi - IS_INSTALL_NAPCAT=true -} + # 安装必要软件包 + install_packages() { + missing_packages=() + for package in "${REQUIRED_PACKAGES[@]}"; do + if ! dpkg -s "$package" &>/dev/null; then + missing_packages+=("$package") + fi + done -# 运行安装步骤 -if (whiptail --title "ℹ️ [1/6] 使用协议" --yes-button "我同意" --no-button "我拒绝" --yesno "使用MaiMBot及此脚本前请先阅读ELUA协议\nhttps://github.com/SengokuCola/MaiMBot/blob/main/EULA.md\n\n您是否同意此协议?" 10 70) then - whiptail --title "[2/6] 欢迎使用麦麦Bot一键安装脚本 by Cookie987" --msgbox "项目处于活跃开发阶段,代码可能随时更改\n文档未完善,有问题可以提交 Issue 或者 Discussion\nQQ机器人存在被限制风险,请自行了解,谨慎使用\n由于持续迭代,可能存在一些已知或未知的bug\n由于开发中,可能消耗较多token\n\n本脚本可能更新不及时,如遇到bug请优先尝试手动部署以确定是否为脚本问题" 14 60 -else - exit 5 -fi + 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 -check_system -check_mongodb -check_napcat -install_packages -install_mongodb -install_napcat -check_python -choose_branch -choose_install_dir -confirm_install + # 安装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 -# 开始安装 -whiptail --title "🚀 开始安装" --msgbox "所有环境检查完毕,即将开始安装麦麦Bot!" 10 60 + # 安装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 -echo -e "${GREEN}安装依赖项...${RESET}" + # 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 -apt update && apt install -y "${missing_packages[@]}" + # 选择分支 + 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 -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 + # 确认安装 + 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变量。" - systemctl enable mongod - systemctl start mongod -fi + whiptail --title "🔧 安装确认" --yesno "$confirm_msg" 16 60 || exit 1 + } + confirm_install -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}安装依赖...${RESET}" + [[ $IS_INSTALL_DEPENDENCIES == true ]] && apt update && apt install -y "${missing_packages[@]}" -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}" + mkdir -p "$INSTALL_DIR" + cd "$INSTALL_DIR" || exit 1 -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}" + python3 -m venv venv + source venv/bin/activate -echo -e "${GREEN}安装 Python 依赖...${RESET}" -pip install -r requirements.txt + echo -e "${GREEN}克隆仓库...${RESET}" + git clone -b "$BRANCH" "$GITHUB_REPO" repo || { + echo -e "${RED}克隆仓库失败!${RESET}" + exit 1 + } -echo -e "${GREEN}同意协议...${RESET}" -touch elua.confirmed + echo -e "${GREEN}安装Python依赖...${RESET}" + pip install -r repo/requirements.txt -echo -e "${GREEN}设置服务...${RESET}" + echo -e "${GREEN}同意协议...${RESET}" + touch repo/elua.confirmed -# 设置 Maimbot 服务 -cat < /etc/systemd/system/${SERVICE_NAME}.service < /etc/systemd/system/${SERVICE_NAME_WEB}.service < /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 \ No newline at end of file From 76e9410467817bba7ff6b9bb5972f1cff846a66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Mon, 17 Mar 2025 18:24:42 +0900 Subject: [PATCH 19/28] Rename run.sh to run_debian12.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 脚本只支持debian12 --- run.sh => run_debian12.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename run.sh => run_debian12.sh (99%) diff --git a/run.sh b/run_debian12.sh similarity index 99% rename from run.sh rename to run_debian12.sh index bd904d93c..5a51a1a39 100644 --- a/run.sh +++ b/run_debian12.sh @@ -419,4 +419,4 @@ else systemctl start ${SERVICE_NAME} whiptail --msgbox "✅ 服务已启动!\n使用 systemctl status ${SERVICE_NAME} 查看状态" 10 60 fi -fi \ No newline at end of file +fi From 57197db76a39838fb18291f255e663dffe40e846 Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Mon, 17 Mar 2025 17:30:08 +0800 Subject: [PATCH 20/28] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9conda?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=20=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88?= =?UTF-8?q?=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MaiLauncher.bat | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index 3e1c6065c..7d33946b3 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -200,7 +200,7 @@ if !errorlevel! neq 0 ( ) ) ) else ( - call :RED_WARNING "警告:MongoDB服务未运行,将导致应用程序无法访问数据库!" + echo "警告:MongoDB服务未运行,将导致MaiMBot无法访问数据库!" ) ) else ( echo MongoDB服务已运行 @@ -345,24 +345,11 @@ goto menu :handle_conda where conda >nul 2>&1 || ( - echo 未检测到conda,是否安装Miniconda? - set /p conda_confirm="安装?(Y/N): " - if /i "!conda_confirm!"=="N" ( - goto env_interaction - ) - - echo 正在安装Miniconda... - winget install --id Anaconda.Miniconda3 -e || ( - echo 安装失败,错误码:!errorlevel! - pause - goto env_interaction - ) - if exist "%UserProfile%\Miniconda3\Scripts\conda.exe" ( - call "%UserProfile%\Miniconda3\Scripts\conda.exe" init cmd.exe - echo 安装完成后请重启脚本 - timeout /t 10 >nul - exit /b - ) + echo 未检测到conda,可能原因: + echo 1. 未安装Miniconda + echo 2. conda配置异常 + timeout /t 10 >nul + goto env_interaction ) :conda_menu From 1c95606030187a77e4aa172115237fc087dd0a52 Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:54:01 +0800 Subject: [PATCH 21/28] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E6=A3=80=E6=B5=8B=E8=8F=9C=E5=8D=95=E9=97=AA=E9=80=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一个空格引发的惨案 --- MaiLauncher.bat | 343 ++++++++++++++++++++++++------------------------ 1 file changed, 173 insertions(+), 170 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index 7d33946b3..5b76a4312 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -2,12 +2,12 @@ @setlocal enabledelayedexpansion @chcp 936 -@REM 设置版本号 +@REM ð汾 set "VERSION=1.0" -title 麦麦Bot控制台 v%VERSION% +title Bot̨ v%VERSION% -@REM 设置Python和Git环境变量 +@REM PythonGit set "_root=%~dp0" set "_root=%_root:~0,-1%" cd "%_root%" @@ -21,14 +21,14 @@ if exist "%_root%\python" ( call "%_root%\venv\Scripts\activate.bat" set "PYTHON_HOME=%_root%\venv\Scripts" ) else ( - echo 正在自动查找Python解释器... + echo ԶPython... where python >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where python') do ( echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul if errorlevel 1 ( - echo 找到Python解释器:%%i + echo ҵPython%%i set "py_path=%%i" goto :validate_python ) @@ -41,46 +41,46 @@ if exist "%_root%\python" ( goto :validate_python ) ) - echo 没有找到Python解释器,要安装吗? - set /p pyinstall_confirm="继续?(Y/n): " + echo ûҵPython,Ҫװ? + set /p pyinstall_confirm="(Y/n): " if /i "!pyinstall_confirm!"=="Y" ( cls - echo 正在安装Python... + echo ڰװPython... winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements if %errorlevel% neq 0 ( - echo 安装失败,请手动安装Python + echo װʧܣֶװPython start https://www.python.org/downloads/ exit /b ) - echo 安装完成,正在验证Python... + echo װɣ֤Python... goto search_python ) else ( - echo 取消安装Python,按任意键退出... + echo ȡװPython˳... pause >nul exit /b ) - echo 错误:未找到可用的Python解释器! + echo δҵõPython exit /b 1 :validate_python "!py_path!" --version >nul 2>&1 if %errorlevel% neq 0 ( - echo 无效的Python解释器:%py_path% + echo ЧPython%py_path% exit /b 1 ) - :: 提取安装目录 + :: ȡװĿ¼ for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" ) if not exist "%PYTHON_HOME%\python.exe" ( - echo Python路径验证失败:%PYTHON_HOME% - echo 请检查Python安装路径中是否有python.exe文件 + echo Python·֤ʧܣ%PYTHON_HOME% + echo Pythonװ·Ƿpython.exeļ exit /b 1 ) -echo 成功设置Python路径:%PYTHON_HOME% +echo ɹPython·%PYTHON_HOME% @@ -89,7 +89,7 @@ cls if exist "%_root%\tools\git\bin" ( set "GIT_HOME=%_root%\tools\git\bin" ) else ( - echo 正在自动查找Git... + echo ԶGit... where git >nul 2>&1 if %errorlevel% equ 0 ( @@ -98,7 +98,7 @@ if exist "%_root%\tools\git\bin" ( goto :validate_git ) ) - echo 正在扫描常见安装路径... + echo ɨ賣װ·... set "search_paths=!ProgramFiles!\Git\cmd" for /f "tokens=*" %%d in ("!search_paths!") do ( if exist "%%d\git.exe" ( @@ -106,31 +106,31 @@ if exist "%_root%\tools\git\bin" ( goto :validate_git ) ) - echo 没有找到Git,要安装吗? - set /p confirm="继续?(Y/N): " + echo ûҵGitҪװ + set /p confirm="(Y/N): " if /i "!confirm!"=="Y" ( cls - echo 正在安装Git... + echo ڰװ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 "download_path=%TEMP%\Git-Installer.exe" - echo 正在下载Git安装包... + echo Gitװ... curl -L -o "!download_path!" "!custom_url!" if exist "!download_path!" ( - echo 下载成功,开始安装Git... + echo سɹʼװGit... start /wait "" "!download_path!" /SILENT /NORESTART ) else ( - echo 下载失败,请手动安装Git + echo ʧܣֶװGit start https://git-scm.com/download/win exit /b ) del "!download_path!" - echo 临时文件已清理。 + echo ʱļ - echo 安装完成,正在验证Git... + echo װɣ֤Git... where git >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where git') do ( @@ -140,28 +140,28 @@ if exist "%_root%\tools\git\bin" ( goto :search_git ) else ( - echo 安装完成,但未找到Git,请手动安装Git + echo װɣδҵGitֶװGit start https://git-scm.com/download/win exit /b ) ) else ( - echo 取消安装Git,按任意键退出... + echo ȡװGit˳... pause >nul exit /b ) - echo 错误:未找到可用的Git! + echo δҵõGit exit /b 1 :validate_git "%git_path%" --version >nul 2>&1 if %errorlevel% neq 0 ( - echo 无效的Git:%git_path% + echo ЧGit%git_path% exit /b 1 ) - :: 提取安装目录 + :: ȡװĿ¼ for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" set "GIT_HOME=%GIT_HOME:~0,-1%" ) @@ -170,40 +170,40 @@ if exist "%_root%\tools\git\bin" ( cls sc query | findstr /i "MongoDB" >nul if !errorlevel! neq 0 ( - echo MongoDB服务未运行,是否尝试运行服务? - set /p confirm="是否启动?(Y/N): " + echo MongoDBδУǷз + set /p confirm="Ƿ(Y/N): " if /i "!confirm!"=="Y" ( - echo 正在尝试启动MongoDB服务... + echo ڳMongoDB... powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" - echo 正在等待MongoDB服务启动... - echo 按下任意键跳过等待... + echo ڵȴMongoDB... + echo ȴ... timeout /t 30 >nul sc query | findstr /i "MongoDB" >nul if !errorlevel! neq 0 ( - echo MongoDB服务启动失败,可能是没有安装,要安装吗? - set /p install_confirm="继续安装?(Y/N): " + echo MongoDBʧܣûаװҪװ + set /p install_confirm="װ(Y/N): " if /i "!install_confirm!"=="Y" ( - echo 正在安装MongoDB... + echo ڰװMongoDB... winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements - echo 安装完成,正在启动MongoDB服务... + echo װɣMongoDB... net start MongoDB if !errorlevel! neq 0 ( - echo 启动MongoDB服务失败,请手动启动 + echo MongoDBʧܣֶ exit /b ) else ( - echo MongoDB服务已成功启动 + echo MongoDBѳɹ ) ) else ( - echo 取消安装MongoDB,按任意键退出... + echo ȡװMongoDB˳... pause >nul exit /b ) ) ) else ( - echo "警告:MongoDB服务未运行,将导致MaiMBot无法访问数据库!" + echo "棺MongoDBδУMaiMBot޷ݿ⣡" ) ) else ( - echo MongoDB服务已运行 + echo MongoDB ) @REM set "GIT_HOME=%_root%\tools\git\bin" @@ -212,47 +212,47 @@ set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" :install_maim if not exist "!_root!\bot.py" ( cls - echo 你似乎没有安装麦麦Bot,要安装在当前目录吗? - set /p confirm="继续?(Y/N): " + echo ƺûаװBotҪװڵǰĿ¼ + set /p confirm="(Y/N): " if /i "!confirm!"=="Y" ( - echo 要使用Git代理下载吗? - set /p proxy_confirm="继续?(Y/N): " + echo ҪʹGit + set /p proxy_confirm="(Y/N): " if /i "!proxy_confirm!"=="Y" ( - echo 正在安装麦麦Bot... + echo ڰװBot... git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot ) else ( - echo 正在安装麦麦Bot... + echo ڰװBot... git clone https://github.com/SengokuCola/MaiMBot ) xcopy /E /H /I MaiMBot . >nul 2>&1 rmdir /s /q MaiMBot git checkout main-fix - echo 安装完成,正在安装依赖... + echo װɣڰװ... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install virtualenv python -m virtualenv venv call venv\Scripts\activate.bat python -m pip install -r requirements.txt - echo 安装完成,要编辑配置文件吗? - set /p edit_confirm="继续?(Y/N): " + echo װɣҪ༭ļ + set /p edit_confirm="(Y/N): " if /i "!edit_confirm!"=="Y" ( goto config_menu ) else ( - echo 取消编辑配置文件,按任意键返回主菜单... + echo ȡ༭ļ˵... ) ) ) -@REM git获取当前分支名并保存在变量里 +@REM gitȡǰ֧ڱ for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( set "BRANCH=%%b" ) -@REM 根据不同分支名给分支名字符串使用不同颜色 -echo 分支名: %BRANCH% +@REM ݲַ֧֧ͬʹòͬɫ +echo ֧: %BRANCH% if "!BRANCH!"=="main" ( set "BRANCH_COLOR=" ) else if "!BRANCH!"=="main-fix" ( @@ -266,78 +266,78 @@ if "!BRANCH!"=="main" ( @REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" :check_is_venv -echo 正在检查虚拟环境状态... +echo ڼ⻷״̬... if exist "%_root%\config\no_venv" ( - echo 检测到no_venv,跳过虚拟环境检查 + echo ⵽no_venv,⻷ goto menu ) -:: 环境检测 +:: if defined VIRTUAL_ENV ( goto menu ) echo ===================================== -echo 虚拟环境检测警告: -echo 当前使用系统Python路径:!PYTHON_HOME! -echo 未检测到激活的虚拟环境! +echo ⻷⾯棺 +echo ǰʹϵͳPython·!PYTHON_HOME! +echo δ⵽⻷ :env_interaction echo ===================================== -echo 请选择操作: -echo 1 - 创建并激活Venv虚拟环境 -echo 2 - 创建/激活Conda虚拟环境 -echo 3 - 临时跳过本次检查 -echo 4 - 永久跳过虚拟环境检查 -set /p choice="请输入选项(1-4): " +echo ѡ +echo 1 - Venv⻷ +echo 2 - /Conda⻷ +echo 3 - ʱμ +echo 4 - ⻷ +set /p choice="ѡ(1-4): " -if "!choice!" = "4" ( - echo 要永久跳过虚拟环境检查吗? - set /p no_venv_confirm="继续?(Y/N): ....." +if "!choice!" == "4" ( + echo Ҫ⻷ + set /p no_venv_confirm="(Y/N): ....." if /i "!no_venv_confirm!"=="Y" ( echo 1 > "%_root%\config\no_venv" - echo 已创建no_venv文件 + echo Ѵno_venvļ pause >nul goto menu ) else ( - echo 取消跳过虚拟环境检查,按任意键返回... + echo ȡ⻷飬... pause >nul goto env_interaction ) ) -if "!choice!" = "3"( - echo 警告:使用系统环境可能导致依赖冲突! +if "!choice!" == "3" ( + echo 棺ʹϵͳܵͻ timeout /t 2 >nul goto menu ) -if "!choice!" = "2" goto handle_conda -if "!choice!" = "1" goto handle_venv +if "!choice!" == "2" goto handle_conda +if "!choice!" == "1" goto handle_venv -echo 无效的输入,请输入1-4之间的数字 +echo Ч룬1-4֮ timeout /t 2 >nul goto env_interaction :handle_venv python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -echo 正在初始化Venv环境... +echo ڳʼVenv... python -m pip install virtualenv || ( - echo 安装环境失败,错误码:!errorlevel! + echo װʧܣ룺!errorlevel! pause goto env_interaction ) -echo 创建虚拟环境到:venv +echo ⻷venv python -m virtualenv venv || ( - echo 环境创建失败,错误码:!errorlevel! + echo ʧܣ룺!errorlevel! pause goto env_interaction ) call venv\Scripts\activate.bat -echo 已激活Venv环境 -echo 要安装依赖吗? -set /p install_confirm="继续?(Y/N): " +echo ѼVenv +echo Ҫװ +set /p install_confirm="(Y/N): " if /i "!install_confirm!"=="Y" ( goto update_dependencies ) @@ -345,66 +345,69 @@ goto menu :handle_conda where conda >nul 2>&1 || ( - echo 未检测到conda,可能原因: - echo 1. 未安装Miniconda - echo 2. conda配置异常 + echo δ⵽condaԭ + echo 1. δװMiniconda + echo 2. conda쳣 timeout /t 10 >nul goto env_interaction ) :conda_menu -echo 请选择Conda操作: -echo 1 - 创建新环境 -echo 2 - 激活已有环境 -echo 3 - 返回上级菜单 -set /p choice="请输入选项(1-3): " +echo ѡConda +echo 1 - » +echo 2 - л +echo 3 - ϼ˵ +set /p choice="ѡ(1-3): " if "!choice!"=="3" goto env_interaction if "!choice!"=="2" goto activate_conda if "!choice!"=="1" goto create_conda +echo Ч룬1-3֮ +timeout /t 2 >nul +goto conda_menu :create_conda -set /p "CONDA_ENV=请输入新环境名称:" +set /p "CONDA_ENV=»ƣ" if "!CONDA_ENV!"=="" ( - echo 环境名称不能为空! + echo ƲΪգ goto create_conda ) conda create -n !CONDA_ENV! python=3.13 -y || ( - echo 环境创建失败,错误码:!errorlevel! + echo ʧܣ룺!errorlevel! pause goto conda_menu ) goto activate_conda :activate_conda -set /p "CONDA_ENV=请输入要激活的环境名称:" +set /p "CONDA_ENV=ҪĻƣ" conda activate !CONDA_ENV! || ( - echo 激活失败,可能原因: - echo 1. 环境不存在 - echo 2. conda配置异常 + echo ʧܣԭ + echo 1. + echo 2. conda쳣 pause goto conda_menu ) -echo 成功激活conda环境:!CONDA_ENV! -echo 要安装依赖吗? -set /p install_confirm="继续?(Y/N): " +echo ɹconda!CONDA_ENV! +echo Ҫװ +set /p install_confirm="(Y/N): " if /i "!install_confirm!"=="Y" ( goto update_dependencies ) :menu @chcp 936 cls -echo 麦麦Bot控制台 v%VERSION% 当前分支: %BRANCH_COLOR%%BRANCH% -echo 当前Python环境: !PYTHON_HOME! +echo Bot̨ v%VERSION% ǰ֧: %BRANCH_COLOR%%BRANCH% +echo ǰPython: !PYTHON_HOME! echo ====================== -echo 1. 更新并启动麦麦Bot (默认) -echo 2. 直接启动麦麦Bot -echo 3. 启动麦麦配置界面 -echo 4. 打开麦麦神奇工具箱 -echo 5. 退出 +echo 1. ²Bot (Ĭ) +echo 2. ֱBot +echo 3. ý +echo 4. 湤 +echo 5. ˳ echo ====================== -set /p choice="请输入选项数字 (1-5)并按下回车以选择: " +set /p choice="ѡ (1-5)»سѡ: " if "!choice!"=="" set choice=1 @@ -414,7 +417,7 @@ if "!choice!"=="3" goto config_menu if "!choice!"=="4" goto tools_menu if "!choice!"=="5" exit /b -echo 无效的输入,请输入1-5之间的数字 +echo Ч룬1-5֮ timeout /t 2 >nul goto menu @@ -437,18 +440,18 @@ goto menu :tools_menu @chcp 936 cls -echo 麦麦时尚工具箱 当前分支: %BRANCH_COLOR%%BRANCH% +echo ʱй ǰ֧: %BRANCH_COLOR%%BRANCH% echo ====================== -echo 1. 更新依赖 -echo 2. 切换分支 -echo 3. 重置当前分支 -echo 4. 更新配置文件 -echo 5. 学习新的知识库 -echo 6. 打开知识库文件夹 -echo 7. 返回主菜单 +echo 1. +echo 2. л֧ +echo 3. õǰ֧ +echo 4. ļ +echo 5. ѧϰµ֪ʶ +echo 6. ֪ʶļ +echo 7. ˵ echo ====================== -set /p choice="请输入选项数字: " +set /p choice="ѡ: " if "!choice!"=="1" goto update_dependencies if "!choice!"=="2" goto switch_branch if "!choice!"=="3" goto reset_branch @@ -457,29 +460,29 @@ if "!choice!"=="5" goto learn_new_knowledge if "!choice!"=="6" goto open_knowledge_folder if "!choice!"=="7" goto menu -echo 无效的输入,请输入1-6之间的数字 +echo Ч룬1-6֮ timeout /t 2 >nul goto tools_menu :update_dependencies cls -echo 正在更新依赖... +echo ڸ... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python.exe -m pip install -r requirements.txt -echo 依赖更新完成,按任意键返回工具箱菜单... +echo ɣع˵... pause goto tools_menu :switch_branch cls -echo 正在切换分支... -echo 当前分支: %BRANCH% -@REM echo 可用分支: main, debug, stable-dev -echo 1. 切换到main -echo 2. 切换到main-fix -echo 请输入要切换到的分支: -set /p branch_name="分支名: " +echo л֧... +echo ǰ֧: %BRANCH% +@REM echo ÷֧: main, debug, stable-dev +echo 1. лmain +echo 2. лmain-fix +echo Ҫлķ֧: +set /p branch_name="֧: " if "%branch_name%"=="" set branch_name=main if "%branch_name%"=="main" ( set "BRANCH_COLOR=" @@ -494,32 +497,32 @@ if "%branch_name%"=="main" ( set "BRANCH_COLOR=" set "branch_name=main-fix" ) else ( - echo 无效的分支名, 请重新输入 + echo Чķ֧, timeout /t 2 >nul goto switch_branch ) -echo 正在切换到分支 %branch_name%... +echo л֧ %branch_name%... git checkout %branch_name% -echo 分支切换完成,当前分支: %BRANCH_COLOR%%branch_name% +echo ֧лɣǰ֧: %BRANCH_COLOR%%branch_name% set "BRANCH=%branch_name%" -echo 按任意键返回工具箱菜单... +echo ع˵... pause >nul goto tools_menu :reset_branch cls -echo 正在重置当前分支... -echo 当前分支: !BRANCH! -echo 确认要重置当前分支吗? -set /p confirm="继续?(Y/N): " +echo õǰ֧... +echo ǰ֧: !BRANCH! +echo ȷҪõǰ֧ +set /p confirm="(Y/N): " if /i "!confirm!"=="Y" ( - echo 正在重置当前分支... + echo õǰ֧... git reset --hard !BRANCH! - echo 分支重置完成,按任意键返回工具箱菜单... + echo ֧ɣع˵... ) else ( - echo 取消重置当前分支,按任意键返回工具箱菜单... + echo ȡõǰ֧ع˵... ) pause >nul goto tools_menu @@ -527,44 +530,44 @@ goto tools_menu :update_config cls -echo 正在更新配置文件... -echo 请确保已备份重要数据,继续将修改当前配置文件。 -echo 继续请按Y,取消请按任意键... -set /p confirm="继续?(Y/N): " +echo ڸļ... +echo ȷѱҪݣ޸ĵǰļ +echo 밴Yȡ밴... +set /p confirm="(Y/N): " if /i "!confirm!"=="Y" ( - echo 正在更新配置文件... + echo ڸļ... python.exe config\auto_update.py - echo 配置文件更新完成,按任意键返回工具箱菜单... + echo ļɣع˵... ) else ( - echo 取消更新配置文件,按任意键返回工具箱菜单... + echo ȡļع˵... ) pause >nul goto tools_menu :learn_new_knowledge cls -echo 正在学习新的知识库... -echo 请确保已备份重要数据,继续将修改当前知识库。 -echo 继续请按Y,取消请按任意键... -set /p confirm="继续?(Y/N): " +echo ѧϰµ֪ʶ... +echo ȷѱҪݣ޸ĵǰ֪ʶ⡣ +echo 밴Yȡ밴... +set /p confirm="(Y/N): " if /i "!confirm!"=="Y" ( - echo 正在学习新的知识库... + echo ѧϰµ֪ʶ... python.exe src\plugins\zhishi\knowledge_library.py - echo 学习完成,按任意键返回工具箱菜单... + echo ѧϰɣع˵... ) else ( - echo 取消学习新的知识库,按任意键返回工具箱菜单... + echo ȡѧϰµ֪ʶ⣬ع˵... ) pause >nul goto tools_menu :open_knowledge_folder cls -echo 正在打开知识库文件夹... +echo ڴ֪ʶļ... if exist data\raw_info ( start explorer data\raw_info ) else ( - echo 知识库文件夹不存在! - echo 正在创建文件夹... + echo ֪ʶļвڣ + echo ڴļ... mkdir data\raw_info timeout /t 2 >nul ) @@ -577,18 +580,18 @@ cls git pull > temp.log 2>&1 findstr /C:"detected dubious ownership" temp.log >nul if %errorlevel% equ 0 ( - echo 检测到仓库权限问题,正在自动修复... + echo ⵽ֿȨ⣬Զ޸... git config --global --add safe.directory "%cd%" - echo 已添加例外,正在重试git pull... + echo ⣬git pull... del temp.log goto retry_git_pull ) del temp.log -echo 正在更新依赖... +echo ڸ... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install -r requirements.txt && cls -echo 当前代理设置: +echo ǰ: echo HTTP_PROXY=%HTTP_PROXY% echo HTTPS_PROXY=%HTTPS_PROXY% @@ -600,17 +603,17 @@ set no_proxy=0.0.0.0/32 REM chcp 65001 python bot.py echo. -echo Bot已停止运行,按任意键返回主菜单... +echo BotֹͣУ˵... pause >nul goto menu :start_bot cls -echo 正在更新依赖... +echo ڸ... python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple python -m pip install -r requirements.txt && cls -echo 当前代理设置: +echo ǰ: echo HTTP_PROXY=%HTTP_PROXY% echo HTTPS_PROXY=%HTTPS_PROXY% @@ -622,7 +625,7 @@ set no_proxy=0.0.0.0/32 REM chcp 65001 python bot.py echo. -echo Bot已停止运行,按任意键返回主菜单... +echo BotֹͣУ˵... pause >nul goto menu From c1bed2f2c4a34ba1c95c40843f9ca0dd35a16c7d Mon Sep 17 00:00:00 2001 From: ChensenCHX <2087826155@qq.com> Date: Mon, 17 Mar 2025 20:14:59 +0800 Subject: [PATCH 22/28] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=B8=A4?= =?UTF-8?q?=E4=B8=AAalter=E7=9A=84=E6=94=AF=E6=8C=81=20=E8=AE=B2=E7=9C=9F?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E5=AE=9E=E7=8E=B0=E5=BE=97=E7=95=A5=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=20=E4=BD=86=E5=8B=89=E5=BC=BA=E8=83=BD=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memory_system/manually_alter_memory.py | 124 ++++++++++++++++-- 1 file changed, 110 insertions(+), 14 deletions(-) diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/plugins/memory_system/manually_alter_memory.py index 98999e4f8..e049bd2a9 100644 --- a/src/plugins/memory_system/manually_alter_memory.py +++ b/src/plugins/memory_system/manually_alter_memory.py @@ -111,7 +111,7 @@ def remove_mem_node(hippocampus: Hippocampus): console.print(f"[yellow]存在边“{edge['source']} -> {edge['target']}”, 请慎重考虑[/yellow]") console.print(f"[yellow]确定要移除名为“{concept}”的节点以及其相关边吗[/yellow]") - destory = console.input(f"[orange]请输入“{concept}”以删除节点 其他输入将被视为取消操作[/orange]\n") + destory = console.input(f"[red]请输入“{concept}”以删除节点 其他输入将被视为取消操作[/red]\n") if destory == concept: hippocampus.memory_graph.G.remove_node(concept) else: @@ -122,16 +122,16 @@ def add_mem_edge(hippocampus: Hippocampus): source = input("请输入 **第一个节点** 名称(输入'退出'以结束):\n") if source.lower() == "退出": break if db.graph_data.nodes.count_documents({'concept': source}) == 0: - console.print("[yellow]“{source}”节点不存在,操作已取消。[/yellow]") + console.print(f"[yellow]“{source}”节点不存在,操作已取消。[/yellow]") continue target = input("请输入 **第二个节点** 名称:\n") if db.graph_data.nodes.count_documents({'concept': target}) == 0: - console.print("[yellow]“{target}”节点不存在,操作已取消。[/yellow]") + console.print(f"[yellow]“{target}”节点不存在,操作已取消。[/yellow]") continue if source == target: - console.print("[yellow]试图创建“{source} <-> {target}”自环,操作已取消。[/yellow]") + console.print(f"[yellow]试图创建“{source} <-> {target}”自环,操作已取消。[/yellow]") continue hippocampus.memory_graph.connect_dot(source, target) @@ -167,16 +167,109 @@ def remove_mem_edge(hippocampus: Hippocampus): if accept.lower() == "确认": hippocampus.memory_graph.G.remove_edge(source, target) console.print(f"[green]边“{source} <-> {target}”已删除。[green]") + # 修改节点信息 def alter_mem_node(hippocampus: Hippocampus): - #todo... - #需要允许修改memory_items, last_modified - return + 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): - #todo... - #需要允许修改strength, last_modified - return + 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() @@ -194,8 +287,11 @@ async def main(): logger.info(f"\033[32m[加载海马体耗时: {end_time - start_time:.2f} 秒]\033[0m") while True: - query = int(input("请输入操作类型\n0 -> 查询节点; 1 -> 增加节点; 2 -> 移除节点; 3 -> 增加边; 4 -> 移除边;\n其他任意输入 -> 退出\n")) - + 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: @@ -207,9 +303,9 @@ async def main(): elif query == 4: remove_mem_edge(hippocampus) elif query == 5: - continue + alter_mem_node(hippocampus) elif query == 6: - continue + alter_mem_edge(hippocampus) else: print("已结束操作") break From e2c7771a6429b09015680950bb644aecb2d8bfd7 Mon Sep 17 00:00:00 2001 From: Tianmoy <95174435+Tianmoy@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:19:45 +0800 Subject: [PATCH 23/28] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E7=8E=AF=E5=A2=83=E9=80=89=E9=A1=B9=E9=97=AA=E9=80=80?= =?UTF-8?q?=20conda=E6=97=A0=E6=B3=95=E6=BF=80=E6=B4=BB=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 《关于两个电脑改文件没同步这档事》 --- MaiLauncher.bat | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index 5b76a4312..7b876bd37 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -291,7 +291,7 @@ echo 3 - echo 4 - ⻷ set /p choice="ѡ(1-4): " -if "!choice!" == "4" ( +if "!choice!"=="4" ( echo Ҫ⻷ set /p no_venv_confirm="(Y/N): ....." if /i "!no_venv_confirm!"=="Y" ( @@ -306,14 +306,14 @@ if "!choice!" == "4" ( ) ) -if "!choice!" == "3" ( +if "!choice!"=="3" ( echo 棺ʹϵͳܵͻ timeout /t 2 >nul goto menu ) -if "!choice!" == "2" goto handle_conda -if "!choice!" == "1" goto handle_venv +if "!choice!"=="2" goto handle_conda +if "!choice!"=="1" goto handle_venv echo Ч룬1-4֮ timeout /t 2 >nul @@ -362,6 +362,7 @@ set /p choice=" if "!choice!"=="3" goto env_interaction if "!choice!"=="2" goto activate_conda if "!choice!"=="1" goto create_conda + echo Ч룬1-3֮ timeout /t 2 >nul goto conda_menu @@ -374,14 +375,14 @@ if "!CONDA_ENV!"=="" ( ) conda create -n !CONDA_ENV! python=3.13 -y || ( echo ʧܣ룺!errorlevel! - pause + timeout /t 10 >nul goto conda_menu ) goto activate_conda :activate_conda set /p "CONDA_ENV=ҪĻƣ" -conda activate !CONDA_ENV! || ( +call conda activate !CONDA_ENV! || ( echo ʧܣԭ echo 1. echo 2. conda쳣 From 1c9d26778d0a79852ab55d9671540835641c021e Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Tue, 18 Mar 2025 01:08:25 +0800 Subject: [PATCH 24/28] Update EULA.md --- EULA.md | 136 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 85 insertions(+), 51 deletions(-) diff --git a/EULA.md b/EULA.md index c878ff81d..befbd4366 100644 --- a/EULA.md +++ b/EULA.md @@ -1,69 +1,103 @@ +MaiMBot最终用户许可协议 +版本:V1.0 +更新日期:2025年3月18日 +生效日期:2025年3月18日 +适用的MaiMBot版本号:v0.5.15 ---- -# **MaimBot用户协议** -**生效日期:** 2025.3.14 +2025© MaiMBot项目团队 ---- +● [一、一般条款](#一一般条款) +● [二、许可授权](#二许可授权) +● [源代码许可](#源代码许可) +● [输入输出内容授权](#输入输出内容授权) +● [三、用户行为](#三用户行为) +● [四、免责条款](#四免责条款) +● [五、其他条款](#五其他条款) +● [附录:其他重要须知](#附录其他重要须知) +● [一、风险提示](#一风险提示) +● [二、其他](#二其他) -### **特别声明** -1. **MaimBot为遵循GPLv3协议的开源项目** - - 代码托管于GitHub,**开发者不持有任何法律实体**,项目由社区共同维护; - - 用户可自由使用、修改、分发代码,但**必须遵守GPLv3许可证要求**(详见项目仓库)。 -2. **无责任声明** - - 本项目**不提供任何形式的担保**,开发者及贡献者均不对使用后果负责; - - 所有功能依赖第三方API,**生成内容不受我方控制**。 ---- +一、一般条款 -### **一、基础说明** -1. **MaimBot是什么** - - MaimBot是基于第三方AI技术(如ChatGPT等)的自动回复机器人,**所有输出内容均由AI自动生成,不代表我方观点**。 - - 用户可提交自定义指令(Prompt),经我方内容过滤后调用第三方API生成结果,**输出可能存在错误、偏见或不适宜内容**。 +1.1 MaiMBot项目(包括MaiMBot的源代码、可执行文件、文档,以及其它在本协议中所列出的文件)(以下简称“本项目”)是由开发者及贡献者(以下简称“项目团队”)共同维护,为用户提供自动回复功能的机器人代码项目。以下最终用户许可协议(EULA,以下简称“本协议”)是用户(以下简称“您”)与项目团队之间关于使用本项目所订立的合同条件。 ---- +1.2 在运行或使用本项目之前,您必须阅读并同意本协议的所有条款。未成年人或其它无/不完全民事行为能力责任人请在监护人的陪同下阅读并同意本协议。如果您不同意,则不得运行或使用本项目。在这种情况下,您应立即从您的设备上卸载或删除本项目及其所有副本。 -### **二、用户责任** -1. **禁止内容** - 您承诺**不提交或生成以下内容**,否则我方有权永久封禁账号: - - 违法、暴力、色情、歧视性内容; - - 诈骗、谣言、恶意代码等危害他人或社会的内容; - - 侵犯他人隐私、肖像权、知识产权的内容。 -2. **后果自负** - - 您需对**输入的指令(Prompt)和生成内容的使用负全责**; - - **禁止将结果用于医疗、法律、投资等专业领域**,否则风险自行承担。 +二、许可授权 ---- +源代码许可 +2.1 您了解本项目的源代码是基于GPLv3(GNU通用公共许可证第三版)开源协议发布的。您可以自由使用、修改、分发本项目的源代码,但必须遵守GPLv3许可证的要求。详细内容请参阅项目仓库中的LICENSE文件。 -### **三、我们不负责什么** -1. **技术问题** - - 因第三方API故障、网络延迟、内容过滤误判导致的服务异常; - - AI生成内容的不准确、冒犯性、时效性错误。 +2.2 您了解本项目的源代码中可能包含第三方开源代码,这些代码的许可证可能与GPLv3许可证不同。您同意在使用这些代码时遵守相应的许可证要求。 -2. **用户行为** - - 因您违反本协议或滥用MaimBot导致的任何纠纷、损失; - - 他人通过您的账号生成的违规内容。 ---- +输入输出内容授权 +2.3 您了解本项目是使用您的配置信息、提交的指令(以下简称“输入内容”)和生成的内容(以下简称“输出内容”)构建请求发送到第三方API生成回复的机器人项目。 -### **四、其他重要条款** -1. **隐私与数据** - - 您提交的指令和生成内容可能被匿名化后用于优化服务,**敏感信息请勿输入**; - - **我方会收集部分统计信息(如使用频率、基础指令类型)以改进服务,您可在[bot_config.toml]随时关闭此功能**。 +2.4 您授权本项目使用您的输入和输出内容按照项目的隐私条款用于以下行为: +● 调用第三方API用于生成回复; +● 调用第三方API用于构建本项目专用的存储于您部署或使用的数据库中的知识库和记忆库; +● 收集并记录本项目专用的存储于您部署或使用的设备中的日志; -2. **精神健康风险** - ⚠️ **MaimBot仅为工具型机器人,不具备情感交互能力。建议用户:** - - 避免过度依赖AI回复处理现实问题或情绪困扰; - - 如感到心理不适,请及时寻求专业心理咨询服务。 - - 如遇心理困扰,请寻求专业帮助(全国心理援助热线:12355)。 +2.5 您了解本项目的源代码中包含第三方API的调用代码,这些API的使用可能受到第三方的服务条款和隐私政策的约束。在使用这些API时,您必须遵守相应的服务条款。 -3. **封禁权利** - - 我方有权不经通知**删除违规内容、暂停或终止您的访问权限**。 +2.6 项目团队不对第三方API的服务质量、稳定性、准确性、安全性负责,亦不对第三方API的服务变更、终止、限制等行为负责。 + + +三、用户行为 + +3.1 您了解本项目会将您的配置信息、输入指令和生成内容发送到第三方API,您不应在输入指令和生成内容中包含以下内容: +● 涉及任何国家或地区秘密、商业秘密或其他可能会对国家或地区安全或者公共利益造成不利影响的数据; +● 涉及个人隐私、个人信息或其他敏感信息的数据; +● 侵犯他人合法权益的内容; +● 任何违反您及您部署本项目所用的设备所在的国家或地区的法律法规、政策规定的内容; + +3.2 您不应将本项目用于以下用途: +● 任何违反您及您部署本项目所用的设备所在的国家或地区的法律法规、政策规定的行为; + +3.3 您应当自行确保您被存储在本项目的知识库、记忆库和日志中的输入和输出内容的合法性与合规性以及存储行为的合法性与合规性。由此产生的任何法律责任均由您自行承担。 + + +四、免责条款 + +4.1 本项目的输出内容依赖第三方API,不受项目团队控制,亦不代表项目团队的观点。 + +4.2 除本协议条目2.3提到的之外,项目团队不会对您提供任何形式的担保,亦不对使用本项目的造成的任何后果负责。 + +五、其他条款 + +5.1 项目团队有权随时修改本协议的条款,修改后的协议将在本项目的新版本中生效。您应定期检查本协议的最新版本。 + +5.2 项目团队保有本协议的最终解释权。 + + +附录:其他重要须知 + +一、风险提示 + +1.1 隐私安全风险: 由于: +● 本项目会将您的配置信息、输入指令和生成内容发送到第三方API,而这些API的服务质量、稳定性、准确性、安全性不受项目团队控制。 +● 本项目会收集您的输入和输出内容,用于构建本项目专用的知识库和记忆库,以提高回复的准确性和连贯性。 + + 为了保障您的隐私信息安全,请注意以下事项: +● 避免在涉及个人隐私、个人信息或其他敏感信息的环境中使用本项目; +● 避免在不可信的环境中使用本项目; +● 避免在不可信的网络环境中使用本项目。 + +1.2 精神健康风险: 本项目仅为工具型机器人,不具备情感交互能力。建议用户: +● 避免过度依赖AI回复处理现实问题或情绪困扰; +● 如感到心理不适,请及时寻求专业心理咨询服务。 +● 如遇心理困扰,请寻求专业帮助(全国心理援助热线:12355)。 + +二、过往版本使用条件追溯 +对于本项目此前未配备 EULA 协议的版本,自本协议发布之日起,若用户希望继续使用这些版本,应在本协议生效后的合理时间内,通过升级到最新版本并同意本协议全部条款。若在本协议生效日2025年3月18日之后,用户仍使用此前无 EULA 协议版本且未同意本协议,则用户无权继续使用,项目方有权采取技术手段阻止其使用行为,并保留追究相关法律责任的权利 。 + +三、其他 +2.1 争议解决 +● 本协议适用中国法律,争议提交相关地区法院管辖; +● 若因GPLv3许可产生纠纷,以许可证官方解释为准。 -4. **争议解决** - - 本协议适用中国法律,争议提交相关地区法院管辖; - - 若因GPLv3许可产生纠纷,以许可证官方解释为准。 - ---- From 6ae31f58802f84503d27723e022f548519a47262 Mon Sep 17 00:00:00 2001 From: Oct-autumn Date: Tue, 18 Mar 2025 01:56:44 +0800 Subject: [PATCH 25/28] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0EULA=E5=92=8C?= =?UTF-8?q?=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++- EULA.md | 122 ++++++++++++++++++++++++++++++++--------------------- PRIVACY.md | 21 +++++++++ README.md | 37 ++++++++-------- bot.py | 66 +++++++++++++++++++++-------- 5 files changed, 169 insertions(+), 82 deletions(-) create mode 100644 PRIVACY.md diff --git a/.gitignore b/.gitignore index d17c6adc1..2658ecc6f 100644 --- a/.gitignore +++ b/.gitignore @@ -212,4 +212,7 @@ jieba.cache # a .local-version file will be created in the root of the project to specify the version. .python-version -OtherRes.txt \ No newline at end of file +OtherRes.txt + +/eula.confirmed +/privacy.confirmed \ No newline at end of file diff --git a/EULA.md b/EULA.md index c878ff81d..c7a734a27 100644 --- a/EULA.md +++ b/EULA.md @@ -1,69 +1,97 @@ +# **MaiMBot最终用户许可协议** +**版本:V1.0** +**更新日期:2025年3月18日** +**生效日期:2025年3月18日** +**适用的MaiMBot版本号:<=v0.5.15** ---- -# **MaimBot用户协议** -**生效日期:** 2025.3.14 +**2025© MaiMBot项目团队** --- -### **特别声明** -1. **MaimBot为遵循GPLv3协议的开源项目** - - 代码托管于GitHub,**开发者不持有任何法律实体**,项目由社区共同维护; - - 用户可自由使用、修改、分发代码,但**必须遵守GPLv3许可证要求**(详见项目仓库)。 +## 一、一般条款 -2. **无责任声明** - - 本项目**不提供任何形式的担保**,开发者及贡献者均不对使用后果负责; - - 所有功能依赖第三方API,**生成内容不受我方控制**。 +**1.1** MaiMBot项目(包括MaiMBot的源代码、可执行文件、文档,以及其它在本协议中所列出的文件)(以下简称“本项目”)是由开发者及贡献者(以下简称“项目团队”)共同维护,为用户提供自动回复功能的机器人代码项目。以下最终用户许可协议(EULA,以下简称“本协议”)是用户(以下简称“您”)与项目团队之间关于使用本项目所订立的合同条件。 ---- +**1.2** 在运行或使用本项目之前,您**必须阅读并同意本协议的所有条款**。未成年人或其它无/不完全民事行为能力责任人请**在监护人的陪同下**阅读并同意本协议。如果您不同意,则不得运行或使用本项目。在这种情况下,您应立即从您的设备上卸载或删除本项目及其所有副本。 -### **一、基础说明** -1. **MaimBot是什么** - - MaimBot是基于第三方AI技术(如ChatGPT等)的自动回复机器人,**所有输出内容均由AI自动生成,不代表我方观点**。 - - 用户可提交自定义指令(Prompt),经我方内容过滤后调用第三方API生成结果,**输出可能存在错误、偏见或不适宜内容**。 ---- +## 二、许可授权 -### **二、用户责任** -1. **禁止内容** - 您承诺**不提交或生成以下内容**,否则我方有权永久封禁账号: - - 违法、暴力、色情、歧视性内容; - - 诈骗、谣言、恶意代码等危害他人或社会的内容; - - 侵犯他人隐私、肖像权、知识产权的内容。 +### 源代码许可 +**2.1** 您**了解**本项目的源代码是基于GPLv3(GNU通用公共许可证第三版)开源协议发布的。您**可以自由使用、修改、分发**本项目的源代码,但**必须遵守**GPLv3许可证的要求。详细内容请参阅项目仓库中的LICENSE文件。 -2. **后果自负** - - 您需对**输入的指令(Prompt)和生成内容的使用负全责**; - - **禁止将结果用于医疗、法律、投资等专业领域**,否则风险自行承担。 +**2.2** 您**了解**本项目的源代码中可能包含第三方开源代码,这些代码的许可证可能与GPLv3许可证不同。您**同意**在使用这些代码时**遵守**相应的许可证要求。 ---- -### **三、我们不负责什么** -1. **技术问题** - - 因第三方API故障、网络延迟、内容过滤误判导致的服务异常; - - AI生成内容的不准确、冒犯性、时效性错误。 +### 输入输出内容授权 -2. **用户行为** - - 因您违反本协议或滥用MaimBot导致的任何纠纷、损失; - - 他人通过您的账号生成的违规内容。 +**2.3** 您**了解**本项目是使用您的配置信息、提交的指令(以下简称“输入内容”)和生成的内容(以下简称“输出内容”)构建请求发送到第三方API生成回复的机器人项目。 ---- +**2.4** 您**授权**本项目使用您的输入和输出内容按照项目的隐私政策用于以下行为: + - 调用第三方API生成回复; + - 调用第三方API用于构建本项目专用的存储于您部署或使用的数据库中的知识库和记忆库; + - 收集并记录本项目专用的存储于您部署或使用的设备中的日志; -### **四、其他重要条款** -1. **隐私与数据** - - 您提交的指令和生成内容可能被匿名化后用于优化服务,**敏感信息请勿输入**; - - **我方会收集部分统计信息(如使用频率、基础指令类型)以改进服务,您可在[bot_config.toml]随时关闭此功能**。 +**2.4** 您**了解**本项目的源代码中包含第三方API的调用代码,这些API的使用可能受到第三方的服务条款和隐私政策的约束。在使用这些API时,您**必须遵守**相应的服务条款。 -2. **精神健康风险** - ⚠️ **MaimBot仅为工具型机器人,不具备情感交互能力。建议用户:** +**2.5** 项目团队**不对**第三方API的服务质量、稳定性、准确性、安全性负责,亦**不对**第三方API的服务变更、终止、限制等行为负责。 + + +## 三、用户行为 + +**3.1** 您**了解**本项目会将您的配置信息、输入指令和生成内容发送到第三方API,您**不应**在输入指令和生成内容中包含以下内容: + - 涉及任何国家或地区秘密、商业秘密或其他可能会对国家或地区安全或者公共利益造成不利影响的数据; + - 涉及个人隐私、个人信息或其他敏感信息的数据; + - 任何侵犯他人合法权益的内容; + - 任何违反国家或地区法律法规、政策规定的内容; + +**3.2** 您**不应**将本项目用于以下用途: + - 违反任何国家或地区法律法规、政策规定的行为; + +**3.3** 您**应当**自行确保您被存储在本项目的知识库、记忆库和日志中的输入和输出内容的合法性与合规性以及存储行为的合法性与合规性。您需**自行承担**由此产生的任何法律责任。 + + + +## 四、免责条款 + +**4.1** 本项目的输出内容依赖第三方API,**不受**项目团队控制,亦**不代表**项目团队的观点。 + +**4.2** 除本协议条目2.4提到的隐私政策之外,项目团队**不会**对您提供任何形式的担保,亦**不对**使用本项目的造成的任何后果负责。 + +## 五、其他条款 + +**5.1** 项目团队有权**随时修改本协议的条款**,但**没有**义务通知您。修改后的协议将在本项目的新版本中生效,您应定期检查本协议的最新版本。 + +**5.2** 项目团队**保留**本协议的最终解释权。 + + +## 附录:其他重要须知 + +### 一、过往版本使用条件追溯 + +**1.1** 对于本项目此前未配备 EULA 协议的版本,自本协议发布之日起,若用户希望继续使用本项目,应在本协议生效后的合理时间内,通过升级到最新版本并同意本协议全部条款。若在本版协议生效日(2025年3月18日)之后,用户仍使用此前无 EULA 协议的项目版本且未同意本协议,则用户无权继续使用,项目方有权采取措施阻止其使用行为,并保留追究相关法律责任的权利。 + + +### 二、风险提示 + +**2.1 隐私安全风险** + + - 本项目会将您的配置信息、输入指令和生成内容发送到第三方API,而这些API的服务质量、稳定性、准确性、安全性不受项目团队控制。 + - 本项目会收集您的输入和输出内容,用于构建本项目专用的知识库和记忆库,以提高回复的准确性和连贯性。 + + **因此,为了保障您的隐私信息安全,请注意以下事项:** + + - 避免在涉及个人隐私、个人信息或其他敏感信息的环境中使用本项目; + - 避免在不可信的环境中使用本项目; + +**2.2 精神健康风险** + +本项目仅为工具型机器人,不具备情感交互能力。建议用户: - 避免过度依赖AI回复处理现实问题或情绪困扰; - 如感到心理不适,请及时寻求专业心理咨询服务。 - 如遇心理困扰,请寻求专业帮助(全国心理援助热线:12355)。 -3. **封禁权利** - - 我方有权不经通知**删除违规内容、暂停或终止您的访问权限**。 - -4. **争议解决** +### 三、其他 +**3.1 争议解决** - 本协议适用中国法律,争议提交相关地区法院管辖; - 若因GPLv3许可产生纠纷,以许可证官方解释为准。 - - ---- diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 000000000..ba85f617f --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,21 @@ +### MaiMBot用户隐私条款 +**版本:V1.0** +**更新日期:2025年3月18日** +**生效日期:2025年3月18日** +**适用的MaiMBot版本号:<=v0.5.15** + +**2025© MaiMBot项目团队** + +MaiMBot项目团队(以下简称项目团队)**尊重并保护**用户(以下简称您)的隐私。若您选择使用MaiMBot项目(以下简称本项目),则您需同意本项目按照以下隐私条款处理您的输入和输出内容: + +**1.1** 本项目**会**收集您的输入和输出内容并发送到第三方API,用于生成新的输出内容。因此您的输入和输出内容**会**同时受到本项目和第三方API的隐私政策约束。 + +**1.2** 本项目**会**收集您的输入和输出内容,用于构建本项目专用的仅存储在您使用的数据库中的知识库和记忆库,以提高回复的准确性和连贯性。 + +**1.3** 本项目**会**收集您的输入和输出内容,用于生成仅存储于您部署或使用的设备中的不会上传至互联网的日志。但当您向项目团队反馈问题时,项目团队可能需要您提供日志文件以帮助解决问题。 + +**1.4** 本项目可能**会**收集部分统计信息(如使用频率、基础指令类型)以改进服务,您可在[bot_config.toml]中随时关闭此功能**。 + +**1.5** 由于您的自身行为或不可抗力等情形,导致上述可能涉及您隐私或您认为是私人信息的内容发生被泄露、批漏,或被第三方获取、使用、转让等情形的,均由您**自行承担**不利后果,我们对此**不承担**任何责任。 + +**1.6** 项目团队保留在未来更新隐私条款的权利,但没有义务通知您。若您不同意更新后的隐私条款,您应立即停止使用本项目。 \ No newline at end of file diff --git a/README.md b/README.md index 5de6f5dfd..6794b5e19 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,6 @@ > - 由于持续迭代,可能存在一些已知或未知的bug > - 由于开发中,可能消耗较多token -## 💬交流群 -- [一群](https://qm.qq.com/q/VQ3XZrWgMs) 766798517 ,建议加下面的(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 -- [二群](https://qm.qq.com/q/RzmCiRtHEW) 571780722 (开发和建议相关讨论)不一定有空回复,会优先写文档和代码 -- [三群](https://qm.qq.com/q/wlH5eT8OmQ) 1035228475(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 -- [四群](https://qm.qq.com/q/wlH5eT8OmQ) 729957033(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 - **📚 有热心网友创作的wiki:** https://maimbot.pages.dev/ **📚 由SLAPQ制作的B站教程:** https://www.bilibili.com/opus/1041609335464001545 @@ -51,9 +45,17 @@ - (由 [CabLate](https://github.com/cablate) 贡献) [Telegram 与其他平台(未来可能会有)的版本](https://github.com/cablate/MaiMBot/tree/telegram) - [集中讨论串](https://github.com/SengokuCola/MaiMBot/discussions/149) -## 📝 注意注意注意注意注意注意注意注意注意注意注意注意注意注意注意注意注意 -**如果你有想法想要提交pr** -- 由于本项目在快速迭代和功能调整,并且有重构计划,目前不接受任何未经过核心开发组讨论的pr合并,谢谢!如您仍旧希望提交pr,可以详情请看置顶issue +## ✍️如何给本项目报告BUG/提交建议/做贡献 + +MaiMBot是一个开源项目,我们非常欢迎你的参与。你的贡献,无论是提交bug报告、功能需求还是代码pr,都对项目非常宝贵。我们非常感谢你的支持!🎉 但无序的讨论会降低沟通效率,进而影响问题的解决速度,因此在提交任何贡献前,请务必先阅读本项目的[贡献指南](CONTRIBUTE.md) + +### 💬交流群 +- [一群](https://qm.qq.com/q/VQ3XZrWgMs) 766798517 ,建议加下面的(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 +- [二群](https://qm.qq.com/q/RzmCiRtHEW) 571780722 (开发和建议相关讨论)不一定有空回复,会优先写文档和代码 +- [三群](https://qm.qq.com/q/wlH5eT8OmQ) 1035228475(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 +- [四群](https://qm.qq.com/q/wlH5eT8OmQ) 729957033(开发和建议相关讨论)不一定有空回复,会优先写文档和代码 + +

📚 文档 ⬇️ 快速开始使用麦麦 ⬇️

@@ -148,23 +150,24 @@ ## 设计理念 -- **千石可乐说:** -- 这个项目最初只是为了给牛牛bot添加一点额外的功能,但是功能越写越多,最后决定重写。其目的是为了创造一个活跃在QQ群聊的"生命体"。可以目的并不是为了写一个功能齐全的机器人,而是一个尽可能让人感知到真实的类人存在. -- 程序的功能设计理念基于一个核心的原则:"最像而不是好" -- 主打一个陪伴 -- 如果人类真的需要一个AI来陪伴自己,并不是所有人都需要一个完美的,能解决所有问题的helpful assistant,而是一个会犯错的,拥有自己感知和想法的"生命形式"。 -- 代码会保持开源和开放,但个人希望MaiMbot的运行时数据保持封闭,尽量避免以显式命令来对其进行控制和调试.我认为一个你无法完全掌控的个体才更能让你感觉到它的自主性,而视其成为一个对话机器. +> **千石可乐说:** +> - 这个项目最初只是为了给牛牛bot添加一点额外的功能,但是功能越写越多,最后决定重写。其目的是为了创造一个活跃在QQ群聊的"生命体"。可以目的并不是为了写一个功能齐全的机器人,而是一个尽可能让人感知到真实的类人存在. +> - 程序的功能设计理念基于一个核心的原则:"最像而不是好" +> - 主打一个陪伴 +> - 如果人类真的需要一个AI来陪伴自己,并不是所有人都需要一个完美的,能解决所有问题的helpful assistant,而是一个会犯错的,拥有自己感知和想法的"生命形式"。 +> - 代码会保持开源和开放,但个人希望MaiMbot的运行时数据保持封闭,尽量避免以显式命令来对其进行控制和调试.我认为一个你无法完全掌控的个体才更能让你感觉到它的自主性,而视其成为一个对话机器. ## 📌 注意事项 SengokuCola~~纯编程外行,面向cursor编程,很多代码写得不好多多包涵~~已得到大脑升级 + > [!WARNING] > 本应用生成内容来自人工智能模型,由 AI 生成,请仔细甄别,请勿用于违反法律的用途,AI生成内容不代表本人观点和立场。 ## 致谢 -[nonebot2](https://github.com/nonebot/nonebot2): 跨平台 Python 异步聊天机器人框架 -[NapCat](https://github.com/NapNeko/NapCatQQ): 现代化的基于 NTQQ 的 Bot 协议端实现 +- [nonebot2](https://github.com/nonebot/nonebot2): 跨平台 Python 异步聊天机器人框架 +- [NapCat](https://github.com/NapNeko/NapCatQQ): 现代化的基于 NTQQ 的 Bot 协议端实现 ### 贡献者 diff --git a/bot.py b/bot.py index bf853bc0c..3ebfa414d 100644 --- a/bot.py +++ b/bot.py @@ -166,25 +166,57 @@ async def uvicorn_main(): await server.serve() def check_eula(): - eula_file = Path("elua.confirmed") + eula_confirm_file = Path("elua.confirmed") + privacy_confirm_file = Path("privacy.confirmed") + eula_file = Path("EULA.md") + privacy_file = Path("PRIVACY.md") - # 如果已经确认过EULA,直接返回 - if eula_file.exists(): - return - - print("使用MaiMBot前请先阅读ELUA协议,继续运行视为同意协议") - print("协议内容:https://github.com/SengokuCola/MaiMBot/blob/main/EULA.md") - print('输入"同意"或"confirmed"继续运行') - - while True: - user_input = input().strip().lower() # 转换为小写以忽略大小写 - if user_input in ['同意', 'confirmed']: - # 创建确认文件 - eula_file.touch() - break - else: - print('请输入"同意"或"confirmed"以继续运行') + eula_updated = True + privacy_updated = True + eula_confirmed = False + privacy_confirmed = False + + # 检查EULA确认文件是否存在 + if eula_confirm_file.exists(): + # 检查EULA文件版本是否更新(与elua.confirmed文件对比) + with open(eula_file, "r") as f: + eula_content = f.read() + with open(eula_confirm_file, "r") as f: + confirmed_content = f.read() + if eula_content == confirmed_content: + eula_confirmed = True + eula_updated = False + + + # 检查隐私条款确认文件是否存在 + if privacy_confirm_file.exists(): + # 检查隐私条款文件版本是否更新(与privacy.confirmed文件对比) + with open(privacy_file, "r") as f: + privacy_content = f.read() + with open(privacy_confirm_file, "r") as f: + confirmed_content = f.read() + if privacy_content == confirmed_content: + privacy_confirmed = True + privacy_updated = False + + # 如果EULA或隐私条款有更新,提示用户重新确认 + if eula_updated or privacy_updated: + print("EULA或隐私条款内容已更新,请在阅读后重新确认,继续运行视为同意更新后的以上两款协议") + print('输入"同意"或"confirmed"继续运行') + while True: + user_input = input().strip().lower() + if user_input in ['同意', 'confirmed']: + if eula_updated: + eula_confirm_file.write_text(eula_file.read_text()) + if privacy_updated: + privacy_confirm_file.write_text(privacy_file.read_text()) + break + else: + print('请输入"同意"或"confirmed"以继续运行') + return + elif eula_confirmed and privacy_confirmed: + return def raw_main(): # 利用 TZ 环境变量设定程序工作的时区 From c2e0bf49d1a1599075efe9f8b2432318147c940c Mon Sep 17 00:00:00 2001 From: Maple127667 <98679702+Maple127667@users.noreply.github.com> Date: Tue, 18 Mar 2025 02:06:58 +0800 Subject: [PATCH 26/28] =?UTF-8?q?statistics=E8=BE=93=E5=87=BA=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llm_statistics输出优化(增加token分模型计算,格式优化) --- src/plugins/utils/statistic.py | 72 ++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/src/plugins/utils/statistic.py b/src/plugins/utils/statistic.py index f1f53275e..6a5062567 100644 --- a/src/plugins/utils/statistic.py +++ b/src/plugins/utils/statistic.py @@ -50,7 +50,11 @@ class LLMStatistics: "total_cost": 0.0, "costs_by_user": defaultdict(float), "costs_by_type": defaultdict(float), - "costs_by_model": defaultdict(float) + "costs_by_model": defaultdict(float), + #新增token统计字段 + "tokens_by_type": defaultdict(int), + "tokens_by_user": defaultdict(int), + "tokens_by_model": defaultdict(int), } cursor = db.llm_usage.find({ @@ -71,7 +75,11 @@ class LLMStatistics: prompt_tokens = doc.get("prompt_tokens", 0) completion_tokens = doc.get("completion_tokens", 0) - stats["total_tokens"] += prompt_tokens + completion_tokens + total_tokens = prompt_tokens + completion_tokens # 根据数据库字段调整 + stats["tokens_by_type"][request_type] += total_tokens + stats["tokens_by_user"][user_id] += total_tokens + stats["tokens_by_model"][model_name] += total_tokens + stats["total_tokens"] += total_tokens cost = doc.get("cost", 0.0) stats["total_cost"] += cost @@ -98,31 +106,61 @@ class LLMStatistics: } def _format_stats_section(self, stats: Dict[str, Any], title: str) -> str: - """格式化统计部分的输出 - - Args: - stats: 统计数据 - title: 部分标题 - """ + """格式化统计部分的输出""" output = [] - output.append(f"\n{title}") - output.append("=" * len(title)) + + output.append("\n"+"-" * 84) + output.append(f"{title}") + output.append("-" * 84) output.append(f"总请求数: {stats['total_requests']}") if stats['total_requests'] > 0: output.append(f"总Token数: {stats['total_tokens']}") - output.append(f"总花费: ¥{stats['total_cost']:.4f}") + output.append(f"总花费: {stats['total_cost']:.4f}¥\n") - output.append("\n按模型统计:") + data_fmt = "{:<32} {:>10} {:>14} {:>13.4f} ¥" + + # 按模型统计 + output.append("按模型统计:") + output.append(("模型名称 调用次数 Token总量 累计花费")) for model_name, count in sorted(stats["requests_by_model"].items()): + tokens = stats["tokens_by_model"][model_name] cost = stats["costs_by_model"][model_name] - output.append(f"- {model_name}: {count}次 (花费: ¥{cost:.4f})") + output.append(data_fmt.format( + model_name[:32] + ".." if len(model_name) > 32 else model_name, + count, + tokens, + cost + )) + output.append("") - output.append("\n按请求类型统计:") + # 按请求类型统计 + output.append("按请求类型统计:") + output.append(("模型名称 调用次数 Token总量 累计花费")) for req_type, count in sorted(stats["requests_by_type"].items()): + tokens = stats["tokens_by_type"][req_type] cost = stats["costs_by_type"][req_type] - output.append(f"- {req_type}: {count}次 (花费: ¥{cost:.4f})") - + output.append(data_fmt.format( + req_type[:22] + ".." if len(req_type) > 24 else req_type, + count, + tokens, + cost + )) + output.append("") + + # 修正用户统计列宽 + output.append("按用户统计:") + output.append(("模型名称 调用次数 Token总量 累计花费")) + for user_id, count in sorted(stats["requests_by_user"].items()): + tokens = stats["tokens_by_user"][user_id] + cost = stats["costs_by_user"][user_id] + output.append(data_fmt.format( + user_id[:22], # 不再添加省略号,保持原始ID + count, + tokens, + cost + )) + return "\n".join(output) def _save_statistics(self, all_stats: Dict[str, Dict[str, Any]]): @@ -131,7 +169,7 @@ class LLMStatistics: output = [] output.append(f"LLM请求统计报告 (生成时间: {current_time})") - output.append("=" * 50) + # 添加各个时间段的统计 sections = [ From e9359ba14a130c8ec1ca0272df4eb1219ef3d27a Mon Sep 17 00:00:00 2001 From: KawaiiYusora Date: Tue, 18 Mar 2025 03:03:27 +0800 Subject: [PATCH 27/28] =?UTF-8?q?=F0=9F=94=A7=20chore(MaiLauncher):=20?= =?UTF-8?q?=E5=94=89=E6=88=91=E8=8D=89=E6=80=8E=E4=B9=88=E8=BF=99=E4=B9=88?= =?UTF-8?q?=E5=9D=8F=EF=BC=8C=E8=B0=81=E7=94=A8utf-8=E5=AE=B3=E6=88=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MaiLauncher.bat | 1272 +++++++++++++++++++++++------------------------ 1 file changed, 636 insertions(+), 636 deletions(-) diff --git a/MaiLauncher.bat b/MaiLauncher.bat index 7b876bd37..766bfbfb5 100644 --- a/MaiLauncher.bat +++ b/MaiLauncher.bat @@ -1,636 +1,636 @@ -@echo off -@setlocal enabledelayedexpansion -@chcp 936 - -@REM ð汾 -set "VERSION=1.0" - -title Bot̨ v%VERSION% - -@REM PythonGit -set "_root=%~dp0" -set "_root=%_root:~0,-1%" -cd "%_root%" - - -:search_python -cls -if exist "%_root%\python" ( - set "PYTHON_HOME=%_root%\python" -) else if exist "%_root%\venv" ( - call "%_root%\venv\Scripts\activate.bat" - set "PYTHON_HOME=%_root%\venv\Scripts" -) else ( - echo ԶPython... - - where python >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where python') do ( - echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul - if errorlevel 1 ( - echo ҵPython%%i - set "py_path=%%i" - goto :validate_python - ) - ) - ) - set "search_paths=%ProgramFiles%\Git*;!LocalAppData!\Programs\Python\Python*" - for /d %%d in (!search_paths!) do ( - if exist "%%d\python.exe" ( - set "py_path=%%d\python.exe" - goto :validate_python - ) - ) - echo ûҵPython,Ҫװ? - set /p pyinstall_confirm="(Y/n): " - if /i "!pyinstall_confirm!"=="Y" ( - cls - echo ڰװPython... - winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements - if %errorlevel% neq 0 ( - echo װʧܣֶװPython - start https://www.python.org/downloads/ - exit /b - ) - echo װɣ֤Python... - goto search_python - - ) else ( - echo ȡװPython˳... - pause >nul - exit /b - ) - - echo δҵõPython - exit /b 1 - - :validate_python - "!py_path!" --version >nul 2>&1 - if %errorlevel% neq 0 ( - echo ЧPython%py_path% - exit /b 1 - ) - - :: ȡװĿ¼ - for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" - set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" -) -if not exist "%PYTHON_HOME%\python.exe" ( - echo Python·֤ʧܣ%PYTHON_HOME% - echo Pythonװ·Ƿpython.exeļ - exit /b 1 -) -echo ɹPython·%PYTHON_HOME% - - - -:search_git -cls -if exist "%_root%\tools\git\bin" ( - set "GIT_HOME=%_root%\tools\git\bin" -) else ( - echo ԶGit... - - where git >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where git') do ( - set "git_path=%%i" - goto :validate_git - ) - ) - echo ɨ賣װ·... - set "search_paths=!ProgramFiles!\Git\cmd" - for /f "tokens=*" %%d in ("!search_paths!") do ( - if exist "%%d\git.exe" ( - set "git_path=%%d\git.exe" - goto :validate_git - ) - ) - echo ûҵGitҪװ - set /p confirm="(Y/N): " - if /i "!confirm!"=="Y" ( - cls - echo ڰװ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 "download_path=%TEMP%\Git-Installer.exe" - - echo Gitװ... - curl -L -o "!download_path!" "!custom_url!" - - if exist "!download_path!" ( - echo سɹʼװGit... - start /wait "" "!download_path!" /SILENT /NORESTART - ) else ( - echo ʧܣֶװGit - start https://git-scm.com/download/win - exit /b - ) - - del "!download_path!" - echo ʱļ - - echo װɣ֤Git... - where git >nul 2>&1 - if %errorlevel% equ 0 ( - for /f "delims=" %%i in ('where git') do ( - set "git_path=%%i" - goto :validate_git - ) - goto :search_git - - ) else ( - echo װɣδҵGitֶװGit - start https://git-scm.com/download/win - exit /b - ) - - ) else ( - echo ȡװGit˳... - pause >nul - exit /b - ) - - echo δҵõGit - exit /b 1 - - :validate_git - "%git_path%" --version >nul 2>&1 - if %errorlevel% neq 0 ( - echo ЧGit%git_path% - exit /b 1 - ) - - :: ȡװĿ¼ - for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" - set "GIT_HOME=%GIT_HOME:~0,-1%" -) - -:search_mongodb -cls -sc query | findstr /i "MongoDB" >nul -if !errorlevel! neq 0 ( - echo MongoDBδУǷз - set /p confirm="Ƿ(Y/N): " - if /i "!confirm!"=="Y" ( - echo ڳMongoDB... - powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" - echo ڵȴMongoDB... - echo ȴ... - timeout /t 30 >nul - sc query | findstr /i "MongoDB" >nul - if !errorlevel! neq 0 ( - echo MongoDBʧܣûаװҪװ - set /p install_confirm="װ(Y/N): " - if /i "!install_confirm!"=="Y" ( - echo ڰװMongoDB... - winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements - echo װɣMongoDB... - net start MongoDB - if !errorlevel! neq 0 ( - echo MongoDBʧܣֶ - exit /b - ) else ( - echo MongoDBѳɹ - ) - ) else ( - echo ȡװMongoDB˳... - pause >nul - exit /b - ) - ) - ) else ( - echo "棺MongoDBδУMaiMBot޷ݿ⣡" - ) -) else ( - echo MongoDB -) - -@REM set "GIT_HOME=%_root%\tools\git\bin" -set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" - -:install_maim -if not exist "!_root!\bot.py" ( - cls - echo ƺûаװBotҪװڵǰĿ¼ - set /p confirm="(Y/N): " - if /i "!confirm!"=="Y" ( - echo ҪʹGit - set /p proxy_confirm="(Y/N): " - if /i "!proxy_confirm!"=="Y" ( - echo ڰװBot... - git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot - ) else ( - echo ڰװBot... - git clone https://github.com/SengokuCola/MaiMBot - ) - xcopy /E /H /I MaiMBot . >nul 2>&1 - rmdir /s /q MaiMBot - git checkout main-fix - - echo װɣڰװ... - python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple - python -m pip install virtualenv - python -m virtualenv venv - call venv\Scripts\activate.bat - python -m pip install -r requirements.txt - - echo װɣҪ༭ļ - set /p edit_confirm="(Y/N): " - if /i "!edit_confirm!"=="Y" ( - goto config_menu - ) else ( - echo ȡ༭ļ˵... - ) - ) -) - - -@REM gitȡǰ֧ڱ -for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( - set "BRANCH=%%b" -) - -@REM ݲַ֧֧ͬʹòͬɫ -echo ֧: %BRANCH% -if "!BRANCH!"=="main" ( - set "BRANCH_COLOR=" -) else if "!BRANCH!"=="main-fix" ( - set "BRANCH_COLOR=" -@REM ) else if "%BRANCH%"=="stable-dev" ( -@REM set "BRANCH_COLOR=" -) else ( - set "BRANCH_COLOR=" -) - -@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" - -:check_is_venv -echo ڼ⻷״̬... -if exist "%_root%\config\no_venv" ( - echo ⵽no_venv,⻷ - goto menu -) - -:: -if defined VIRTUAL_ENV ( - goto menu -) - -echo ===================================== -echo ⻷⾯棺 -echo ǰʹϵͳPython·!PYTHON_HOME! -echo δ⵽⻷ - -:env_interaction -echo ===================================== -echo ѡ -echo 1 - Venv⻷ -echo 2 - /Conda⻷ -echo 3 - ʱμ -echo 4 - ⻷ -set /p choice="ѡ(1-4): " - -if "!choice!"=="4" ( - echo Ҫ⻷ - set /p no_venv_confirm="(Y/N): ....." - if /i "!no_venv_confirm!"=="Y" ( - echo 1 > "%_root%\config\no_venv" - echo Ѵno_venvļ - pause >nul - goto menu - ) else ( - echo ȡ⻷飬... - pause >nul - goto env_interaction - ) -) - -if "!choice!"=="3" ( - echo 棺ʹϵͳܵͻ - timeout /t 2 >nul - goto menu -) - -if "!choice!"=="2" goto handle_conda -if "!choice!"=="1" goto handle_venv - -echo Ч룬1-4֮ -timeout /t 2 >nul -goto env_interaction - -:handle_venv -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -echo ڳʼVenv... -python -m pip install virtualenv || ( - echo װʧܣ룺!errorlevel! - pause - goto env_interaction -) -echo ⻷venv - python -m virtualenv venv || ( - echo ʧܣ룺!errorlevel! - pause - goto env_interaction -) - -call venv\Scripts\activate.bat -echo ѼVenv -echo Ҫװ -set /p install_confirm="(Y/N): " -if /i "!install_confirm!"=="Y" ( - goto update_dependencies -) -goto menu - -:handle_conda -where conda >nul 2>&1 || ( - echo δ⵽condaԭ - echo 1. δװMiniconda - echo 2. conda쳣 - timeout /t 10 >nul - goto env_interaction -) - -:conda_menu -echo ѡConda -echo 1 - » -echo 2 - л -echo 3 - ϼ˵ -set /p choice="ѡ(1-3): " - -if "!choice!"=="3" goto env_interaction -if "!choice!"=="2" goto activate_conda -if "!choice!"=="1" goto create_conda - -echo Ч룬1-3֮ -timeout /t 2 >nul -goto conda_menu - -:create_conda -set /p "CONDA_ENV=»ƣ" -if "!CONDA_ENV!"=="" ( - echo ƲΪգ - goto create_conda -) -conda create -n !CONDA_ENV! python=3.13 -y || ( - echo ʧܣ룺!errorlevel! - timeout /t 10 >nul - goto conda_menu -) -goto activate_conda - -:activate_conda -set /p "CONDA_ENV=ҪĻƣ" -call conda activate !CONDA_ENV! || ( - echo ʧܣԭ - echo 1. - echo 2. conda쳣 - pause - goto conda_menu -) -echo ɹconda!CONDA_ENV! -echo Ҫװ -set /p install_confirm="(Y/N): " -if /i "!install_confirm!"=="Y" ( - goto update_dependencies -) -:menu -@chcp 936 -cls -echo Bot̨ v%VERSION% ǰ֧: %BRANCH_COLOR%%BRANCH% -echo ǰPython: !PYTHON_HOME! -echo ====================== -echo 1. ²Bot (Ĭ) -echo 2. ֱBot -echo 3. ý -echo 4. 湤 -echo 5. ˳ -echo ====================== - -set /p choice="ѡ (1-5)»سѡ: " - -if "!choice!"=="" set choice=1 - -if "!choice!"=="1" goto update_and_start -if "!choice!"=="2" goto start_bot -if "!choice!"=="3" goto config_menu -if "!choice!"=="4" goto tools_menu -if "!choice!"=="5" exit /b - -echo Ч룬1-5֮ -timeout /t 2 >nul -goto menu - -:config_menu -@chcp 936 -cls -if not exist config/bot_config.toml ( - copy /Y "template\bot_config_template.toml" "config\bot_config.toml" - -) -if not exist .env.prod ( - copy /Y "template\.env.prod" ".env.prod" -) - -start python webui.py - -goto menu - - -:tools_menu -@chcp 936 -cls -echo ʱй ǰ֧: %BRANCH_COLOR%%BRANCH% -echo ====================== -echo 1. -echo 2. л֧ -echo 3. õǰ֧ -echo 4. ļ -echo 5. ѧϰµ֪ʶ -echo 6. ֪ʶļ -echo 7. ˵ -echo ====================== - -set /p choice="ѡ: " -if "!choice!"=="1" goto update_dependencies -if "!choice!"=="2" goto switch_branch -if "!choice!"=="3" goto reset_branch -if "!choice!"=="4" goto update_config -if "!choice!"=="5" goto learn_new_knowledge -if "!choice!"=="6" goto open_knowledge_folder -if "!choice!"=="7" goto menu - -echo Ч룬1-6֮ -timeout /t 2 >nul -goto tools_menu - -:update_dependencies -cls -echo ڸ... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python.exe -m pip install -r requirements.txt - -echo ɣع˵... -pause -goto tools_menu - -:switch_branch -cls -echo л֧... -echo ǰ֧: %BRANCH% -@REM echo ÷֧: main, debug, stable-dev -echo 1. лmain -echo 2. лmain-fix -echo Ҫлķ֧: -set /p branch_name="֧: " -if "%branch_name%"=="" set branch_name=main -if "%branch_name%"=="main" ( - set "BRANCH_COLOR=" -) else if "%branch_name%"=="main-fix" ( - set "BRANCH_COLOR=" -@REM ) else if "%branch_name%"=="stable-dev" ( -@REM set "BRANCH_COLOR=" -) else if "%branch_name%"=="1" ( - set "BRANCH_COLOR=" - set "branch_name=main" -) else if "%branch_name%"=="2" ( - set "BRANCH_COLOR=" - set "branch_name=main-fix" -) else ( - echo Чķ֧, - timeout /t 2 >nul - goto switch_branch -) - -echo л֧ %branch_name%... -git checkout %branch_name% -echo ֧лɣǰ֧: %BRANCH_COLOR%%branch_name% -set "BRANCH=%branch_name%" -echo ع˵... -pause >nul -goto tools_menu - - -:reset_branch -cls -echo õǰ֧... -echo ǰ֧: !BRANCH! -echo ȷҪõǰ֧ -set /p confirm="(Y/N): " -if /i "!confirm!"=="Y" ( - echo õǰ֧... - git reset --hard !BRANCH! - echo ֧ɣع˵... -) else ( - echo ȡõǰ֧ع˵... -) -pause >nul -goto tools_menu - - -:update_config -cls -echo ڸļ... -echo ȷѱҪݣ޸ĵǰļ -echo 밴Yȡ밴... -set /p confirm="(Y/N): " -if /i "!confirm!"=="Y" ( - echo ڸļ... - python.exe config\auto_update.py - echo ļɣع˵... -) else ( - echo ȡļع˵... -) -pause >nul -goto tools_menu - -:learn_new_knowledge -cls -echo ѧϰµ֪ʶ... -echo ȷѱҪݣ޸ĵǰ֪ʶ⡣ -echo 밴Yȡ밴... -set /p confirm="(Y/N): " -if /i "!confirm!"=="Y" ( - echo ѧϰµ֪ʶ... - python.exe src\plugins\zhishi\knowledge_library.py - echo ѧϰɣع˵... -) else ( - echo ȡѧϰµ֪ʶ⣬ع˵... -) -pause >nul -goto tools_menu - -:open_knowledge_folder -cls -echo ڴ֪ʶļ... -if exist data\raw_info ( - start explorer data\raw_info -) else ( - echo ֪ʶļвڣ - echo ڴļ... - mkdir data\raw_info - timeout /t 2 >nul -) -goto tools_menu - - -:update_and_start -cls -:retry_git_pull -git pull > temp.log 2>&1 -findstr /C:"detected dubious ownership" temp.log >nul -if %errorlevel% equ 0 ( - echo ⵽ֿȨ⣬Զ޸... - git config --global --add safe.directory "%cd%" - echo ⣬git pull... - del temp.log - goto retry_git_pull -) -del temp.log -echo ڸ... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python -m pip install -r requirements.txt && cls - -echo ǰ: -echo HTTP_PROXY=%HTTP_PROXY% -echo HTTPS_PROXY=%HTTPS_PROXY% - -echo Disable Proxy... -set HTTP_PROXY= -set HTTPS_PROXY= -set no_proxy=0.0.0.0/32 - -REM chcp 65001 -python bot.py -echo. -echo BotֹͣУ˵... -pause >nul -goto menu - -:start_bot -cls -echo ڸ... -python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple -python -m pip install -r requirements.txt && cls - -echo ǰ: -echo HTTP_PROXY=%HTTP_PROXY% -echo HTTPS_PROXY=%HTTPS_PROXY% - -echo Disable Proxy... -set HTTP_PROXY= -set HTTPS_PROXY= -set no_proxy=0.0.0.0/32 - -REM chcp 65001 -python bot.py -echo. -echo BotֹͣУ˵... -pause >nul -goto menu - - -:open_dir -start explorer "%cd%" -goto menu +@echo off +@setlocal enabledelayedexpansion +@chcp 936 + +@REM 设置版本号 +set "VERSION=1.0" + +title 麦麦Bot控制台 v%VERSION% + +@REM 设置Python和Git环境变量 +set "_root=%~dp0" +set "_root=%_root:~0,-1%" +cd "%_root%" + + +:search_python +cls +if exist "%_root%\python" ( + set "PYTHON_HOME=%_root%\python" +) else if exist "%_root%\venv" ( + call "%_root%\venv\Scripts\activate.bat" + set "PYTHON_HOME=%_root%\venv\Scripts" +) else ( + echo 正在自动查找Python解释器... + + where python >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where python') do ( + echo %%i | findstr /i /c:"!LocalAppData!\Microsoft\WindowsApps\python.exe" >nul + if errorlevel 1 ( + echo 找到Python解释器:%%i + set "py_path=%%i" + goto :validate_python + ) + ) + ) + set "search_paths=%ProgramFiles%\Git*;!LocalAppData!\Programs\Python\Python*" + for /d %%d in (!search_paths!) do ( + if exist "%%d\python.exe" ( + set "py_path=%%d\python.exe" + goto :validate_python + ) + ) + echo 没有找到Python解释器,要安装吗? + set /p pyinstall_confirm="继续?(Y/n): " + if /i "!pyinstall_confirm!"=="Y" ( + cls + echo 正在安装Python... + winget install --id Python.Python.3.13 -e --accept-package-agreements --accept-source-agreements + if %errorlevel% neq 0 ( + echo 安装失败,请手动安装Python + start https://www.python.org/downloads/ + exit /b + ) + echo 安装完成,正在验证Python... + goto search_python + + ) else ( + echo 取消安装Python,按任意键退出... + pause >nul + exit /b + ) + + echo 错误:未找到可用的Python解释器! + exit /b 1 + + :validate_python + "!py_path!" --version >nul 2>&1 + if %errorlevel% neq 0 ( + echo 无效的Python解释器:%py_path% + exit /b 1 + ) + + :: 提取安装目录 + for %%i in ("%py_path%") do set "PYTHON_HOME=%%~dpi" + set "PYTHON_HOME=%PYTHON_HOME:~0,-1%" +) +if not exist "%PYTHON_HOME%\python.exe" ( + echo Python路径验证失败:%PYTHON_HOME% + echo 请检查Python安装路径中是否有python.exe文件 + exit /b 1 +) +echo 成功设置Python路径:%PYTHON_HOME% + + + +:search_git +cls +if exist "%_root%\tools\git\bin" ( + set "GIT_HOME=%_root%\tools\git\bin" +) else ( + echo 正在自动查找Git... + + where git >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where git') do ( + set "git_path=%%i" + goto :validate_git + ) + ) + echo 正在扫描常见安装路径... + set "search_paths=!ProgramFiles!\Git\cmd" + for /f "tokens=*" %%d in ("!search_paths!") do ( + if exist "%%d\git.exe" ( + set "git_path=%%d\git.exe" + goto :validate_git + ) + ) + echo 没有找到Git,要安装吗? + set /p confirm="继续?(Y/N): " + if /i "!confirm!"=="Y" ( + cls + echo 正在安装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 "download_path=%TEMP%\Git-Installer.exe" + + echo 正在下载Git安装包... + curl -L -o "!download_path!" "!custom_url!" + + if exist "!download_path!" ( + echo 下载成功,开始安装Git... + start /wait "" "!download_path!" /SILENT /NORESTART + ) else ( + echo 下载失败,请手动安装Git + start https://git-scm.com/download/win + exit /b + ) + + del "!download_path!" + echo 临时文件已清理。 + + echo 安装完成,正在验证Git... + where git >nul 2>&1 + if %errorlevel% equ 0 ( + for /f "delims=" %%i in ('where git') do ( + set "git_path=%%i" + goto :validate_git + ) + goto :search_git + + ) else ( + echo 安装完成,但未找到Git,请手动安装Git + start https://git-scm.com/download/win + exit /b + ) + + ) else ( + echo 取消安装Git,按任意键退出... + pause >nul + exit /b + ) + + echo 错误:未找到可用的Git! + exit /b 1 + + :validate_git + "%git_path%" --version >nul 2>&1 + if %errorlevel% neq 0 ( + echo 无效的Git:%git_path% + exit /b 1 + ) + + :: 提取安装目录 + for %%i in ("%git_path%") do set "GIT_HOME=%%~dpi" + set "GIT_HOME=%GIT_HOME:~0,-1%" +) + +:search_mongodb +cls +sc query | findstr /i "MongoDB" >nul +if !errorlevel! neq 0 ( + echo MongoDB服务未运行,是否尝试运行服务? + set /p confirm="是否启动?(Y/N): " + if /i "!confirm!"=="Y" ( + echo 正在尝试启动MongoDB服务... + powershell -Command "Start-Process -Verb RunAs cmd -ArgumentList '/c net start MongoDB'" + echo 正在等待MongoDB服务启动... + echo 按下任意键跳过等待... + timeout /t 30 >nul + sc query | findstr /i "MongoDB" >nul + if !errorlevel! neq 0 ( + echo MongoDB服务启动失败,可能是没有安装,要安装吗? + set /p install_confirm="继续安装?(Y/N): " + if /i "!install_confirm!"=="Y" ( + echo 正在安装MongoDB... + winget install --id MongoDB.Server -e --accept-package-agreements --accept-source-agreements + echo 安装完成,正在启动MongoDB服务... + net start MongoDB + if !errorlevel! neq 0 ( + echo 启动MongoDB服务失败,请手动启动 + exit /b + ) else ( + echo MongoDB服务已成功启动 + ) + ) else ( + echo 取消安装MongoDB,按任意键退出... + pause >nul + exit /b + ) + ) + ) else ( + echo "警告:MongoDB服务未运行,将导致MaiMBot无法访问数据库!" + ) +) else ( + echo MongoDB服务已运行 +) + +@REM set "GIT_HOME=%_root%\tools\git\bin" +set "PATH=%PYTHON_HOME%;%GIT_HOME%;%PATH%" + +:install_maim +if not exist "!_root!\bot.py" ( + cls + echo 你似乎没有安装麦麦Bot,要安装在当前目录吗? + set /p confirm="继续?(Y/N): " + if /i "!confirm!"=="Y" ( + echo 要使用Git代理下载吗? + set /p proxy_confirm="继续?(Y/N): " + if /i "!proxy_confirm!"=="Y" ( + echo 正在安装麦麦Bot... + git clone https://ghfast.top/https://github.com/SengokuCola/MaiMBot + ) else ( + echo 正在安装麦麦Bot... + git clone https://github.com/SengokuCola/MaiMBot + ) + xcopy /E /H /I MaiMBot . >nul 2>&1 + rmdir /s /q MaiMBot + git checkout main-fix + + echo 安装完成,正在安装依赖... + python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple + python -m pip install virtualenv + python -m virtualenv venv + call venv\Scripts\activate.bat + python -m pip install -r requirements.txt + + echo 安装完成,要编辑配置文件吗? + set /p edit_confirm="继续?(Y/N): " + if /i "!edit_confirm!"=="Y" ( + goto config_menu + ) else ( + echo 取消编辑配置文件,按任意键返回主菜单... + ) + ) +) + + +@REM git获取当前分支名并保存在变量里 +for /f "delims=" %%b in ('git symbolic-ref --short HEAD 2^>nul') do ( + set "BRANCH=%%b" +) + +@REM 根据不同分支名给分支名字符串使用不同颜色 +echo 分支名: %BRANCH% +if "!BRANCH!"=="main" ( + set "BRANCH_COLOR=" +) else if "!BRANCH!"=="main-fix" ( + set "BRANCH_COLOR=" +@REM ) else if "%BRANCH%"=="stable-dev" ( +@REM set "BRANCH_COLOR=" +) else ( + set "BRANCH_COLOR=" +) + +@REM endlocal & set "BRANCH_COLOR=%BRANCH_COLOR%" + +:check_is_venv +echo 正在检查虚拟环境状态... +if exist "%_root%\config\no_venv" ( + echo 检测到no_venv,跳过虚拟环境检查 + goto menu +) + +:: 环境检测 +if defined VIRTUAL_ENV ( + goto menu +) + +echo ===================================== +echo 虚拟环境检测警告: +echo 当前使用系统Python路径:!PYTHON_HOME! +echo 未检测到激活的虚拟环境! + +:env_interaction +echo ===================================== +echo 请选择操作: +echo 1 - 创建并激活Venv虚拟环境 +echo 2 - 创建/激活Conda虚拟环境 +echo 3 - 临时跳过本次检查 +echo 4 - 永久跳过虚拟环境检查 +set /p choice="请输入选项(1-4): " + +if "!choice!"=="4" ( + echo 要永久跳过虚拟环境检查吗? + set /p no_venv_confirm="继续?(Y/N): ....." + if /i "!no_venv_confirm!"=="Y" ( + echo 1 > "%_root%\config\no_venv" + echo 已创建no_venv文件 + pause >nul + goto menu + ) else ( + echo 取消跳过虚拟环境检查,按任意键返回... + pause >nul + goto env_interaction + ) +) + +if "!choice!"=="3" ( + echo 警告:使用系统环境可能导致依赖冲突! + timeout /t 2 >nul + goto menu +) + +if "!choice!"=="2" goto handle_conda +if "!choice!"=="1" goto handle_venv + +echo 无效的输入,请输入1-4之间的数字 +timeout /t 2 >nul +goto env_interaction + +:handle_venv +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +echo 正在初始化Venv环境... +python -m pip install virtualenv || ( + echo 安装环境失败,错误码:!errorlevel! + pause + goto env_interaction +) +echo 创建虚拟环境到:venv + python -m virtualenv venv || ( + echo 环境创建失败,错误码:!errorlevel! + pause + goto env_interaction +) + +call venv\Scripts\activate.bat +echo 已激活Venv环境 +echo 要安装依赖吗? +set /p install_confirm="继续?(Y/N): " +if /i "!install_confirm!"=="Y" ( + goto update_dependencies +) +goto menu + +:handle_conda +where conda >nul 2>&1 || ( + echo 未检测到conda,可能原因: + echo 1. 未安装Miniconda + echo 2. conda配置异常 + timeout /t 10 >nul + goto env_interaction +) + +:conda_menu +echo 请选择Conda操作: +echo 1 - 创建新环境 +echo 2 - 激活已有环境 +echo 3 - 返回上级菜单 +set /p choice="请输入选项(1-3): " + +if "!choice!"=="3" goto env_interaction +if "!choice!"=="2" goto activate_conda +if "!choice!"=="1" goto create_conda + +echo 无效的输入,请输入1-3之间的数字 +timeout /t 2 >nul +goto conda_menu + +:create_conda +set /p "CONDA_ENV=请输入新环境名称:" +if "!CONDA_ENV!"=="" ( + echo 环境名称不能为空! + goto create_conda +) +conda create -n !CONDA_ENV! python=3.13 -y || ( + echo 环境创建失败,错误码:!errorlevel! + timeout /t 10 >nul + goto conda_menu +) +goto activate_conda + +:activate_conda +set /p "CONDA_ENV=请输入要激活的环境名称:" +call conda activate !CONDA_ENV! || ( + echo 激活失败,可能原因: + echo 1. 环境不存在 + echo 2. conda配置异常 + pause + goto conda_menu +) +echo 成功激活conda环境:!CONDA_ENV! +echo 要安装依赖吗? +set /p install_confirm="继续?(Y/N): " +if /i "!install_confirm!"=="Y" ( + goto update_dependencies +) +:menu +@chcp 936 +cls +echo 麦麦Bot控制台 v%VERSION% 当前分支: %BRANCH_COLOR%%BRANCH% +echo 当前Python环境: !PYTHON_HOME! +echo ====================== +echo 1. 更新并启动麦麦Bot (默认) +echo 2. 直接启动麦麦Bot +echo 3. 启动麦麦配置界面 +echo 4. 打开麦麦神奇工具箱 +echo 5. 退出 +echo ====================== + +set /p choice="请输入选项数字 (1-5)并按下回车以选择: " + +if "!choice!"=="" set choice=1 + +if "!choice!"=="1" goto update_and_start +if "!choice!"=="2" goto start_bot +if "!choice!"=="3" goto config_menu +if "!choice!"=="4" goto tools_menu +if "!choice!"=="5" exit /b + +echo 无效的输入,请输入1-5之间的数字 +timeout /t 2 >nul +goto menu + +:config_menu +@chcp 936 +cls +if not exist config/bot_config.toml ( + copy /Y "template\bot_config_template.toml" "config\bot_config.toml" + +) +if not exist .env.prod ( + copy /Y "template\.env.prod" ".env.prod" +) + +start python webui.py + +goto menu + + +:tools_menu +@chcp 936 +cls +echo 麦麦时尚工具箱 当前分支: %BRANCH_COLOR%%BRANCH% +echo ====================== +echo 1. 更新依赖 +echo 2. 切换分支 +echo 3. 重置当前分支 +echo 4. 更新配置文件 +echo 5. 学习新的知识库 +echo 6. 打开知识库文件夹 +echo 7. 返回主菜单 +echo ====================== + +set /p choice="请输入选项数字: " +if "!choice!"=="1" goto update_dependencies +if "!choice!"=="2" goto switch_branch +if "!choice!"=="3" goto reset_branch +if "!choice!"=="4" goto update_config +if "!choice!"=="5" goto learn_new_knowledge +if "!choice!"=="6" goto open_knowledge_folder +if "!choice!"=="7" goto menu + +echo 无效的输入,请输入1-6之间的数字 +timeout /t 2 >nul +goto tools_menu + +:update_dependencies +cls +echo 正在更新依赖... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python.exe -m pip install -r requirements.txt + +echo 依赖更新完成,按任意键返回工具箱菜单... +pause +goto tools_menu + +:switch_branch +cls +echo 正在切换分支... +echo 当前分支: %BRANCH% +@REM echo 可用分支: main, debug, stable-dev +echo 1. 切换到main +echo 2. 切换到main-fix +echo 请输入要切换到的分支: +set /p branch_name="分支名: " +if "%branch_name%"=="" set branch_name=main +if "%branch_name%"=="main" ( + set "BRANCH_COLOR=" +) else if "%branch_name%"=="main-fix" ( + set "BRANCH_COLOR=" +@REM ) else if "%branch_name%"=="stable-dev" ( +@REM set "BRANCH_COLOR=" +) else if "%branch_name%"=="1" ( + set "BRANCH_COLOR=" + set "branch_name=main" +) else if "%branch_name%"=="2" ( + set "BRANCH_COLOR=" + set "branch_name=main-fix" +) else ( + echo 无效的分支名, 请重新输入 + timeout /t 2 >nul + goto switch_branch +) + +echo 正在切换到分支 %branch_name%... +git checkout %branch_name% +echo 分支切换完成,当前分支: %BRANCH_COLOR%%branch_name% +set "BRANCH=%branch_name%" +echo 按任意键返回工具箱菜单... +pause >nul +goto tools_menu + + +:reset_branch +cls +echo 正在重置当前分支... +echo 当前分支: !BRANCH! +echo 确认要重置当前分支吗? +set /p confirm="继续?(Y/N): " +if /i "!confirm!"=="Y" ( + echo 正在重置当前分支... + git reset --hard !BRANCH! + echo 分支重置完成,按任意键返回工具箱菜单... +) else ( + echo 取消重置当前分支,按任意键返回工具箱菜单... +) +pause >nul +goto tools_menu + + +:update_config +cls +echo 正在更新配置文件... +echo 请确保已备份重要数据,继续将修改当前配置文件。 +echo 继续请按Y,取消请按任意键... +set /p confirm="继续?(Y/N): " +if /i "!confirm!"=="Y" ( + echo 正在更新配置文件... + python.exe config\auto_update.py + echo 配置文件更新完成,按任意键返回工具箱菜单... +) else ( + echo 取消更新配置文件,按任意键返回工具箱菜单... +) +pause >nul +goto tools_menu + +:learn_new_knowledge +cls +echo 正在学习新的知识库... +echo 请确保已备份重要数据,继续将修改当前知识库。 +echo 继续请按Y,取消请按任意键... +set /p confirm="继续?(Y/N): " +if /i "!confirm!"=="Y" ( + echo 正在学习新的知识库... + python.exe src\plugins\zhishi\knowledge_library.py + echo 学习完成,按任意键返回工具箱菜单... +) else ( + echo 取消学习新的知识库,按任意键返回工具箱菜单... +) +pause >nul +goto tools_menu + +:open_knowledge_folder +cls +echo 正在打开知识库文件夹... +if exist data\raw_info ( + start explorer data\raw_info +) else ( + echo 知识库文件夹不存在! + echo 正在创建文件夹... + mkdir data\raw_info + timeout /t 2 >nul +) +goto tools_menu + + +:update_and_start +cls +:retry_git_pull +git pull > temp.log 2>&1 +findstr /C:"detected dubious ownership" temp.log >nul +if %errorlevel% equ 0 ( + echo 检测到仓库权限问题,正在自动修复... + git config --global --add safe.directory "%cd%" + echo 已添加例外,正在重试git pull... + del temp.log + goto retry_git_pull +) +del temp.log +echo 正在更新依赖... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python -m pip install -r requirements.txt && cls + +echo 当前代理设置: +echo HTTP_PROXY=%HTTP_PROXY% +echo HTTPS_PROXY=%HTTPS_PROXY% + +echo Disable Proxy... +set HTTP_PROXY= +set HTTPS_PROXY= +set no_proxy=0.0.0.0/32 + +REM chcp 65001 +python bot.py +echo. +echo Bot已停止运行,按任意键返回主菜单... +pause >nul +goto menu + +:start_bot +cls +echo 正在更新依赖... +python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple +python -m pip install -r requirements.txt && cls + +echo 当前代理设置: +echo HTTP_PROXY=%HTTP_PROXY% +echo HTTPS_PROXY=%HTTPS_PROXY% + +echo Disable Proxy... +set HTTP_PROXY= +set HTTPS_PROXY= +set no_proxy=0.0.0.0/32 + +REM chcp 65001 +python bot.py +echo. +echo Bot已停止运行,按任意键返回主菜单... +pause >nul +goto menu + + +:open_dir +start explorer "%cd%" +goto menu From e8ea02b866b63145279f923b382ae08c4836ce34 Mon Sep 17 00:00:00 2001 From: KawaiiYusora Date: Tue, 18 Mar 2025 03:54:36 +0800 Subject: [PATCH 28/28] =?UTF-8?q?=F0=9F=94=A7=20fix(bot.py):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=96=87=E4=BB=B6=E8=AF=BB=E5=86=99=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20UTF-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot.py b/bot.py index 3ebfa414d..54193b3d1 100644 --- a/bot.py +++ b/bot.py @@ -208,9 +208,9 @@ def check_eula(): user_input = input().strip().lower() if user_input in ['同意', 'confirmed']: if eula_updated: - eula_confirm_file.write_text(eula_file.read_text()) + eula_confirm_file.write_text(eula_file.read_text(encoding="utf-8"),encoding="utf-8") if privacy_updated: - privacy_confirm_file.write_text(privacy_file.read_text()) + privacy_confirm_file.write_text(privacy_file.read_text(encoding="utf-8"),encoding="utf-8") break else: print('请输入"同意"或"confirmed"以继续运行')