重构代码以使用 mofox_wire 替代 mofox_bus,更新相关文档和示例
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# MoFox Bot 消息运行时架构 (MessageRuntime)
|
||||
|
||||
本文档描述了 MoFox Bot 使用 `mofox_bus.MessageRuntime` 简化消息处理链条的架构设计。
|
||||
本文档描述了 MoFox Bot 使用 `mofox_wire.MessageRuntime` 简化消息处理链条的架构设计。
|
||||
|
||||
## 架构概述
|
||||
|
||||
@@ -54,7 +54,7 @@ await manager.send_outgoing(envelope)
|
||||
|
||||
### 2. MessageRuntime
|
||||
|
||||
`MessageRuntime` 是 mofox_bus 提供的消息路由核心,支持:
|
||||
`MessageRuntime` 是 mofox_wire 提供的消息路由核心,支持:
|
||||
|
||||
- **消息路由**:通过 `add_route()` 或 `@on_message` 装饰器按消息类型路由
|
||||
- **钩子机制**:`before_hook`(前置处理)、`after_hook`(后置处理)、`error_hook`(错误处理)
|
||||
@@ -148,7 +148,7 @@ class MessageHandler:
|
||||
|
||||
```python
|
||||
from src.common.core_sink_manager import get_message_runtime
|
||||
from mofox_bus import MessageEnvelope
|
||||
from mofox_wire import MessageEnvelope
|
||||
|
||||
runtime = get_message_runtime()
|
||||
|
||||
@@ -216,7 +216,7 @@ async def initialize(self) -> None:
|
||||
|
||||
## 参考
|
||||
|
||||
- `packages/mofox-bus/src/mofox_bus/runtime.py` - MessageRuntime 实现
|
||||
- `packages/mofox-wire/src/mofox_wire/runtime.py` - MessageRuntime 实现
|
||||
- `src/common/core_sink_manager.py` - CoreSinkManager 实现
|
||||
- `src/chat/message_receive/message_handler.py` - MessageHandler 实现
|
||||
- `docs/mofox_bus.md` - MoFox Bus 消息库说明
|
||||
- `docs/mofox_wire.md` - MoFox Bus 消息库说明
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
MoFox Bus 是 MoFox Bot 自研的统一消息中台,替换第三方 `maim_message`,将核心与各平台适配器之间的通信抽象成可拓展、可热插拔的组件。该库完全异步、面向高吞吐,覆盖消息建模、序列化、传输层、运行时路由、适配器工具等多个层面。
|
||||
|
||||
> 现在已拆分为独立 pip 包:在项目根目录执行 `pip install -e ./packages/mofox-bus` 即可安装到当前 Python 环境。
|
||||
> 现在已拆分为独立 pip 包:在项目根目录执行 `pip install -e ./packages/mofox-wire` 即可安装到当前 Python 环境。
|
||||
|
||||
---
|
||||
|
||||
@@ -16,7 +16,7 @@ MoFox Bus 是 MoFox Bot 自研的统一消息中台,替换第三方 `maim_mess
|
||||
|
||||
---
|
||||
|
||||
## 2. 包结构概览(`packages/mofox-bus/src/mofox_bus/`)
|
||||
## 2. 包结构概览(`packages/mofox-wire/src/mofox_wire/`)
|
||||
|
||||
| 模块 | 主要职责 |
|
||||
| --- | --- |
|
||||
@@ -115,15 +115,15 @@ TypedDict 更适合网络传输和依赖注入;dataclass 版 MessageBase 则
|
||||
|
||||
1. **配置文件**:在 `config.*.toml` 中新增 `[message_bus]` 段(参考 `template/bot_config_template.toml`),控制 host/port/token/wss 等。
|
||||
2. **服务启动**:`src/common/message/api.py` 中的 `get_global_api()` 已默认实例化 `MessageServer`,并将 token 写入服务器。
|
||||
3. **适配器更新**:所有使用原 `maim_message` 的模块已改为 `from mofox_bus import ...`,无需额外适配即可继续利用 `MessageBase` / `Router` API。
|
||||
3. **适配器更新**:所有使用原 `maim_message` 的模块已改为 `from mofox_wire import ...`,无需额外适配即可继续利用 `MessageBase` / `Router` API。
|
||||
|
||||
---
|
||||
|
||||
## 10. 快速上手示例
|
||||
|
||||
```python
|
||||
from mofox_bus import MessageRuntime, types
|
||||
from mofox_bus.transport import HttpMessageServer
|
||||
from mofox_wire import MessageRuntime, types
|
||||
from mofox_wire.transport import HttpMessageServer
|
||||
|
||||
runtime = MessageRuntime()
|
||||
|
||||
@@ -140,7 +140,7 @@ app = server.make_app() # 交给 aiohttp/uvicorn 运行
|
||||
|
||||
**适配器 Skeleton:**
|
||||
```python
|
||||
from mofox_bus import (
|
||||
from mofox_wire import (
|
||||
BaseAdapter,
|
||||
MessageEnvelope,
|
||||
WebSocketAdapterOptions,
|
||||
@@ -174,7 +174,7 @@ class MyAdapter(BaseAdapter):
|
||||
- 如果传入 `WebSocketAdapterOptions`,BaseAdapter 会自动建立连接、监听、默认封装 `{"type":"message","payload":...}` 的标准 JSON,并允许通过 `outgoing_encoder` 自定义下行格式。
|
||||
- 如果传入 `HttpAdapterOptions`,BaseAdapter 会自动启动一个 aiohttp Webhook(`POST /adapter/messages`)并将收到的 JSON 批量投递给核心。
|
||||
|
||||
> 完整的 WebSocket 适配器示例见 `examples/mofox_bus_demo_adapter.py`:演示了平台提供 WS 接口、适配器通过 `WebSocketAdapterOptions` 自动启动监听、接收/处理/回发的全过程,可直接运行观察日志。
|
||||
> 完整的 WebSocket 适配器示例见 `examples/mofox_wire_demo_adapter.py`:演示了平台提供 WS 接口、适配器通过 `WebSocketAdapterOptions` 自动启动监听、接收/处理/回发的全过程,可直接运行观察日志。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import orjson
|
||||
import websockets
|
||||
|
||||
|
||||
from mofox_bus import (
|
||||
from mofox_wire import (
|
||||
AdapterBase,
|
||||
InProcessCoreSink,
|
||||
MessageEnvelope,
|
||||
|
||||
@@ -78,7 +78,7 @@ dependencies = [
|
||||
"inkfox>=0.1.1",
|
||||
"rjieba>=0.1.13",
|
||||
"fastmcp>=2.13.0",
|
||||
"mofox-bus",
|
||||
"mofox-wire",
|
||||
]
|
||||
|
||||
[[tool.uv.index]]
|
||||
|
||||
@@ -342,7 +342,7 @@ class ChatManager:
|
||||
def register_message(self, message: DatabaseMessages):
|
||||
"""注册消息到聊天流"""
|
||||
# 从 DatabaseMessages 提取平台和用户/群组信息
|
||||
from mofox_bus import GroupInfo, UserInfo
|
||||
from mofox_wire import GroupInfo, UserInfo
|
||||
|
||||
user_info = UserInfo(
|
||||
platform=message.user_info.platform,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
统一消息处理器 (Message Handler)
|
||||
|
||||
利用 mofox_bus.MessageRuntime 的路由功能,简化消息处理链条:
|
||||
利用 mofox_wire.MessageRuntime 的路由功能,简化消息处理链条:
|
||||
|
||||
1. 使用 @runtime.on_message() 装饰器注册按消息类型路由的处理器
|
||||
2. 使用 before_hook 进行消息预处理(ID标准化、过滤等)
|
||||
@@ -35,7 +35,7 @@ import traceback
|
||||
from functools import partial
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from mofox_bus import MessageEnvelope, MessageRuntime
|
||||
from mofox_wire import MessageEnvelope, MessageRuntime
|
||||
|
||||
from src.chat.message_manager import message_manager
|
||||
from src.chat.message_receive.storage import MessageStorage
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
"""消息处理工具模块
|
||||
将原 MessageRecv 的消息处理逻辑提取为独立函数,
|
||||
基于 mofox-bus 的 TypedDict 形式构建消息数据,然后转换为 DatabaseMessages
|
||||
基于 mofox-wire 的 TypedDict 形式构建消息数据,然后转换为 DatabaseMessages
|
||||
"""
|
||||
import base64
|
||||
import time
|
||||
from typing import Any
|
||||
|
||||
import orjson
|
||||
from mofox_bus import MessageEnvelope
|
||||
from mofox_bus.types import MessageInfoPayload, SegPayload, UserInfoPayload, GroupInfoPayload
|
||||
from mofox_wire import MessageEnvelope
|
||||
from mofox_wire.types import MessageInfoPayload, SegPayload, UserInfoPayload, GroupInfoPayload
|
||||
|
||||
from src.chat.utils.self_voice_cache import consume_self_voice_text
|
||||
from src.chat.utils.utils_image import get_image_manager
|
||||
|
||||
@@ -8,7 +8,7 @@ from typing import TYPE_CHECKING
|
||||
|
||||
from rich.traceback import install
|
||||
|
||||
from mofox_bus import MessageEnvelope
|
||||
from mofox_wire import MessageEnvelope
|
||||
|
||||
from src.chat.message_receive.message_processor import process_message_from_dict
|
||||
from src.chat.message_receive.storage import MessageStorage
|
||||
|
||||
@@ -13,7 +13,7 @@ from datetime import datetime, timedelta
|
||||
from typing import Any, Literal, TYPE_CHECKING
|
||||
|
||||
from src.chat.express.expression_selector import expression_selector
|
||||
from mofox_bus import MessageEnvelope
|
||||
from mofox_wire import MessageEnvelope
|
||||
from src.chat.message_receive.message import Seg, UserInfo
|
||||
from src.chat.message_receive.uni_message_sender import HeartFCSender
|
||||
from src.chat.utils.chat_message_builder import (
|
||||
|
||||
@@ -11,7 +11,7 @@ CoreSink 统一管理器
|
||||
4. 提供统一的消息发送接口
|
||||
|
||||
架构说明(2025-11 重构):
|
||||
- 集成 mofox_bus.MessageRuntime 作为消息路由中心
|
||||
- 集成 mofox_wire.MessageRuntime 作为消息路由中心
|
||||
- 使用 @runtime.on_message() 装饰器注册消息处理器
|
||||
- 利用 before_hook/after_hook/error_hook 处理前置/后置/错误逻辑
|
||||
- 简化消息处理链条,提高可扩展性
|
||||
@@ -24,7 +24,7 @@ import contextlib
|
||||
import multiprocessing as mp
|
||||
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional
|
||||
|
||||
from mofox_bus import (
|
||||
from mofox_wire import (
|
||||
InProcessCoreSink,
|
||||
MessageEnvelope,
|
||||
MessageRuntime,
|
||||
|
||||
@@ -534,7 +534,7 @@ DEFAULT_MODULE_COLORS = {
|
||||
# 数据库和消息
|
||||
"database_model": "#875F00", # 橙褐色
|
||||
"database": "#00FF00", # 橙褐色
|
||||
"mofox_bus": "#AF87D7", # 紫褐色
|
||||
"mofox_wire": "#AF87D7", # 紫褐色
|
||||
# 日志系统
|
||||
"logger": "#808080", # 深灰色
|
||||
"confirm": "#FFFF00", # 黄色+粗体
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import os
|
||||
|
||||
from mofox_bus import MessageServer
|
||||
from mofox_wire import MessageServer
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.common.server import get_global_server
|
||||
@@ -45,7 +45,7 @@ def get_global_api() -> MessageServer:
|
||||
|
||||
if bus_config.auth_token:
|
||||
kwargs["enable_token"] = True
|
||||
kwargs["custom_logger"] = get_logger("mofox_bus")
|
||||
kwargs["custom_logger"] = get_logger("mofox_wire")
|
||||
|
||||
global_api = MessageServer(**kwargs)
|
||||
for token in bus_config.auth_token:
|
||||
|
||||
@@ -575,7 +575,7 @@ class ExperimentalConfig(ValidatedConfigBase):
|
||||
|
||||
|
||||
class MessageBusConfig(ValidatedConfigBase):
|
||||
"""mofox_bus 消息服务配置"""
|
||||
"""mofox_wire 消息服务配置"""
|
||||
|
||||
use_custom: bool = Field(default=False, description="是否使用自定义地址")
|
||||
host: str = Field(default="127.0.0.1", description="消息服务主机")
|
||||
|
||||
@@ -92,7 +92,7 @@ import traceback
|
||||
import uuid
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from mofox_bus import MessageEnvelope
|
||||
from mofox_wire import MessageEnvelope
|
||||
from src.common.data_models.database_data_model import DatabaseUserInfo
|
||||
if TYPE_CHECKING:
|
||||
from src.common.data_models.database_data_model import DatabaseMessages
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
"""
|
||||
插件系统 Adapter 基类
|
||||
|
||||
提供插件化的适配器支持,包装 mofox_bus.AdapterBase,
|
||||
提供插件化的适配器支持,包装 mofox_wire.AdapterBase,
|
||||
添加插件生命周期、配置管理、自动启动等特性。
|
||||
"""
|
||||
|
||||
@@ -12,7 +12,7 @@ from abc import ABC, abstractmethod
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING, Any, Dict, Optional
|
||||
|
||||
from mofox_bus import AdapterBase as MoFoxAdapterBase, CoreSink, MessageEnvelope, ProcessCoreSink
|
||||
from mofox_wire import AdapterBase as MoFoxAdapterBase, CoreSink, MessageEnvelope, ProcessCoreSink
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from src.plugin_system.base.base_plugin import BasePlugin
|
||||
@@ -26,7 +26,7 @@ class BaseAdapter(MoFoxAdapterBase, ABC):
|
||||
"""
|
||||
插件系统的 Adapter 基类
|
||||
|
||||
相比 mofox_bus.AdapterBase,增加了以下特性:
|
||||
相比 mofox_wire.AdapterBase,增加了以下特性:
|
||||
1. 插件生命周期管理 (on_adapter_loaded, on_adapter_unloaded)
|
||||
2. 配置管理集成
|
||||
3. 自动重连与健康检查
|
||||
|
||||
@@ -19,7 +19,7 @@ from typing import TYPE_CHECKING, Dict, Optional
|
||||
if TYPE_CHECKING:
|
||||
from src.plugin_system.base.base_adapter import BaseAdapter
|
||||
|
||||
from mofox_bus import ProcessCoreSinkServer
|
||||
from mofox_wire import ProcessCoreSinkServer
|
||||
from src.common.logger import get_logger
|
||||
|
||||
logger = get_logger("adapter_manager")
|
||||
@@ -45,7 +45,7 @@ def _adapter_process_entry(
|
||||
"""
|
||||
import asyncio
|
||||
import contextlib
|
||||
from mofox_bus import ProcessCoreSink
|
||||
from mofox_wire import ProcessCoreSink
|
||||
|
||||
async def _run() -> None:
|
||||
adapter_cls = _load_class(*adapter_path)
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# NEW_napcat_adapter
|
||||
|
||||
基于 mofox-bus v2.x 的 Napcat 适配器(使用 BaseAdapter 架构)
|
||||
基于 mofox-wire v2.x 的 Napcat 适配器(使用 BaseAdapter 架构)
|
||||
|
||||
## 🏗️ 架构设计
|
||||
|
||||
本插件采用 **BaseAdapter 继承模式** 重写,完全抛弃旧版 maim_message 库,改用 mofox-bus 的 TypedDict 数据结构。
|
||||
本插件采用 **BaseAdapter 继承模式** 重写,完全抛弃旧版 maim_message 库,改用 mofox-wire 的 TypedDict 数据结构。
|
||||
|
||||
### 核心组件
|
||||
- **NapcatAdapter**: 继承自 `mofox_bus.AdapterBase`,负责 OneBot 11 协议与 MessageEnvelope 的双向转换
|
||||
- **NapcatAdapter**: 继承自 `mofox_wire.AdapterBase`,负责 OneBot 11 协议与 MessageEnvelope 的双向转换
|
||||
- **WebSocketAdapterOptions**: 自动管理 WebSocket 连接,提供 incoming_parser 和 outgoing_encoder
|
||||
- **CoreMessageSink**: 通过 `InProcessCoreSink` 将消息递送到核心系统
|
||||
- **Handlers**: 独立的消息处理器,分为 to_core(接收)和 to_napcat(发送)两个方向
|
||||
@@ -56,10 +56,10 @@ NEW_napcat_adapter/
|
||||
|
||||
## 🔑 核心数据结构
|
||||
|
||||
### MessageEnvelope (mofox-bus v2.x)
|
||||
### MessageEnvelope (mofox-wire v2.x)
|
||||
|
||||
```python
|
||||
from mofox_bus import MessageEnvelope, SegPayload, MessageInfoPayload
|
||||
from mofox_wire import MessageEnvelope, SegPayload, MessageInfoPayload
|
||||
|
||||
# 创建消息信封
|
||||
envelope: MessageEnvelope = {
|
||||
@@ -249,13 +249,13 @@ class NapcatAdapter(BaseAdapter):
|
||||
|
||||
```python
|
||||
# ❌ 旧版(maim_message)
|
||||
from mofox_bus import Seg, MessageBase
|
||||
from mofox_wire import Seg, MessageBase
|
||||
|
||||
seg = Seg(type="text", data="hello")
|
||||
message = MessageBase(message_info=info, message_segment=seg)
|
||||
|
||||
# ✅ 新版(mofox-bus v2.x)
|
||||
from mofox_bus import SegPayload, MessageEnvelope
|
||||
# ✅ 新版(mofox-wire v2.x)
|
||||
from mofox_wire import SegPayload, MessageEnvelope
|
||||
|
||||
seg_payload: SegPayload = {"type": "text", "data": "hello"}
|
||||
envelope: MessageEnvelope = {
|
||||
@@ -359,8 +359,8 @@ async def from_platform_message(self, message: dict[str, Any]) -> MessageEnvelop
|
||||
|
||||
## 📚 参考资料
|
||||
|
||||
- **mofox-bus 文档**: 查看 `mofox_bus/types.py` 了解 TypedDict 定义
|
||||
- **BaseAdapter 示例**: 参考 `docs/mofox_bus_demo_adapter.py`
|
||||
- **mofox-wire 文档**: 查看 `mofox_wire/types.py` 了解 TypedDict 定义
|
||||
- **BaseAdapter 示例**: 参考 `docs/mofox_wire_demo_adapter.py`
|
||||
- **旧版实现**: `src/plugins/built_in/napcat_adapter_plugin/` (仅参考逻辑)
|
||||
- **OneBot 11 协议**: [OneBot 11 标准](https://github.com/botuniverse/onebot-11)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ from typing import Any, ClassVar, Dict, List, Optional
|
||||
import orjson
|
||||
import websockets
|
||||
|
||||
from mofox_bus import CoreSink, MessageEnvelope, WebSocketAdapterOptions
|
||||
from mofox_wire import CoreSink, MessageEnvelope, WebSocketAdapterOptions
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system import register_plugin
|
||||
from src.plugin_system.base import BaseAdapter, BasePlugin
|
||||
@@ -33,7 +33,7 @@ logger = get_logger("napcat_adapter")
|
||||
|
||||
|
||||
class NapcatAdapter(BaseAdapter):
|
||||
"""Napcat 适配器 - 完全基于 mofox-bus 架构"""
|
||||
"""Napcat 适配器 - 完全基于 mofox-wire 架构"""
|
||||
|
||||
adapter_name = "napcat_adapter"
|
||||
adapter_version = "2.0.0"
|
||||
|
||||
@@ -5,10 +5,10 @@ from __future__ import annotations
|
||||
import time
|
||||
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
||||
|
||||
from mofox_bus import MessageBuilder
|
||||
from mofox_wire import MessageBuilder
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.apis import config_api
|
||||
from mofox_bus import (
|
||||
from mofox_wire import (
|
||||
MessageEnvelope,
|
||||
SegPayload,
|
||||
MessageInfoPayload,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from mofox_bus import RouteConfig, Router, TargetConfig
|
||||
from mofox_wire import RouteConfig, Router, TargetConfig
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.common.server import get_global_server
|
||||
|
||||
Reference in New Issue
Block a user