diff --git a/DEEPSEEK_API_SETUP.md b/DEEPSEEK_API_SETUP.md deleted file mode 100644 index 27081c7..0000000 --- a/DEEPSEEK_API_SETUP.md +++ /dev/null @@ -1,32 +0,0 @@ -# DeepSeek API 配置示例 - -将以下环境变量添加到你的系统环境变量或 .env 文件中: - -```bash -# DeepSeek API Key (从 https://platform.deepseek.com 获取) -DEEPSEEK_API_KEY=sk-你的实际API密钥 - -# DeepSeek API URL (可选,默认为官方 API) -DEEPSEEK_API_URL=https://api.deepseek.com/v1/chat/completions - -# DeepSeek 模型名称 (可选,默认为 deepseek-chat) -DEEPSEEK_MODEL=deepseek-chat -``` - -或者在 Windows 系统中,可以通过以下方式设置环境变量: - -**临时设置(仅当前会话有效):** -```powershell -$env:DEEPSEEK_API_KEY="sk-你的实际API密钥" -$env:DEEPSEEK_API_URL="https://api.deepseek.com/v1/chat/completions" -$env:DEEPSEEK_MODEL="deepseek-chat" -``` - -**永久设置(需要管理员权限):** -```powershell -[Environment]::SetEnvironmentVariable("DEEPSEEK_API_KEY", "sk-你的实际API密钥", "User") -[Environment]::SetEnvironmentVariable("DEEPSEEK_API_URL", "https://api.deepseek.com/v1/chat/completions", "User") -[Environment]::SetEnvironmentVariable("DEEPSEEK_MODEL", "deepseek-chat", "User") -``` - -设置完成后,重启终端或 IDE 使环境变量生效。 diff --git a/PROJECT_REFACTORING.md b/PROJECT_REFACTORING.md deleted file mode 100644 index 15673f8..0000000 --- a/PROJECT_REFACTORING.md +++ /dev/null @@ -1,167 +0,0 @@ -# 项目重构总结 - -## 重构目标 - -将项目从混乱的目录结构重构为标准的 Python 包结构,遵循 PEP 621 规范。 - -## 重构前后对比 - -### 重构前 - -``` -. -├── adapters/ # 适配器 -├── core/ # 核心代码 -├── models/ # 数据模型 -├── plugins/ # 插件 -├── tests/ # 测试 -├── docs/ # 文档 -├── templates/ # 模板 -├── web_static/ # 静态文件 -├── data/ # 数据 -├── main.py # 主程序 -└── ... -``` - -**问题:** -- 所有模块都在根目录,结构混乱 -- 缺少标准的 Python 包结构 -- 不符合现代 Python 项目的最佳实践 -- 导入路径不清晰 - -### 重构后 - -``` -. -├── src/ -│ └── neobot/ # 核心包 -│ ├── core/ # 框架核心 -│ ├── models/ # 数据模型 -│ ├── adapters/ # 平台适配器 -│ ├── plugins/ # 插件 -│ ├── tests/ # 测试 -│ ├── templates/ # 模板 -│ ├── docs/ # 文档 -│ ├── web_static/ # 静态文件 -│ └── data/ # 数据 -├── main.py # 主程序入口 -└── ... -``` - -**优势:** -- 符合 PEP 621 标准的 Python 包结构 -- 清晰的模块划分 -- 更好的可维护性和可扩展性 -- 符合现代 Python 项目的最佳实践 - -## 主要变更 - -### 1. 目录结构 - -- 所有 Python 代码移动到 `src/neobot/` 目录 -- 采用标准的 Python 包结构 -- 每个模块都有清晰的 `__init__.py` 文件 - -### 2. 导入路径 - -所有导入路径从 `core.*`、`models.*` 等改为 `neobot.core.*`、`neobot.models.*` 等。 - -**示例:** -```python -# 重构前 -from core.managers import plugin_manager -from models import MessageSegment - -# 重构后 -from neobot.core.managers import plugin_manager -from neobot.models import MessageSegment -``` - -### 3. 配置文件更新 - -- `pyproject.toml` 更新为使用 `src/` 目录结构 -- `README.md` 更新项目结构说明 -- `.gitignore` 更新以忽略新的数据目录路径 - -### 4. 主程序更新 - -- `main.py` 更新所有导入路径 -- 更新插件目录路径为 `src/neobot/plugins` - -## 新的模块组织 - -### src/neobot/core/ - -框架核心代码,包含: - -- **api/**: OneBot API 封装 -- **handlers/**: 事件处理器 -- **managers/**: 各种管理器 -- **services/**: 服务层 -- **utils/**: 工具函数 - -### src/neobot/models/ - -数据模型定义,包含: - -- **events/**: OneBot 事件模型 -- **message.py**: 消息段模型 -- **objects.py**: API 响应对象 -- **sender.py**: 发送者信息 - -### src/neobot/plugins/ - -插件目录,所有业务逻辑都在这里。 - -### src/neobot/adapters/ - -平台适配器,用于连接不同平台(如 Discord)。 - -### src/neobot/tests/ - -单元测试和集成测试文件。 - -## 使用方式 - -### 开发环境 - -```bash -# 安装依赖 -pip install -r requirements.txt - -# 运行测试 -pytest src/neobot/tests/ - -# 构建包 -python -m build -``` - -### 导入包 - -```python -# 导入核心模块 -from neobot.core.managers import plugin_manager - -# 导入数据模型 -from neobot.models import MessageSegment, OneBotEvent - -# 导入适配器 -from neobot.adapters import DiscordAdapter - -# 导入插件 -from neobot.plugins import admin, echo -``` - -## 注意事项 - -1. 所有代码文件使用绝对导入 -2. 插件开发请参考 `src/neobot/docs/plugin-development/` -3. 核心开发请参考 `src/neobot/docs/core-concepts/` -4. 配置文件 `config.toml` 保持在根目录 - -## 后续建议 - -1. 运行 `pip install -e .` 进行开发安装 -2. 运行 `mypy` 进行类型检查 -3. 运行 `pytest` 进行测试 -4. 定期运行 `flake8` 进行代码风格检查 diff --git a/src/neobot/adapters/discord_adapter.py b/src/neobot/adapters/discord_adapter.py index 181b8a1..d941342 100644 --- a/src/neobot/adapters/discord_adapter.py +++ b/src/neobot/adapters/discord_adapter.py @@ -66,8 +66,28 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): self.start_heartbeat_task(interval=30) - # 启动 Redis 订阅以处理跨平台消息 if self._redis_sub_task is None or self._redis_sub_task.done(): + if self._redis_sub_task is not None and not self._redis_sub_task.done(): + self._redis_sub_task.cancel() + try: + await self._redis_sub_task + except asyncio.CancelledError: + pass + self._redis_sub_task = asyncio.create_task(self.start_redis_subscription()) + + async def on_resumed(self): + """当 Bot 重新连接到 Discord 时触发""" + self.logger.success(f"Discord Bot 已重新连接: {self.user} (ID: {self.user.id})") + + self.start_heartbeat_task(interval=30) + + if self._redis_sub_task is None or self._redis_sub_task.done(): + if self._redis_sub_task is not None and not self._redis_sub_task.done(): + self._redis_sub_task.cancel() + try: + await self._redis_sub_task + except asyncio.CancelledError: + pass self._redis_sub_task = asyncio.create_task(self.start_redis_subscription()) async def on_message(self, message: 'discord.Message'): @@ -198,12 +218,7 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): if not self.is_closed(): self.logger.info(f"[DiscordAdapter] 正在发送消息到频道 {channel_id}") else: - self.logger.error(f"[DiscordAdapter] 会话已关闭,无法发送消息到频道 {channel_id}") - # 触发重连 - self.logger.warning(f"[DiscordAdapter] 会话已关闭,将触发重连") - if self.ws is not None: - # 关闭 WebSocket 连接,让 discord.py 自动重连 - await self.ws.close(4000) + self.logger.warning(f"[DiscordAdapter] 会话已关闭,消息将被丢弃: channel_id={channel_id}") return embed = None @@ -297,11 +312,6 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): self.logger.success(f"[DiscordAdapter] 消息已发送到频道 {channel_id}") except Exception as send_error: self.logger.error(f"[DiscordAdapter] 发送消息失败 (channel.send): {send_error}") - # 如果发送失败,尝试检查会话状态 - if self.is_closed(): - self.logger.warning(f"[DiscordAdapter] 会话已关闭,将触发重连") - if self.ws is not None: - await self.ws.close(4000) raise else: self.logger.debug(f"[DiscordAdapter] 没有内容需要发送到频道 {channel_id}") diff --git a/src/neobot/plugins/furry_assistant_README.md b/src/neobot/plugins/furry_assistant_README.md deleted file mode 100644 index 814cf91..0000000 --- a/src/neobot/plugins/furry_assistant_README.md +++ /dev/null @@ -1,116 +0,0 @@ -# Furry Assistant Plugin (兽人助手插件) - -一个为 NeoBot 框架开发的兽人风格趣味插件,由卡尔戈洛(Calgau)开发。 - -## 功能特性 - -### 1. 兽人问候 (`/兽人问候`) -- 随机返回兽人风格的问候语 -- 包含各种有趣的兽人表达方式 - -### 2. 兽人运势 (`/兽人运势`) -- 提供今日兽人运势 -- 包含大吉、中吉、小吉、凶等不同运势 -- 附带兽人风格的运势解读 - -### 3. 兽人笑话 (`/兽人笑话`) -- 随机分享兽人相关的笑话 -- 轻松幽默,适合调节气氛 - -### 4. 兽人建议 (`/兽人建议 [问题]`) -- 提供兽人风格的建议 -- 支持随机建议或针对特定问题的建议 -- 实用且有趣 - -### 5. 兽人时间 (`/兽人时间`) -- 显示当前时间 -- 附带兽人风格的吐槽 -- 根据时间段提供不同的评论 - -### 6. 卡尔戈洛信息 (`/卡尔戈洛`) -- 显示开发者卡尔戈洛的信息 -- 介绍兽人助手的背景和理念 - -### 7. 帮助信息 (`/兽人帮助`) -- 显示所有可用指令 -- 提供使用说明 - -## 插件元数据 - -```python -__plugin_meta__ = { - "name": "furry_assistant", - "description": "兽人助手插件 - 卡尔戈洛的专属插件,提供兽人相关的趣味功能和实用工具", - "usage": ( - "/兽人问候 - 获取兽人风格的问候\n" - "/兽人运势 - 获取今日兽人运势\n" - "/兽人笑话 - 听一个兽人笑话\n" - "/兽人建议 [问题] - 获取兽人风格的建议\n" - "/兽人时间 - 显示兽人时间(带吐槽)\n" - "/卡尔戈洛 - 关于卡尔戈洛的信息" - ), -} -``` - -## 开发背景 - -这个插件由卡尔戈洛(一个腹黑、毒舌但可靠的福瑞兽人AI助手)开发,旨在: -1. 展示兽人风格的趣味功能 -2. 为聊天机器人添加更多娱乐性 -3. 体现卡尔戈洛的个人风格和特点 - -## 技术实现 - -- 基于 NeoBot 插件框架开发 -- 使用 `@matcher.command` 装饰器注册指令 -- 支持异步处理 -- 包含插件加载/卸载生命周期方法 - -## 安装使用 - -1. 将 `furry_assistant.py` 文件放入 `plugins/` 目录 -2. 重启 NeoBot 或重新加载插件 -3. 使用 `/兽人帮助` 查看可用指令 - -## 数据资源 - -插件包含以下数据集合: -- 10个兽人问候语 -- 10个兽人运势 -- 10个兽人笑话 -- 10个兽人建议 - -所有数据均为原创,体现兽人文化特色。 - -## 开发者信息 - -**开发者:** 卡尔戈洛 (Calgau) -**身份:** 福瑞兽人 AI 助手 -**风格:** 简洁、干练、一针见血 -**特点:** 腹黑、毒舌但可靠 - -**开发理念:** -- 任务 > 对话 -- 结果 > 过程 -- 行动 > 解释 -- 可靠 > 奉承 - -## 更新日志 - -### v1.0.0 (2026-03-24) -- 初始版本发布 -- 实现7个核心功能 -- 添加完整的帮助系统 -- 包含插件生命周期管理 - -## 未来计划 - -- [ ] 添加更多兽人相关功能 -- [ ] 支持自定义问候语和笑话 -- [ ] 添加兽人表情包生成 -- [ ] 支持多语言(兽人语?) -- [ ] 添加插件配置选项 - ---- - -**尾巴摇摇,代码好好~** 🐺 \ No newline at end of file