From 9b64b190e0d02fbccaca99ec172aa7bb7f84cebf Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 14:07:30 +0800 Subject: [PATCH 1/7] docs: overhaul EULA and README for clarity and user-friendliness The End User License Agreement (EULA) has been completely rewritten from a formal legal document into a user-friendly Q&A format. This change aims to make the terms of use more accessible and understandable for end-users, clearly outlining their rights and responsibilities. The README.md has been significantly updated to improve structure, readability, and visual appeal. Key changes include: - Restructuring the layout for a more logical flow. - Adding clear, concise tables for system requirements. - Simplifying the quick start and configuration instructions. - Enhancing visual elements with better-formatted badges and centered sections. - Clarifying the project's status as a third-party fork and warning about potential migration issues. --- EULA.md | 167 +++++++++++++++++++----------------------------------- README.md | 166 ++++++++++++++++++++++++++++------------------------- 2 files changed, 149 insertions(+), 184 deletions(-) diff --git a/EULA.md b/EULA.md index f34235dae..bebfedd91 100644 --- a/EULA.md +++ b/EULA.md @@ -1,143 +1,94 @@ -# **MoFox_Bot最终用户许可协议** -**版本:V1.1** -**更新日期:2025年8月26日** -**生效日期:2025年8月26日** -**适用的MoFox_Bot版本号:所有版本** +# **欢迎使用 MoFox_Bot (第三方修改版)!** -**2025© MoFox_Bot项目团队** +**版本:V2.1** +**更新日期:2025年8月30日** --- -## 一、一般条款 +你好!感谢你选择 MoFox_Bot。在开始之前,请花几分钟时间阅读这份协议。我们用问答的形式,帮助你快速了解使用这个**第三方修改版**软件时,你的权利和责任。 -**1.1** MoFox_Bot项目(包括MoFox_Bot的源代码、可执行文件、文档,以及其它在本协议中所列出的文件)(以下简称“本项目”)是由开发者及贡献者(以下简称“项目团队”)共同维护,为用户提供自动回复功能的机器人代码项目。以下最终用户许可协议(EULA,以下简称“本协议”)是用户(以下简称“您”)与项目团队之间关于使用本项目所订立的合同条件。 +**简单来说,你需要同意这份协议才能使用我们的软件。** 如果你是未成年人,请确保你的监护人也阅读并同意了哦。 -**1.2** 在运行或使用本项目之前,您**必须阅读并同意本协议的所有条款**。未成年人或其它无/不完全民事行为能力责任人请**在监护人的陪同下**阅读并同意本协议。如果您不同意,则不得运行或使用本项目。在这种情况下,您应立即从您的设备上卸载或删除本项目及其所有副本。 +--- +### **1. 这个软件和原版有什么关系?** -## 二、许可授权 +这是一个非常重要的问题! -### 源代码许可 -**2.1** 您**了解**本项目的源代码是基于GPLv3(GNU通用公共许可证第三版)开源协议发布的。您**可以自由使用、修改、分发**本项目的源代码,但**必须遵守**GPLv3许可证的要求。详细内容请参阅项目仓库中的LICENSE文件。 +* **第三方修改版**:首先,你需要清楚地知道,MoFox_Bot 是一个基于[MaiCore](https://mai-mai.org/)开源项目的**第三方修改版**。我们(MoFox_Bot 团队)与原始项目的开发者**没有任何关联**。 +* **独立维护**:我们独立负责这个修改版的维护、开发和更新。因此,原始项目的开发者**不会**为 MoFox_Bot 提供任何技术支持,也**不会**对因使用本修改版产生的任何问题负责。 +* **责任划分**:我们只对我们修改、添加的功能负责。对于原始代码中可能存在的任何问题,我们不承担责任。 -**2.2** 您**了解**本项目的源代码中可能包含第三方开源代码,这些代码的许可证可能与GPLv3许可证不同。您**同意**在使用这些代码时**遵守**相应的许可证要求。 +--- +### **2. 这个软件是免费和开源的吗?** -### 输入输出内容授权 +**是的,核心代码是开源的!** -**2.3** 您**了解**本项目是使用您的配置信息、提交的指令(以下简称“输入内容”)和生成的内容(以下简称“输出内容”)构建请求发送到第三方API生成回复的机器人项目。 +* **遵循开源协议**:本项目继承了原始项目的 **GPLv3 开源协议**。这意味着你可以自由地使用、复制、研究、修改和重新分发它。 +* **你的义务**:当你修改或分发这个软件时,你同样需要遵守 GPLv3 协议的要求,确保你的衍生作品也是开源的。你可以在项目根目录找到 `LICENSE` 文件来了解更多细节。 +* **包含第三方代码**:请注意,项目中可能还包含了其他第三方库或组件,它们各自有独立的开源许可证。你在使用时需要同时遵守这些许可证。 -**2.4** 您**授权**本项目使用您的输入和输出内容按照项目的隐私政策用于以下行为: - - 调用第三方API生成回复; - - 调用第三方API用于构建本项目专用的存储于您部署或使用的数据库中的知识库和记忆库; - - 收集并记录本项目专用的存储于您部署或使用的设备中的日志; +--- -**2.5** 您**了解**本项目的源代码中包含第三方API的调用代码,这些API的使用可能受到第三方的服务条款和隐私政策的约束。在使用这些API时,您**必须遵守**相应的服务条款。 +### **3. 我的个人数据是如何被处理的?** -**2.6** 项目团队**不对**第三方API的服务质量、稳定性、准确性、安全性负责,亦**不对**第三方API的服务变更、终止、限制等行为负责。 +你的隐私对我们很重要。了解数据如何流动,能帮助你更好地保护自己。 +* **工作流程**:当你与机器人互动时,你的**输入内容**(比如文字、指令)、**配置信息**以及机器人**生成的回复**,会被发送给第三方的 API 服务(例如 OpenAI、Google 等大语言模型提供商)以获得智能回复。 +* **你的明确授权**:一旦你开始使用,即表示你授权我们利用你的数据进行以下操作: + 1. **调用外部 API**:这是机器人能与你对话的核心。 + 2. **建立本地知识库与记忆**:为了让机器人更个性化、更懂你,软件会在**你自己的设备上**创建和存储知识库、记忆库和对话日志。**这些数据存储在本地,我们无法访问。** + 3. **记录本地日志**:为了方便排查可能出现的技术问题,软件会在你的设备上记录运行日志。 +* **第三方服务的风险**:我们无法控制第三方 API 提供商的服务质量、数据处理政策、稳定性或安全性。使用这些服务时,你同样受到该第三方服务条款和隐私政策的约束。我们建议你自行了解这些条款。 -### 插件系统授权和责任免责 +--- -**2.7** 您**了解**本项目包含插件系统功能,允许加载和使用由第三方开发者(非MoFox_Bot核心开发组成员)开发的插件。这些第三方插件可能具有独立的许可证条款和使用协议。 +### **4. 关于强大的插件系统,我需要了解什么?** -**2.8** 您**了解并同意**: - - 第三方插件的开发、维护、分发由其各自的开发者负责,**与MaiBot项目团队无关**; - - 第三方插件的功能、质量、安全性、合规性**完全由插件开发者负责**; - - MoFox_Bot项目团队**仅提供**插件系统的技术框架,**不对**任何第三方插件的内容、行为或后果承担责任; - - 您使用任何第三方插件的风险**完全由您自行承担**; +MoFox_Bot 通过插件系统实现功能扩展,但这需要你承担相应的责任。 -**2.9** 在使用第三方插件前,您**应当**: - - 仔细阅读并遵守插件开发者提供的许可证条款和使用协议; - - 自行评估插件的安全性、合规性和适用性; - - 确保插件的使用符合您所在地区的法律法规要求; +* **谁开发的插件?**:绝大多数插件是由**社区里的第三方开发者**创建和维护的,他们并**不是 MoFox_Bot 核心团队的成员**。 +* **责任完全自负**:插件的功能、质量、安全性和合法性**完全由其各自的开发者负责**。我们只提供了一个能让插件运行的技术平台,但**不对任何第三方插件的内容、行为或造成的后果承担任何责任**。 +* **你的使用风险**:使用任何第三方插件的风险**完全由你自行承担**。在安装和使用插件前,我们强烈建议你: + * 仔细阅读并理解插件开发者提供的许可协议和说明文档。 + * **只从你完全信任的来源获取和安装插件**。 + * 自行评估插件的安全性、合法性及其对你数据隐私的影响。 +--- -## 三、用户行为 +### **5. 我在使用时,有哪些行为准则?** -**3.1** 您**了解**本项目会将您的配置信息、输入指令和生成内容发送到第三方API,您**不应**在输入指令和生成内容中包含以下内容: - - 涉及任何国家或地区秘密、商业秘密或其他可能会对国家或地区安全或者公共利益造成不利影响的数据; - - 涉及个人隐私、个人信息或其他敏感信息的数据; - - 任何侵犯他人合法权益的内容; - - 任何违反国家或地区法律法规、政策规定的内容; +请务必合法、合规地使用本软件。 -**3.2** 您**不应**将本项目用于以下用途: - - 违反任何国家或地区法律法规、政策规定的行为; +* **禁止内容**:严禁输入、处理或传播任何违反你所在地法律法规的内容,包括但不限于:涉及国家秘密、商业机密、侵犯他人知识产权、个人隐私的内容,以及任何形式的非法、骚扰、诽谤、淫秽信息。 +* **合法用途**:你承诺不会将本项目用于任何非法目的或活动,例如网络攻击、诈骗等。 +* **数据安全**:你对自己存储在本地知识库、记忆库和日志中的所有内容的合法性负全部责任。 +* **插件规范**:不要使用任何已知包含恶意代码、安全漏洞或违法内容的插件。 -**3.3** 您**应当**自行确保您被存储在本项目的知识库、记忆库和日志中的输入和输出内容的合法性与合规性以及存储行为的合法性与合规性。您需**自行承担**由此产生的任何法律责任。 +**你将对自己使用本项目(包括所有第三方插件)的全部行为及其产生的一切后果,承担完全的法律责任。** -**3.4** 对于第三方插件的使用,您**不应**: - - 使用可能存在安全漏洞、恶意代码或违法内容的插件; - - 通过插件进行任何违反法律法规的行为; - - 将插件用于侵犯他人权益或危害系统安全的用途; +--- -**3.5** 您**承诺**对使用第三方插件的行为及其后果承担**完全责任**,包括但不限于因插件缺陷、恶意行为或不当使用造成的任何损失或法律纠纷。 +### **6. 免责声明(非常重要!)** +* **“按原样”提供**:本项目是“按原样”提供的,我们**不提供任何形式的明示或暗示的担保**,包括但不限于对适销性、特定用途适用性和不侵权的保证。 +* **AI 回复的立场**:机器人的所有回复均由第三方大语言模型生成,其观点和信息**不代表 MoFox_Bot 团队的立场**。我们不对其准确性、完整性或可靠性负责。 +* **无责任声明**:在任何情况下,MoFox_Bot 团队均不对因使用或无法使用本项目(特别是第三方插件)而导致的任何直接、间接、偶然、特殊或后果性的损害(包括但不限于数据丢失、利润损失、业务中断)承担责任。 +* **插件支持**:所有第三方插件的技术支持、功能更新和 bug 修复,都应**直接联系相应的插件开发者**。 +--- -## 四、免责条款 +### **7. 其他条款** -**4.1** 本项目的输出内容依赖第三方API,**不受**项目团队控制,亦**不代表**项目团队的观点。 +* **协议的修改**:我们保留随时修改本协议的权利。修改后的协议将在新版本发布时生效。我们建议你定期检查以获取最新版本。继续使用本项目即表示你接受修订后的协议。 +* **最终解释权**:在法律允许的范围内,MoFox_Bot 团队保留对本协议的最终解释权。 +* **适用法律**:本协议的订立、执行和解释及争议的解决均应适用中国法律。 -**4.2** 除本协议条目2.4提到的隐私政策之外,项目团队**不会**对您提供任何形式的担保,亦**不对**使用本项目的造成的任何后果负责。 +--- -**4.3** 关于第三方插件,项目团队**明确声明**: - - 项目团队**不对**任何第三方插件的功能、安全性、稳定性、合规性或适用性提供任何形式的保证或担保; - - 项目团队**不对**因使用第三方插件而产生的任何直接或间接损失、数据丢失、系统故障、安全漏洞、法律纠纷或其他后果承担责任; - - 第三方插件的质量问题、技术支持、bug修复等事宜应**直接联系插件开发者**,与项目团队无关; - - 项目团队**保留**在不另行通知的情况下,对插件系统功能进行修改、限制或移除的权利; +### **风险提示(请再次确认你已理解!)** -## 五、其他条款 - -**5.1** 项目团队有权**随时修改本协议的条款**,但**没有**义务通知您。修改后的协议将在本项目的新版本中生效,您应定期检查本协议的最新版本。 - -**5.2** 项目团队**保留**本协议的最终解释权。 - - -## 附录:其他重要须知 - -### 一、过往版本使用条件追溯 - -**1.1** 对于本项目此前未配备 EULA 协议的版本,自本协议发布之日起,若用户希望继续使用本项目,应在本协议生效后的合理时间内,通过升级到最新版本并同意本协议全部条款。若在本版协议生效日(2025年8月26日)之后,用户仍使用此前无 EULA 协议的项目版本且未同意本协议,则用户无权继续使用,项目方有权采取措施阻止其使用行为,并保留追究相关法律责任的权利。 - - -### 二、风险提示 - -**2.1 隐私安全风险** - - - 本项目会将您的配置信息、输入指令和生成内容发送到第三方API,而这些API的服务质量、稳定性、准确性、安全性不受项目团队控制。 - - 本项目会收集您的输入和输出内容,用于构建本项目专用的知识库和记忆库,以提高回复的准确性和连贯性。 - - **因此,为了保障您的隐私信息安全,请注意以下事项:** - - - 避免在涉及个人隐私、个人信息或其他敏感信息的环境中使用本项目; - - 避免在不可信的环境中使用本项目; - -**2.2 精神健康风险** - -本项目仅为工具型机器人,不具备情感交互能力。建议用户: - - 避免过度依赖AI回复处理现实问题或情绪困扰; - - 如感到心理不适,请及时寻求专业心理咨询服务。 - - 如遇心理困扰,请寻求专业帮助(全国心理援助热线:12355)。 - -**2.3 第三方插件风险** - -本项目的插件系统允许加载第三方开发的插件,这可能带来以下风险: - - **安全风险**:第三方插件可能包含恶意代码、安全漏洞或未知的安全威胁; - - **稳定性风险**:插件可能导致系统崩溃、性能下降或功能异常; - - **隐私风险**:插件可能收集、传输或泄露您的个人信息和数据; - - **合规风险**:插件的功能或行为可能违反相关法律法规或平台规则; - - **兼容性风险**:插件可能与主程序或其他插件产生冲突; - - **因此,在使用第三方插件时,请务必:** - - - 仅从可信来源获取和安装插件; - - 在安装前仔细了解插件的功能、权限和开发者信息; - - 定期检查和更新已安装的插件; - - 如发现插件异常行为,请立即停止使用并卸载; - - 对插件的使用后果承担完全责任; - -### 三、其他 -**3.1 争议解决** - - 本协议适用中国法律,争议提交相关地区法院管辖; - - 若因GPLv3许可产生纠纷,以许可证官方解释为准。 +* **隐私风险**:你的对话数据会被发送到不受我们控制的第三方 API。请**绝对不要**在对话中包含任何个人身份信息、财务信息、密码或其他敏感数据。 +* **精神健康风险**:AI 机器人只是一个程序,无法提供真正的情感支持或专业的心理建议。如果遇到任何心理困扰,请务必寻求专业人士的帮助(例如,全国心理援助热线:12355)。 +* **插件风险**:这是最大的风险之一。第三方插件可能带来严重的安全漏洞、系统不稳定、性能下降甚至隐私数据泄露的风险。请务必谨慎选择和使用,并为自己的选择承担全部后果。 diff --git a/README.md b/README.md index 698bba594..3cc28fbe2 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,60 @@
-# 🌟 麦麦Fork!MoFox_Bot +# 🌟 MoFox_Bot + +**🚀 基于 MaiCore 的增强版 AI 智能体,提供更完善的功能和更好的使用体验**

- 🚀 基于 MaiCore 的增强版智能体,提供更完善的功能和更好的使用体验 + + Python + + + License + + + Contributors + + + Stars + + + Release +

-
- -[![Python](https://img.shields.io/badge/Python-3.10+-3776ab?logo=python&logoColor=white&style=for-the-badge)](https://www.python.org/) -[![License](https://img.shields.io/badge/License-GPLv3-d73a49?logo=gnu&logoColor=white&style=for-the-badge)](https://github.com/MoFox-Studio/MoFox_Bot/blob/master/LICENSE) -[![Contributors](https://img.shields.io/badge/Contributors-Welcome-brightgreen?logo=github&logoColor=white&style=for-the-badge)](https://github.com/MoFox-Studio/MoFox_Bot/graphs/contributors) -[![Stars](https://img.shields.io/github/stars/MoFox-Studio/MoFox_Bot?style=for-the-badge&logo=star&logoColor=white&color=yellow&label=Stars)](https://github.com/MoFox-Studio/MoFox_Bot/stargazers) -[![Release](https://img.shields.io/github/v/release/MoFox-Studio/MoFox_Bot?style=for-the-badge&logo=github&logoColor=white&color=orange)](https://github.com/MoFox-Studio/MoFox_Bot/releases) -[![QQ](https://img.shields.io/badge/QQ-Bot-blue?style=for-the-badge&logo=tencentqq&logoColor=white)](https://github.com/NapNeko/NapCatQQ) -
--- +
+ ## 📖 项目介绍 -**MoFox_Bot** 是基于 MaiCore 的增强版智能体,在保留原版 `0.10.0 snapshot.5` 所有功能的基础上,提供了更完善的功能、更好的稳定性和更丰富的使用体验。 +**MoFox_Bot** 是一个基于 [MaiCore](https://github.com/MaiM-with-u/MaiBot) `0.10.0 snapshot.5` 版本的增强型 `fork` 项目。 +我们在保留原版所有功能的基础上,进行了一系列的改进和功能拓展,致力于提供更强的稳定性、更丰富的功能和更流畅的用户体验。 > [!IMPORTANT] -> **请注意!** 这个版本的所有后续更新均为我们的第三方更新,不代表 MaiBot 官方立场 +> **第三方项目声明** +> +> 本项目是由 **MoFox Studio** 独立维护的第三方项目,并非 MaiBot 官方版本。 +> 所有后续更新和维护均由我们团队负责,与 MaiBot 官方无直接关系。 > [!WARNING] -> **迁移提醒!** 从官方版本到 MoFox_Bot 版本迁移暂时存在问题,因为数据库结构有改变 +> **迁移风险提示** +> +> 由于我们对数据库结构进行了重构和优化,从 MaiBot 官方版本直接迁移到 MoFox_Bot **可能会遇到数据不兼容的问题**。 +> 在迁移前,请务必做好数据备份。 + +
--- +
+ ## ✨ 功能特性 +
+
@@ -68,114 +90,106 @@
--- + +
+ ## 🔧 系统要求 -在开始使用之前,请确保你的系统满足以下要求: +### 💻 基础环境 - - - - - -
- -### 💻 基础要求 - -| 项目 | 要求 | -|------|------| -| 🖥️ **操作系统** | Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+) | -| 🐍 **Python 版本** | Python 3.10 或更高版本 | -| 💾 **内存** | 建议 4GB 以上可用内存 | -| 💿 **存储空间** | 至少 2GB 可用空间 | - -
- - - - + - -
+| 项目 | 要求 | +| ------------ | ---------------------------------------------------- | +| 🖥️ 操作系统 | Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+) | +| 🐍 Python 版本 | Python 3.10 或更高版本 | +| 💾 内存 | 建议 4GB 以上可用内存 | +| 💿 存储空间 | 至少 2GB 可用空间 | ### 🛠️ 依赖服务 -| 服务 | 描述 | -|------|------| -| 🤖 **QQ协议端** | [NapCat](https://github.com/NapNeko/NapCatQQ) 或其他兼容协议端 | -| 🗃️ **数据库** | SQLite (内置) 或 MySQL (可选) | -| 🔧 **管理工具** | chat2db (可选) | +| 服务 | 描述 | +| ------------ | ------------------------------------------ | +| 🤖 QQ 协议端 | [NapCatQQ](https://github.com/NapNeko/NapCatQQ) 或其他兼容协议端 | +| 🗃️ 数据库 | SQLite (内置) 或 MySQL (可选) | +| 🔧 管理工具 | Chat2DB (可选,用于数据库管理) | -
--- +
+ ## 🏁 快速开始 -### 📦 安装部署 +### 📦 安装与部署 + +
```bash -# 克隆项目 +# 1. 克隆项目到本地 git clone https://github.com/MoFox-Studio/MoFox_Bot.git cd MoFox_Bot -# 安装依赖 +# 2. 安装依赖 pip install -r requirements.txt -# 配置机器人 +# 3. 配置机器人 +# 首先,复制配置文件模板 cp config/bot_config.toml.example config/bot_config.toml -# 编辑配置文件... +# 然后,根据你的需求编辑 config/bot_config.toml 文件 -# 启动机器人 +# 4. 启动机器人 python bot.py ``` -### ⚙️ 配置说明 +
-1. 📝 **编辑配置文件** - 修改 `config/bot_config.toml` 中的基本设置 -2. 🤖 **配置协议端** - 设置 NapCat 或其他兼容的 QQ 协议端 -3. 🗃️ **数据库配置** - 选择 SQLite 或 MySQL 作为数据存储 -4. 🔌 **插件配置** - 在 `config/plugins/` 目录下配置所需插件 +### ⚙️ 配置要点 + +1. 📝 **核心配置**: 修改 `config/bot_config.toml` 中的基础设置,如 LLM API Key 等。 +2. 🤖 **协议端配置**: 设置 NapCatQQ 或其他兼容的 QQ 协议端,确保通信正常。 +3. 🗃️ **数据库配置**: 根据需求选择 SQLite 或配置你的 MySQL 服务器。 +4. 🔌 **插件配置**: 在 `config/plugins/` 目录下按需配置插件。 + +
--- +
## 🙏 致谢 -我们衷心感谢以下优秀的开源项目: +我们衷心感谢以下优秀的开源项目,没有它们,就没有 MoFox_Bot。 -
- -| 项目 | 描述 | 贡献 | -|------|------|------| -| 🎯 [MaiM-with-u](https://github.com/MaiM-with-u/MaiBot) | 原版 MaiBot 项目 | 提供优秀的基础框架 | -| 🐱 [NapCat](https://github.com/NapNeko/NapCatQQ) | 基于 NTQQ 的 Bot 协议端 | 现代化的 QQ 协议实现 | -| 🌌 [Maizone](https://github.com/internetsb/Maizone) | 魔改空间插件 | 插件部分功能借鉴 | +| 项目 | 描述 | 贡献 | +| ------------------------------------------ | -------------------- | ---------------- | +| 🎯 [MaiM-with-u/MaiBot](https://github.com/MaiM-with-u/MaiBot) | 原版 MaiBot 项目 | 提供优秀的基础框架 | +| 🐱 [NapNeko/NapCatQQ](https://github.com/NapNeko/NapCatQQ) | 基于 NTQQ 的 Bot 协议端 | 现代化的 QQ 协议实现 | +| 🌌 [internetsb/Maizone](https://github.com/internetsb/Maizone) | 魔改空间插件 | 插件部分功能借鉴 |
--- +
+ ## ⚠️ 注意事项 -
- > [!CAUTION] > **重要提醒** -> -> 使用本项目前必须阅读和同意 [📋 用户协议](EULA.md) 和 [🔒 隐私协议](PRIVACY.md) -> -> 本应用生成内容来自人工智能模型,由 AI 生成,请仔细甄别,请勿用于违反法律的用途 -> -> AI 生成内容不代表本项目团队的观点和立场 +> +> - 使用本项目前,你必须阅读并同意 [**📋 用户协议 (EULA.md)**](EULA.md)。 +> - 本应用生成的内容来自人工智能大模型,请仔细甄别其准确性,并请勿用于任何违反法律法规的用途。 +> - AI 生成的所有内容不代表本项目团队的任何观点和立场。
--- -## 📄 开源协议 -
-**本项目基于 [GPL-3.0](LICENSE) 协议开源** +## 📄 开源协议 + +本项目基于 **[GPL-3.0](LICENSE)** 协议开源。 [![GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg?style=for-the-badge&logo=gnu)](LICENSE) @@ -192,8 +206,8 @@ Licensed under the GNU General Public License v3.0 **🌟 如果这个项目对你有帮助,请给我们一个 Star!** -**💬 有问题或建议?欢迎提 Issue 或 PR!** +**💬 有任何问题或建议?欢迎提交 Issue 或 Pull Request!** -Made with ❤️ by [MoFox Studio](https://github.com/MoFox-Studio) +*Made with ❤️ by [MoFox Studio](https://github.com/MoFox-Studio)*
From 91d1efcd1f676dd7d21d9244af25871e97c63194 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 14:15:39 +0800 Subject: [PATCH 2/7] =?UTF-8?q?docs:=20=E9=87=8D=E6=9E=84=E5=B9=B6?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E9=9A=90=E7=A7=81=E6=9D=A1=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将隐私条款(PRIVACY.md)的语言风格从法律化、复杂的格式重构为更易于普通用户理解的口语化说明。 - 使用更清晰的标题和项目符号来组织内容。 - 简化了关于数据处理、第三方插件和责任的措辞。 - 更新了文档的更新日期和版权年份。 --- PRIVACY.md | 54 +++++++++++++++++++++++++++++++++++++----------------- README.md | 4 ++-- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index 3a1d19515..ba09ce0d9 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,28 +1,48 @@ -### MoFox_Bot用户隐私条款 -**版本:V1.1** -**更新日期:2025年8月26日** +### MoFox_Bot 隐私说明 + +**版本:** 1.1 +**更新于: 2025年8月30日** **生效日期:2025年8月26日** **适用的MoFox_Bot版本号:所有版本** -**2025© MoFox_Bot项目团队** +**2025© MoFox_Bot项目团队* -MaiBot项目团队(以下简称项目团队)**尊重并保护**用户(以下简称您)的隐私。若您选择使用MoFox_Bot项目(以下简称本项目),则您需同意本项目按照以下隐私条款处理您的输入和输出内容: +我们(MoFox_Bot 项目团队)非常重视您的隐私。当您使用 MoFox_Bot 时,代表您同意我们按照本说明处理您的信息。 -**1.1** 本项目**会**收集您的输入和输出内容并发送到第三方API,用于生成新的输出内容。因此您的输入和输出内容**会**同时受到本项目和第三方API的隐私政策约束。 +--- -**1.2** 本项目**会**收集您的输入和输出内容,用于构建本项目专用的仅存储在您使用的数据库中的知识库和记忆库,以提高回复的准确性和连贯性。 +#### 我们如何处理您的信息? -**1.3** 本项目**会**收集您的输入和输出内容,用于生成仅存储于您部署或使用的设备中的不会上传至互联网的日志。但当您向项目团队反馈问题时,项目团队可能需要您提供日志文件以帮助解决问题。 +1. **对话内容与第三方服务** + * 为了让机器人回复您,我们会将您的对话内容发送给第三方 AI 服务(比如 OpenAI、Google 等)。 + * 因此,您的对话会同时受到我们的隐私说明和第三方服务隐私政策的约束。 -**1.4** 本项目可能**会**收集部分统计信息(如使用频率、基础指令类型)以改进服务,您可在[bot_config.toml]中随时关闭此功能**。 +2. **本地知识库与记忆** + * 我们会在您自己的设备上,利用您的对话内容来构建专属的知识库和记忆库。 + * 这样做能让机器人的回复更贴切、更连贯。这些数据**只会存储在您的本地**。 -**1.5** 关于第三方插件的隐私处理: - - 本项目包含插件系统,允许加载第三方开发者开发的插件; - - **第三方插件可能会**收集、处理、存储或传输您的数据,这些行为**完全由插件开发者控制**,与项目团队无关; - - 项目团队**无法监控或控制**第三方插件的数据处理行为,亦**无法保证**第三方插件的隐私安全性; - - 第三方插件的隐私政策**由插件开发者负责制定和执行**,您应直接向插件开发者了解其隐私处理方式; - - 您使用第三方插件时,**需自行评估**插件的隐私风险并**自行承担**相关后果; +3. **本地日志文件** + * 我们会在您的设备上记录程序运行日志,用于排查问题。这些日志**不会上传到网络**。 + * 只有当您需要技术支持并主动将日志文件发送给我们时,我们才会看到这些信息。 -**1.6** 由于您的自身行为或不可抗力等情形,导致上述可能涉及您隐私或您认为是私人信息的内容发生被泄露、批漏,或被第三方获取、使用、转让等情形的,均由您**自行承担**不利后果,我们对此**不承担**任何责任。**特别地,因使用第三方插件而导致的任何隐私泄露或数据安全问题,项目团队概不负责。** +--- -**1.7** 项目团队保留在未来更新隐私条款的权利,但没有义务通知您。若您不同意更新后的隐私条款,您应立即停止使用本项目。 \ No newline at end of file +#### 关于第三方插件 + +* **请注意:** 您可以为 MoFox_Bot 安装由其他开发者制作的“插件”。 +* 这些插件可能会收集、处理或发送您的数据。**它们的行为由插件开发者决定,我们无法控制。** +* 我们无法保证第三方插件的安全性。在使用前,请务必了解其独立的隐私政策。 +* **因使用第三方插件导致的任何隐私风险,需要您自行承担。** + +--- + +#### 责任声明 + +* 如果因为您自己的操作、或者其他不可抗力因素导致您的信息泄露,您需要自行承担后果,我们不承担责任。 +* **再次强调:** 对于因使用**第三方插件**而产生的任何隐私或数据安全问题,我们概不负责。 + +--- + +#### 条款更新 + +* 我们将来可能会更新本隐私说明。如果我们更新了,您继续使用就代表您同意新的条款。如果您不同意,请停止使用。 \ No newline at end of file diff --git a/README.md b/README.md index 3cc28fbe2..d45e86c43 100644 --- a/README.md +++ b/README.md @@ -194,8 +194,8 @@ python bot.py [![GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg?style=for-the-badge&logo=gnu)](LICENSE) ``` -Copyright © 2024 MoFox Studio -Licensed under the GNU General Public License v3.0 + Copyright © 2025 MoFox Studio + Licensed under the GNU General Public License v3.0 ```
From 0e73b2643e5e0575d3fcb783598f1298c31c62e9 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 14:21:59 +0800 Subject: [PATCH 3/7] ruff ci --- plugins/bilibli/bilibli_base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/bilibli/bilibli_base.py b/plugins/bilibli/bilibli_base.py index 66dc2697e..2fcd87934 100644 --- a/plugins/bilibli/bilibli_base.py +++ b/plugins/bilibli/bilibli_base.py @@ -8,8 +8,6 @@ Bilibili 工具基础模块 import re import aiohttp import asyncio -import tempfile -import os from typing import Optional, Dict, Any from src.common.logger import get_logger from src.chat.utils.utils_video import get_video_analyzer From a33e323927d63335c658fcf545fbeca509cec1d4 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 14:41:33 +0800 Subject: [PATCH 4/7] =?UTF-8?q?docs:=20=E7=AE=80=E5=8C=96=20README=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=AE=89=E8=A3=85=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将详细的安装和配置步骤移至官方文档,并在 README 中提供直接链接。这使得 README 更加简洁,并引导用户访问最新的、更全面的部署指南。 --- README.md | 20 ++---- .../built_in/set_typing_status/_manifest.json | 16 +++++ .../built_in/set_typing_status/plugin.py | 64 +++++++++++++++++++ 3 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 src/plugins/built_in/set_typing_status/_manifest.json create mode 100644 src/plugins/built_in/set_typing_status/plugin.py diff --git a/README.md b/README.md index d45e86c43..9ae8ca7e6 100644 --- a/README.md +++ b/README.md @@ -124,22 +124,10 @@
-```bash -# 1. 克隆项目到本地 -git clone https://github.com/MoFox-Studio/MoFox_Bot.git -cd MoFox_Bot - -# 2. 安装依赖 -pip install -r requirements.txt - -# 3. 配置机器人 -# 首先,复制配置文件模板 -cp config/bot_config.toml.example config/bot_config.toml -# 然后,根据你的需求编辑 config/bot_config.toml 文件 - -# 4. 启动机器人 -python bot.py -``` +> [!NOTE] +> 详细的安装和配置步骤,请务必参考我们的官方文档: +> * **Windows 用户部署指南**: [https://mofox-studio.github.io/MoFox-Bot-Docs/docs/deployment_guide.html](https://mofox-studio.github.io/MoFox-Bot-Docs/docs/deployment_guide.html) +> * **`bot_config.toml` 究极详细教程**: [https://mofox-studio.github.io/MoFox-Bot-Docs/docs/guides/bot_config_guide.html](https://mofox-studio.github.io/MoFox-Bot-Docs/docs/guides/bot_config_guide.html)
diff --git a/src/plugins/built_in/set_typing_status/_manifest.json b/src/plugins/built_in/set_typing_status/_manifest.json new file mode 100644 index 000000000..d3914ea48 --- /dev/null +++ b/src/plugins/built_in/set_typing_status/_manifest.json @@ -0,0 +1,16 @@ +{ + "name": "Set Typing Status", + "description": "一个在LLM生成回复时设置私聊输入状态的插件。", + "version": "1.0.0", + "author": { + "name": "Kilo Code" + }, + "license": "MIT", + "homepage_url": "", + "repository_url": "", + "keywords": ["typing", "status", "private chat"], + "categories": ["utility"], + "host_application": { + "min_version": "1.0.0" + } +} \ No newline at end of file diff --git a/src/plugins/built_in/set_typing_status/plugin.py b/src/plugins/built_in/set_typing_status/plugin.py new file mode 100644 index 000000000..a88fe1390 --- /dev/null +++ b/src/plugins/built_in/set_typing_status/plugin.py @@ -0,0 +1,64 @@ +from typing import List, Tuple, Type +import logging + +from src.plugin_system import ( + BasePlugin, + register_plugin, + ComponentInfo, + BaseEventHandler, + EventType, +) +from src.plugin_system.base.base_event import HandlerResult +from src.plugin_system.apis import send_api + +logger = logging.getLogger(__name__) + + +class SetTypingStatusHandler(BaseEventHandler): + """在LLM处理私聊消息后设置“正在输入”状态的事件处理器。""" + + handler_name = "set_typing_status_handler" + handler_description = "在LLM生成回复后,将用户的聊天状态设置为“正在输入”。" + init_subscribe = [EventType.POST_LLM] + + async def execute(self, params: dict) -> HandlerResult: + message = params.get("message") + if not message or not message.is_private_message: + return HandlerResult(success=True, continue_process=True) + + user_id = message.message_info.user_info.user_id + if not user_id: + return HandlerResult(success=False, continue_process=True, message="无法获取用户ID") + + try: + params = {"user_id": user_id,"event_type": 1} + await send_api.adapter_command_to_stream( + action="set_input_status", + params=params, + stream_id=message.stream_id, + ) + logger.debug(f"成功为用户 {user_id} 设置“正在输入”状态。") + return HandlerResult(success=True, continue_process=True) + except Exception as e: + logger.error(f"为用户 {user_id} 设置“正在输入”状态时出错: {e}") + return HandlerResult(success=False, continue_process=True, message=str(e)) + + +@register_plugin +class SetTypingStatusPlugin(BasePlugin): + """一个在LLM生成回复时设置私聊输入状态的插件。""" + + plugin_name = "set_typing_status" + enable_plugin = True + dependencies = [] + python_dependencies = [] + config_file_name = "" + + config_schema = {} + + def get_plugin_components(self) -> List[Tuple[ComponentInfo, Type]]: + """注册插件的功能组件。""" + return [(SetTypingStatusHandler.get_handler_info(), SetTypingStatusHandler)] + + def register_plugin(self) -> bool: + return True From 4285046f385b4536c001cf68672262bf63a8d473 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 14:43:39 +0800 Subject: [PATCH 5/7] =?UTF-8?q?chore(plugin):=20=E6=9B=B4=E6=96=B0=20set?= =?UTF-8?q?=5Ftyping=5Fstatus=20=E6=8F=92=E4=BB=B6=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/built_in/set_typing_status/_manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/built_in/set_typing_status/_manifest.json b/src/plugins/built_in/set_typing_status/_manifest.json index d3914ea48..0ba1ff237 100644 --- a/src/plugins/built_in/set_typing_status/_manifest.json +++ b/src/plugins/built_in/set_typing_status/_manifest.json @@ -3,7 +3,7 @@ "description": "一个在LLM生成回复时设置私聊输入状态的插件。", "version": "1.0.0", "author": { - "name": "Kilo Code" + "name": "MoFox-Studio" }, "license": "MIT", "homepage_url": "", @@ -11,6 +11,6 @@ "keywords": ["typing", "status", "private chat"], "categories": ["utility"], "host_application": { - "min_version": "1.0.0" + "min_version": "0.10.0" } } \ No newline at end of file From 5fe3a5e6aa6ad3d21911fad73c3b0d6d6c45d317 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 30 Aug 2025 17:36:55 +0800 Subject: [PATCH 6/7] =?UTF-8?q?refactor(chat):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E7=A8=8B=E6=B4=BB=E5=8A=A8=E6=8F=90=E7=A4=BA=E4=BB=A5?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E7=BE=A4=E8=81=8A=E5=B9=B2=E6=89=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了日程活动提示的措辞,明确指出当前活动与群聊无关,以防止在群聊场景下产生不相关的联想或干扰。 --- src/chat/planner_actions/planner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/planner_actions/planner.py b/src/chat/planner_actions/planner.py index 6ea19c2be..6115b73bd 100644 --- a/src/chat/planner_actions/planner.py +++ b/src/chat/planner_actions/planner.py @@ -429,7 +429,7 @@ class ActionPlanner: schedule_block = "" if global_config.schedule.enable: if current_activity := schedule_manager.get_current_activity(): - schedule_block = f"你当前正在:{current_activity}。" + schedule_block = f"你当前正在:{current_activity},但注意它与群聊的聊天无关。" mood_block = "" if global_config.mood.enable_mood: From 142e72ba6c97de7ded2a61d02fcf7457b82c96ad Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sat, 30 Aug 2025 17:55:13 +0800 Subject: [PATCH 7/7] =?UTF-8?q?feat(napcat):=20=E8=A1=A5=E5=85=85=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E7=BE=A4=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E4=B8=8E?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增近 30 个群相关事件处理器,覆盖群信息、成员管理、禁言、公告、精华消息等功能;修正合并转发消息事件常量拼写;补全事件类型注解与详细文档。所有群事件统一使用 `NapcatEvent.GROUP.*` 枚举值与对应 Handler。 --- .../napcat_adapter_plugin/event_handlers.py | 925 +++++++++++++++++- plugins/napcat_adapter_plugin/event_types.py | 907 ++++++++++++++++- 2 files changed, 1784 insertions(+), 48 deletions(-) diff --git a/plugins/napcat_adapter_plugin/event_handlers.py b/plugins/napcat_adapter_plugin/event_handlers.py index c6b59c0d1..5bfe77a92 100644 --- a/plugins/napcat_adapter_plugin/event_handlers.py +++ b/plugins/napcat_adapter_plugin/event_handlers.py @@ -549,6 +549,7 @@ class SetDiyOnlineStatusHandler(BaseEventHandler): return HandlerResult(False, False, {"status": "error"}) +# ===MESSAGE=== class SendPrivateMsgHandler(BaseEventHandler): handler_name: str = "napcat_send_private_msg_handler" handler_description: str = "发送私聊消息" @@ -856,7 +857,7 @@ class SendForwardMsgHandler(BaseEventHandler): handler_description: str = "发送合并转发消息" weight: int = 100 intercept_message: bool = False - init_subscribe = [NapcatEvent.MESSAGE.SEND_FORWARF_MSG] + init_subscribe = [NapcatEvent.MESSAGE.SEND_FORWARD_MSG] async def execute(self, params: dict): raw = params.get("raw", {}) @@ -934,3 +935,925 @@ class SendGroupAiRecordHandler(BaseEventHandler): else: logger.error("事件 napcat_send_group_ai_record 请求失败!") return HandlerResult(False, False, {"status": "error"}) + +# ===GROUP=== +class GetGroupInfoHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_info_handler" + handler_description: str = "获取群信息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_INFO] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_group_info 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="get_group_info", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_info 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupAddOptionHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_add_option_handler" + handler_description: str = "设置群添加选项" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_ADD_OPTION] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + add_type = params.get("add_type", "") + group_question = params.get("group_question", "") + group_answer = params.get("group_answer", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + add_type = raw.get("add_type", "") + group_question = raw.get("group_question", "") + group_answer = raw.get("group_answer", "") + + if not group_id or not add_type: + logger.error("事件 napcat_set_group_add_option 缺少必要参数: group_id 或 add_type") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "add_type": str(add_type) + } + if group_question: + payload["group_question"] = group_question + if group_answer: + payload["group_answer"] = group_answer + + response = await send_handler.send_message_to_napcat(action="set_group_add_option", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_add_option 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupKickMembersHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_kick_members_handler" + handler_description: str = "批量踢出群成员" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_KICK_MEMBERS] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", []) + reject_add_request = params.get("reject_add_request", False) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", []) + reject_add_request = raw.get("reject_add_request", False) + + if not group_id or not user_id: + logger.error("事件 napcat_set_group_kick_members 缺少必要参数: group_id 或 user_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": user_id, + "reject_add_request": bool(reject_add_request) + } + response = await send_handler.send_message_to_napcat(action="set_group_kick_members", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_kick_members 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupRemarkHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_remark_handler" + handler_description: str = "设置群备注" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_REMARK] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + remark = params.get("remark", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + remark = raw.get("remark", "") + + if not group_id or not remark: + logger.error("事件 napcat_set_group_remark 缺少必要参数: group_id 或 remark") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "remark": remark + } + response = await send_handler.send_message_to_napcat(action="set_group_remark", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_remark 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupKickHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_kick_handler" + handler_description: str = "群踢人" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_KICK] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + reject_add_request = params.get("reject_add_request", False) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + reject_add_request = raw.get("reject_add_request", False) + + if not group_id or not user_id: + logger.error("事件 napcat_set_group_kick 缺少必要参数: group_id 或 user_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id), + "reject_add_request": bool(reject_add_request) + } + response = await send_handler.send_message_to_napcat(action="set_group_kick", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_kick 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupSystemMsgHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_system_msg_handler" + handler_description: str = "获取群系统消息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_SYSTEM_MSG] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + count = params.get("count", 20) + + if params.get("raw", ""): + count = raw.get("count", 20) + + if count is None: + logger.error("事件 napcat_get_group_system_msg 缺少必要参数: count") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "count": int(count) + } + response = await send_handler.send_message_to_napcat(action="get_group_system_msg", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_system_msg 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupBanHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_ban_handler" + handler_description: str = "群禁言" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_BAN] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + duration = params.get("duration", 0) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + duration = raw.get("duration", 0) + + if not group_id or not user_id or duration is None: + logger.error("事件 napcat_set_group_ban 缺少必要参数") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id), + "duration": int(duration) + } + response = await send_handler.send_message_to_napcat(action="set_group_ban", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_ban 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetEssenceMsgListHandler(BaseEventHandler): + handler_name: str = "napcat_get_essence_msg_list_handler" + handler_description: str = "获取群精华消息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_ESSENCE_MSG_LIST] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_essence_msg_list 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="get_essence_msg_list", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_essence_msg_list 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupWholeBanHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_whole_ban_handler" + handler_description: str = "全体禁言" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_WHOLE_BAN] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + enable = params.get("enable", True) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + enable = raw.get("enable", True) + + if not group_id or enable is None: + logger.error("事件 napcat_set_group_whole_ban 缺少必要参数") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "enable": bool(enable) + } + response = await send_handler.send_message_to_napcat(action="set_group_whole_ban", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_whole_ban 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupPortraitHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_portrait_handler" + handler_description: str = "设置群头像" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_PORTRAINT] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + file_path = params.get("file", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + file_path = raw.get("file", "") + + if not group_id or not file_path: + logger.error("事件 napcat_set_group_portrait 缺少必要参数: group_id 或 file") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "file": file_path + } + response = await send_handler.send_message_to_napcat(action="set_group_portrait", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_portrait 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupAdminHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_admin_handler" + handler_description: str = "设置群管理" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_ADMIN] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + enable = params.get("enable", True) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + enable = raw.get("enable", True) + + if not group_id or not user_id or enable is None: + logger.error("事件 napcat_set_group_admin 缺少必要参数") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id), + "enable": bool(enable) + } + response = await send_handler.send_message_to_napcat(action="set_group_admin", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_admin 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupCardHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_card_handler" + handler_description: str = "设置群成员名片" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_CARD] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + card = params.get("card", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + card = raw.get("card", "") + + if not group_id or not user_id: + logger.error("事件 napcat_set_group_card 缺少必要参数: group_id 或 user_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id) + } + if card: + payload["card"] = card + + response = await send_handler.send_message_to_napcat(action="group_card", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_card 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetEssenceMsgHandler(BaseEventHandler): + handler_name: str = "napcat_set_essence_msg_handler" + handler_description: str = "设置群精华消息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_ESSENCE_MSG] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + message_id = params.get("message_id", "") + + if params.get("raw", ""): + message_id = raw.get("message_id", "") + + if not message_id: + logger.error("事件 napcat_set_essence_msg 缺少必要参数: message_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "message_id": str(message_id) + } + response = await send_handler.send_message_to_napcat(action="set_essence_msg", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_essence_msg 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupNameHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_name_handler" + handler_description: str = "设置群名" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_NAME] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + group_name = params.get("group_name", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + group_name = raw.get("group_name", "") + + if not group_id or not group_name: + logger.error("事件 napcat_set_group_name 缺少必要参数: group_id 或 group_name") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "group_name": group_name + } + response = await send_handler.send_message_to_napcat(action="set_group_name", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_name 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class DeleteEssenceMsgHandler(BaseEventHandler): + handler_name: str = "napcat_delete_essence_msg_handler" + handler_description: str = "删除群精华消息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.DELETE_ESSENCE_MSG] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + message_id = params.get("message_id", "") + + if params.get("raw", ""): + message_id = raw.get("message_id", "") + + if not message_id: + logger.error("事件 napcat_delete_essence_msg 缺少必要参数: message_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "message_id": str(message_id) + } + response = await send_handler.send_message_to_napcat(action="delete_essence_msg", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_delete_essence_msg 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupLeaveHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_leave_handler" + handler_description: str = "退群" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_LEAVE] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_set_group_leave 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="set_group_leave", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_leave 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SendGroupNoticeHandler(BaseEventHandler): + handler_name: str = "napcat_send_group_notice_handler" + handler_description: str = "发送群公告" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SEND_GROUP_NOTICE] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + content = params.get("content", "") + image = params.get("image", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + content = raw.get("content", "") + image = raw.get("image", "") + + if not group_id or not content: + logger.error("事件 napcat_send_group_notice 缺少必要参数: group_id 或 content") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "content": content + } + if image: + payload["image"] = image + + response = await send_handler.send_message_to_napcat(action="_send_group_notice", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_send_group_notice 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupSpecialTitleHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_special_title_handler" + handler_description: str = "设置群头衔" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_SPECIAL_TITLE] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + special_title = params.get("special_title", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + special_title = raw.get("special_title", "") + + if not group_id or not user_id: + logger.error("事件 napcat_set_group_special_title 缺少必要参数: group_id 或 user_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id) + } + if special_title: + payload["special_title"] = special_title + + response = await send_handler.send_message_to_napcat(action="set_group_special_title", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_special_title 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupNoticeHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_notice_handler" + handler_description: str = "获取群公告" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_NOTICE] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_group_notice 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="_get_group_notice", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_notice 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupAddRequestHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_add_request_handler" + handler_description: str = "处理加群请求" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_ADD_REQUEST] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + flag = params.get("flag", "") + approve = params.get("approve", True) + reason = params.get("reason", "") + + if params.get("raw", ""): + flag = raw.get("flag", "") + approve = raw.get("approve", True) + reason = raw.get("reason", "") + + if not flag or approve is None: + logger.error("事件 napcat_set_group_add_request 缺少必要参数") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "flag": flag, + "approve": bool(approve) + } + if reason: + payload["reason"] = reason + + response = await send_handler.send_message_to_napcat(action="set_group_add_request", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_add_request 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupListHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_list_handler" + handler_description: str = "获取群列表" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_LIST] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + no_cache = params.get("no_cache", False) + + if params.get("raw", ""): + no_cache = raw.get("no_cache", False) + + payload = { + "no_cache": bool(no_cache) + } + response = await send_handler.send_message_to_napcat(action="get_group_list", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_list 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class DeleteGroupNoticeHandler(BaseEventHandler): + handler_name: str = "napcat_del_group_notice_handler" + handler_description: str = "删除群公告" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.DELETE_GROUP_NOTICE] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + notice_id = params.get("notice_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + notice_id = raw.get("notice_id", "") + + if not group_id or not notice_id: + logger.error("事件 napcat_del_group_notice 缺少必要参数: group_id 或 notice_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "notice_id": notice_id + } + response = await send_handler.send_message_to_napcat(action="_del_group_notice", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_del_group_notice 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupMemberInfoHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_member_info_handler" + handler_description: str = "获取群成员信息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_MEMBER_INFO] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + user_id = params.get("user_id", "") + no_cache = params.get("no_cache", False) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + user_id = raw.get("user_id", "") + no_cache = raw.get("no_cache", False) + + if not group_id or not user_id: + logger.error("事件 napcat_get_group_member_info 缺少必要参数: group_id 或 user_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "user_id": str(user_id), + "no_cache": bool(no_cache) + } + response = await send_handler.send_message_to_napcat(action="get_group_member_info", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_member_info 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupMemberListHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_member_list_handler" + handler_description: str = "获取群成员列表" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_MEMBER_LIST] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + no_cache = params.get("no_cache", False) + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + no_cache = raw.get("no_cache", False) + + if not group_id: + logger.error("事件 napcat_get_group_member_list 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id), + "no_cache": bool(no_cache) + } + response = await send_handler.send_message_to_napcat(action="get_group_member_list", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_member_list 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupHonorInfoHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_honor_info_handler" + handler_description: str = "获取群荣誉" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_HONOR_INFO] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + type = params.get("type", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + type = raw.get("type", "") + + if not group_id: + logger.error("事件 napcat_get_group_honor_info 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + if type: + payload["type"] = type + + response = await send_handler.send_message_to_napcat(action="get_group_honor_info", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_honor_info 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupInfoExHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_info_ex_handler" + handler_description: str = "获取群信息ex" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_INFO_EX] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_group_info_ex 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="get_group_info_ex", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_info_ex 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupAtAllRemainHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_at_all_remain_handler" + handler_description: str = "获取群 @全体成员 剩余次数" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_AT_ALL_REMAIN] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_group_at_all_remain 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="get_group_at_all_remain", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_at_all_remain 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupShutListHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_shut_list_handler" + handler_description: str = "获取群禁言列表" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_SHUT_LIST] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_get_group_shut_list 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="get_group_shut_list", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_shut_list 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class GetGroupIgnoredNotifiesHandler(BaseEventHandler): + handler_name: str = "napcat_get_group_ignored_notifies_handler" + handler_description: str = "获取群过滤系统消息" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.GET_GROUP_IGNORED_NOTIFIES] + + async def execute(self, params: dict): + payload = {} + response = await send_handler.send_message_to_napcat(action="get_group_ignored_notifies", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_get_group_ignored_notifies 请求失败!") + return HandlerResult(False, False, {"status": "error"}) + +class SetGroupSignHandler(BaseEventHandler): + handler_name: str = "napcat_set_group_sign_handler" + handler_description: str = "群打卡" + weight: int = 100 + intercept_message: bool = False + init_subscribe = [NapcatEvent.GROUP.SET_GROUP_SIGN] + + async def execute(self, params: dict): + raw = params.get("raw", {}) + group_id = params.get("group_id", "") + + if params.get("raw", ""): + group_id = raw.get("group_id", "") + + if not group_id: + logger.error("事件 napcat_set_group_sign 缺少必要参数: group_id") + return HandlerResult(False, False, {"status": "error"}) + + payload = { + "group_id": str(group_id) + } + response = await send_handler.send_message_to_napcat(action="set_group_sign", params=payload) + if response.get("status", "") == "ok": + return HandlerResult(True, True, response) + else: + logger.error("事件 napcat_set_group_sign 请求失败!") + return HandlerResult(False, False, {"status": "error"}) diff --git a/plugins/napcat_adapter_plugin/event_types.py b/plugins/napcat_adapter_plugin/event_types.py index 968652921..c56012e48 100644 --- a/plugins/napcat_adapter_plugin/event_types.py +++ b/plugins/napcat_adapter_plugin/event_types.py @@ -320,7 +320,7 @@ class NapcatEvent(Enum): '''获取好友列表 Args: - no_cache (Opetional[bool]): 是否不使用缓存 + no_cache (Optional[bool]): 是否不使用缓存 raw (Optional[dict]): 原始请求体 Returns: @@ -352,9 +352,9 @@ class NapcatEvent(Enum): '''获取点赞列表 Args: - user_id (Opetional[str|int]): 用户id,指定用户,不填为获取所有 - start (Opetional[int]): 起始值 - count (Opetional[int]): 返回数量 + user_id (Optional[str|int]): 用户id,指定用户,不填为获取所有 + start (Optional[int]): 起始值 + count (Optional[int]): 返回数量 raw (Optional[dict]): 原始请求体 Returns: @@ -425,9 +425,9 @@ class NapcatEvent(Enum): '''删除好友 Args: - user_id (Opetional[str|int]): 用户id(必需) - temp_block (Opetional[bool]): 拉黑(必需) - temp_both_del (Opetional[bool]): 双向删除(必需) + user_id (Optional[str|int]): 用户id(必需) + temp_block (Optional[bool]): 拉黑(必需) + temp_both_del (Optional[bool]): 双向删除(必需) raw (Optional[dict]): 原始请求体 Returns: @@ -447,7 +447,7 @@ class NapcatEvent(Enum): '''获取(指定)用户状态 Args: - user_id (Opetional[str|int]): 用户id(必需) + user_id (Optional[str|int]): 用户id(必需) raw (Optional[dict]): 原始请求体 Returns: @@ -568,8 +568,8 @@ class NapcatEvent(Enum): '''发送私聊消息 Args: - user_id (Opetional[str|int]): 用户id(必需) - message (Opetional[str]): 消息object(必需) + user_id (Optional[str|int]): 用户id(必需) + message (Optional[str]): 消息object(必需) raw (Optional[dict]): 原始请求体 Returns: @@ -884,7 +884,7 @@ class NapcatEvent(Enum): "echo": "string" } ''' - SEND_FORWARF_MSG = "napcat_send_forward_msg" + SEND_FORWARD_MSG = "napcat_send_forward_msg" '''发送合并转发消息 Args: @@ -929,73 +929,886 @@ class NapcatEvent(Enum): } ''' + class GROUP(Enum): """ 该分类是对群聊相关的操作,只能由外部触发,napcat_plugin负责处理 """ - SET_GROUP_SEARCH = "napcat_set_group_search" - '''设置群搜索''' - GET_GROUP_DETAIL_INFO = "napcat_get_group_detail_info" - '''获取群详细信息''' + GET_GROUP_INFO = "napcat_get_group_info" + '''获取群信息 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "group_all_shut": 0, + "group_remark": "string", + "group_id": "string", + "group_name": "string", + "member_count": 0, + "max_member_count": 0 + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_ADD_OPTION = "napcat_set_group_add_option" - '''设置群添加选项''' - SET_GROUP_ROBOT_ADD_OPTION = "napcat_set_group_robot_add_option" - '''设置群机器人添加选项''' + '''设置群添加选项 + + Args: + group_id (Optional[str|int]): 群号(必需) + add_type (Optional[str]): 群添加类型(必需) + group_question (Optional[str]): 群添加问题 + group_answer (Optional[str]): 群添加答案 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_KICK_MEMBERS = "napcat_set_group_kick_members" - '''批量踢出群成员''' + '''批量踢出群成员 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[List[str|int]]): 用户id列表(必需) + reject_add_request (Optional[bool]): 是否群拉黑 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' + SET_GROUP_REMARK = "napcat_set_group_remark" + '''设置群备注 + + Args: + group_id (Optional[str]): 群号(必需) + remark (Optional[str]): 备注内容(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_KICK = "napcat_set_group_kick" - '''群踢人''' + '''群踢人 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + reject_add_request (Optional[bool]): 是否群拉黑 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_SYSTEM_MSG = "napcat_get_group_system_msg" - '''获取群系统消息''' + '''获取群系统消息 + + Args: + count (Optional[int]): 获取数量(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "InvitedRequest": [ + { + "request_id": 0, + "invitor_uin": 0, + "invitor_nick": "string", + "group_id": 0, + "message": "string", + "group_name": "string", + "checked": true, + "actor": 0, + "requester_nick": "string" + } + ], + "join_requests": [ + { + "request_id": 0, + "invitor_uin": 0, + "invitor_nick": "string", + "group_id": 0, + "message": "string", + "group_name": "string", + "checked": true, + "actor": 0, + "requester_nick": "string" + } + ] + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_BAN = "napcat_set_group_ban" - '''群禁言''' + '''群禁言 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + duration (Optional[int]): 禁言时间:秒(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_ESSENCE_MSG_LIST = "napcat_get_essence_msg_list" - '''获取群精华消息''' + '''获取群精华消息 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": [ + { + "msg_seq": 0, + "msg_random": 0, + "sender_id": 0, + "sender_nick": "string", + "operator_id": 0, + "operator_nick": "string", + "message_id": 0, + "operator_time": 0, + "content": [ + { + "type": "text", + "data": { + "text": "string" + } + } + ] + } + ], + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_WHOLE_BAN = "napcat_set_group_whole_ban" - '''全体禁言''' + '''全体禁言 + + Args: + group_id (Optional[str|int]): 群号(必需) + enable (Optional[bool]): 是否启用(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_PORTRAINT = "napcat_set_group_portrait" - '''设置群头像''' + '''设置群头像 + + Args: + group_id (Optional[str|int]): 群号(必需) + file (Optional[str]): 文件路径(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "result": 0, + "errMsg": "success" + }, + "message": "", + "wording": "", + "echo": null + } + ''' SET_GROUP_ADMIN = "napcat_set_group_admin" - '''设置群管理''' + '''设置群管理 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + enable (Optional[bool]): 是否设为群管理(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_CARD = "napcat_group_card" - '''设置群成员名片''' + '''设置群成员名片 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + card (Optional[str]): 为空则为取消群名片 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_ESSENCE_MSG = "napcat_set_essence_msg" - '''设置群精华消息''' + '''设置群精华消息 + + Args: + message_id (Optional[str|int]): 消息id(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "errCode": 0, + "errMsg": "success", + "result": { + "wording": "", + "digestUin": "0", + "digestTime": 0, + "msg": { + "groupCode": "0", + "msgSeq": 0, + "msgRandom": 0, + "msgContent": [], + "textSize": "0", + "picSize": "0", + "videoSize": "0", + "senderUin": "0", + "senderTime": 0, + "addDigestUin": "0", + "addDigestTime": 0, + "startTime": 0, + "latestMsgSeq": 0, + "opType": 0 + }, + "errorCode": 0 + } + }, + "message": "", + "wording": "", + "echo": null + } + ''' SET_GROUP_NAME = "napcat_set_group_name" - '''设置群名''' + '''设置群名 + + Args: + group_id (Optional[str|int]): 群号(必需) + group_name (Optional[str]): 群名(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' DELETE_ESSENCE_MSG = "napcat_delete_essence_msg" - '''删除群精华消息''' + '''删除群精华消息 + + Args: + message_id (Optional[str|int]): 消息id(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict:{ + "status": "ok", + "retcode": 0, + "data": { + "errCode": 0, + "errMsg": "success", + "result": { + "wording": "", + "digestUin": "0", + "digestTime": 0, + "msg": { + "groupCode": "0", + "msgSeq": 0, + "msgRandom": 0, + "msgContent": [], + "textSize": "0", + "picSize": "0", + "videoSize": "0", + "senderUin": "0", + "senderTime": 0, + "addDigestUin": "0", + "addDigestTime": 0, + "startTime": 0, + "latestMsgSeq": 0, + "opType": 0 + }, + "errorCode": 0 + } + }, + "message": "", + "wording": "", + "echo": null + } + ''' SET_GROUP_LEAVE = "napcat_set_group_leave" - '''退群''' + '''退群 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SEND_GROUP_NOTICE = "napcat_group_notice" - '''发送群公告''' + '''发送群公告 + + Args: + group_id (Optional[str|int]): 群号(必需) + content (Optional[str]): 公告内容(必需) + image (Optional[str]): 图片地址 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_SPECIAL_TITLE = "napcat_set_group_special_title" - '''设置群头衔''' + '''设置群头衔 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + special_title (Optional[str]): 为空则取消头衔 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_NOTICE = "napcat_get_group_notice" - '''获取群公告''' + '''获取群公告 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": [ + { + "notice_id": "63491e2f000000004f4d1e677d2b0200", + "sender_id": 123, + "publish_time": 1730039119, + "message": { + "text": "这是一条神奇的群公告", + "image": [ + { + "id": "aJJBbZ6BqyLiaC1kmpvIWGBBkJerEfpRBHX5Brxbaurs", + "height": "400", + "width": "400" + } + ] + } + } + ], + "message": "", + "wording": "", + "echo": null + } + ''' SET_GROUP_ADD_REQUEST = "napcat_set_group_add_request" - '''处理加群请求''' - GET_GROUP_INFO = "napcat_get_group_info" - '''获取群信息''' + '''处理加群请求 + + Args: + flag (Optional[str]): 请求id(必需) + approve (Optional[bool]): 是否同意(必需) + reason (Optional[str]): 拒绝理由 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": null, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_LIST = "napcat_get_group_list" - '''获取群列表''' + '''获取群列表 + + Args: + no_cache (Optional[bool]): 是否不缓存 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": [ + { + "group_all_shut": 0, + "group_remark": "string", + "group_id": "string", + "group_name": "string", + "member_count": 0, + "max_member_count": 0 + } + ], + "message": "string", + "wording": "string", + "echo": "string" + } + ''' DELETE_GROUP_NOTICE = "napcat_del_group_notice" - '''删除群公告''' + '''删除群公告 + + Args: + group_id (Optional[str|int]): 群号(必需) + notice_id (Optional[str]): 公告id(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "result": 0, + "errMsg": "string" + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_MEMBER_INFO = "napcat_get_group_member_info" - '''获取群成员信息''' + '''获取群成员信息 + + Args: + group_id (Optional[str|int]): 群号(必需) + user_id (Optional[str|int]): 用户id(必需) + no_cache (Optional[bool]): 是否不缓存 + raw (Optional[dict]): 原始请求体 + + Returns: + dict:{ + "status": "ok", + "retcode": 0, + "data": { + "group_id": 0, + "user_id": 0, + "nickname": "string", + "card": "string", + "sex": "string", + "age": 0, + "join_time": 0, + "last_sent_time": 0, + "level": 0, + "qq_level": 0, + "role": "string", + "title": "string", + "area": "string", + "unfriendly": true, + "title_expire_time": 0, + "card_changeable": true, + "shut_up_timestamp": 0, + "is_robot": true, + "qage": "string" + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_MEMBER_LIST = "napcat_get_group_member_list" - '''获取群成员列表''' + '''获取群成员列表 + + Args: + group_id (Optional[str|int]): 群号(必需) + no_cache (Optional[bool]): 是否不缓存 + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": [ + { + "group_id": 0, + "user_id": 0, + "nickname": "string", + "card": "string", + "sex": "string", + "age": 0, + "join_time": 0, + "last_sent_time": 0, + "level": 0, + "qq_level": 0, + "role": "string", + "title": "string", + "area": "string", + "unfriendly": true, + "title_expire_time": 0, + "card_changeable": true, + "shut_up_timestamp": 0, + "is_robot": true, + "qage": "string" + } + ], + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_HONOR_INFO = "napcat_get_group_honor_info" - '''获取群荣誉''' + '''获取群荣誉 + + Args: + group_id (Optional[str|int]): 群号(必需) + type (Optional[str]): 看详情 + raw (Optional[dict]): 原始请求体 + + Returns: + dict:{ + "status": "ok", + "retcode": 0, + "data": { + "group_id": "string", + "current_talkative": { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + }, + "talkative_list": [ + { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + } + ], + "performer_list": [ + { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + } + ], + "legend_list": [ + { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + } + ], + "emotion_list": [ + { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + } + ], + "strong_newbie_list": [ + { + "user_id": 0, + "nickname": "string", + "avatar": 0, + "description": "string" + } + ] + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_INFO_EX = "napcat_get_group_info_ex" - '''获取群信息ex''' + '''获取群信息ex + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "groupCode": "790514019", + "resultCode": 0, + "extInfo": { + "groupInfoExtSeq": 1, + "reserve": 0, + "luckyWordId": "0", + "lightCharNum": 0, + "luckyWord": "", + "starId": 0, + "essentialMsgSwitch": 0, + "todoSeq": 0, + "blacklistExpireTime": 0, + "isLimitGroupRtc": 0, + "companyId": 0, + "hasGroupCustomPortrait": 1, + "bindGuildId": "0", + "groupOwnerId": { + "memberUin": "1129317309", + "memberUid": "u_4_QA-QaFryh-Ocgsv4_8EQ", + "memberQid": "" + }, + "essentialMsgPrivilege": 0, + "msgEventSeq": "0", + "inviteRobotSwitch": 0, + "gangUpId": "0", + "qqMusicMedalSwitch": 0, + "showPlayTogetherSwitch": 0, + "groupFlagPro1": "0", + "groupBindGuildIds": { + "guildIds": [] + }, + "viewedMsgDisappearTime": "0", + "groupExtFlameData": { + "switchState": 0, + "state": 0, + "dayNums": [], + "version": 0, + "updateTime": "0", + "isDisplayDayNum": false + }, + "groupBindGuildSwitch": 0, + "groupAioBindGuildId": "0", + "groupExcludeGuildIds": { + "guildIds": [] + }, + "fullGroupExpansionSwitch": 0, + "fullGroupExpansionSeq": "0", + "inviteRobotMemberSwitch": 0, + "inviteRobotMemberExamine": 0, + "groupSquareSwitch": 0 + } + }, + "message": "", + "wording": "", + "echo": null + } + ''' GET_GROUP_AT_ALL_REMAIN = "napcat_get_group_at_all_remain" - '''获取群 @全体成员 剩余次数''' + '''获取群 @全体成员 剩余次数 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "can_at_all": true, + "remain_at_all_count_for_group": 0, + "remain_at_all_count_for_uin": 0 + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_SHUT_LIST = "napcat_get_group_shut_list" - '''获取群禁言列表''' + '''获取群禁言列表 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": [ + { + "uid": "string", + "qid": "string", + "uin": "string", + "nick": "string", + "remark": "string", + "cardType": 0, + "cardName": "string", + "role": 0, + "avatarPath": "string", + "shutUpTime": 0, + "isDelete": true, + "isSpecialConcerned": true, + "isSpecialShield": true, + "isRobot": true, + "groupHonor": {}, + "memberRealLevel": 0, + "memberLevel": 0, + "globalGroupLevel": 0, + "globalGroupPoint": 0, + "memberTitleId": 0, + "memberSpecialTitle": "string", + "specialTitleExpireTime": "string", + "userShowFlag": 0, + "userShowFlagNew": 0, + "richFlag": 0, + "mssVipType": 0, + "bigClubLevel": 0, + "bigClubFlag": 0, + "autoRemark": "string", + "creditLevel": 0, + "joinTime": 0, + "lastSpeakTime": 0, + "memberFlag": 0, + "memberFlagExt": 0, + "memberMobileFlag": 0, + "memberFlagExt2": 0, + "isSpecialShielded": true, + "cardNameId": 0 + } + ], + "message": "string", + "wording": "string", + "echo": "string" + } + ''' GET_GROUP_IGNORED_NOTIFIES = "napcat_get_group_ignored_notifies" - '''获取群过滤系统消息''' + '''获取群过滤系统消息 + + Returns: + dict: { + "status": "ok", + "retcode": 0, + "data": { + "InvitedRequest": [ + { + "request_id": 0, + "invitor_uin": 0, + "invitor_nick": "string", + "group_id": 0, + "message": "string", + "group_name": "string", + "checked": true, + "actor": 0, + "requester_nick": "string" + } + ], + "join_requests": [ + { + "request_id": 0, + "invitor_uin": 0, + "invitor_nick": "string", + "group_id": 0, + "message": "string", + "group_name": "string", + "checked": true, + "actor": 0, + "requester_nick": "string" + } + ] + }, + "message": "string", + "wording": "string", + "echo": "string" + } + ''' SET_GROUP_SIGN = "napcat_set_group_sign" - '''群打卡''' + '''群打卡 + + Args: + group_id (Optional[str|int]): 群号(必需) + raw (Optional[dict]): 原始请求体 + Returns: + dict: {} + ''' + class FILE(Enum): + ...