简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

基础概念

本指南介绍 ErisPulse 的核心概念,帮助你理解框架的设计思想和基本架构。

事件驱动架构

ErisPulse 采用事件驱动架构,所有的交互都通过事件来传递和处理。

事件流程

用户发送消息
      │
      ▼
平台接收
      │
      ▼
适配器接收平台原生事件
      │
      ▼
转换为 OneBot12 标准事件
      │
      ▼
提交到事件系统
      │
      ▼
分发给已注册的处理器
      │
      ▼
模块处理事件
      │
      ▼
通过适配器发送响应
      │
      ▼
平台显示给用户

OneBot12 标准

ErisPulse 使用 OneBot12 作为核心事件标准。OneBot12 是一个通用的聊天机器人应用接口标准,定义了统一的事件格式。

所有适配器都将平台特定的事件转换为 OneBot12 格式,确保代码的一致性。

核心组件

1. SDK 对象

SDK 是所有功能的统一入口点,提供对核心组件的访问。

from ErisPulse import sdk

# 访问核心模块
sdk.storage    # 存储系统
sdk.config     # 配置系统
sdk.logger     # 日志系统
sdk.adapter    # 适配器系统
sdk.module     # 模块系统
sdk.router     # 路由系统
sdk.client     # HTTP 客户端
sdk.lifecycle  # 生命周期系统

2. Event 对象

Event 对象封装了事件数据,提供了便捷的访问方法。

@command("info")
async def info_handler(event):
    # 获取事件信息
    event_id = event.get_id()
    user_id = event.get_user_id()
    platform = event.get_platform()
    text = event.get_text()
    
    # 发送回复
    await event.reply(f"用户: {user_id}, 平台: {platform}")

3. 适配器

适配器是 ErisPulse 与外部平台之间的桥梁。

职责:

示例适配器:

4. 模块

模块是功能扩展的基本单位,可以:

模块发现机制

ErisPulse 通过 Python 的 importlib.metadata.entry_points 发现已安装的模块。模块在 pyproject.toml 中声明入口点:

[project.entry-points."erispulse.module"]
MyModule = "my_package:Main"

SDK 初始化时会扫描所有 erispulse.module 组的入口点,将模块类注册到 ModuleManager,然后按依赖关系拓扑排序后依次初始化。

最小可用模块

from ErisPulse.Core.Bases import BaseModule
from ErisPulse import sdk

class Main(BaseModule):
    def __init__(self):
        self.sdk = sdk
        self.logger = sdk.logger.get_child("MyModule")

    async def on_load(self, event):
        self.logger.info("模块已加载")

    async def on_unload(self, event):
        self.logger.info("模块已卸载")

模块生命周期

加载策略

通过 get_load_strategy() 声明模块的加载行为:

from ErisPulse.loaders import ModuleLoadStrategy

class Main(BaseModule):
    @staticmethod
    def get_load_strategy():
        return ModuleLoadStrategy(
            lazy_load=True,   # 是否懒加载(默认 True)
            priority=0        # 加载优先级,数值越大越先初始化
        )

详细的懒加载机制说明请参考 懒加载系统。

事件类型

ErisPulse 支持 5 类事件:

事件类型 装饰器 说明
消息事件 @message.on_message() 用户发送的任何消息(私聊、群聊)
命令事件 @command("name") 以命令前缀开头的消息(如 /hello)
通知事件 @notice.on_friend_add() 等 系统通知(好友添加、群成员变化等)
请求事件 @request.on_friend_request() 等 用户请求(好友请求、群邀请)
元事件 @meta.on_connect() 等 系统级事件(连接、断开、心跳)

各事件类型的详细用法和代码示例请参考 事件处理入门。

核心模块说明

Storage(存储)

基于 SQLite 的键值存储系统,用于持久化数据。

# 设置值
sdk.storage.set("key", "value")

# 获取值
value = sdk.storage.get("key", "default_value")

# 批量操作
sdk.storage.set_multi({
    "key1": "value1",
    "key2": "value2"
})

# 事务
with sdk.storage.transaction():
    sdk.storage.set("key1", "value1")
    sdk.storage.set("key2", "value2")

Config(配置)

TOML 格式的配置文件管理。

# 获取配置
config = sdk.config.getConfig("MyModule", {})

# 设置配置
sdk.config.setConfig("MyModule", {"key": "value"})

# 读取嵌套配置
value = sdk.config.getConfig("MyModule.subkey", "default")

Logger(日志)

模块化日志系统。

# 记录日志
sdk.logger.info("这是一条信息")
sdk.logger.warning("这是一条警告")
sdk.logger.error("这是一条错误")

# 获取子日志记录器
child_logger = sdk.logger.get_child("submodule")
child_logger.info("子模块日志")

属性访问语法糖

除了使用 get_child() 方法外,你还可以通过属性访问的方式创建子logger,这是一种更简洁的语法糖写法:

# 通过属性访问创建子logger
sdk.logger.mymodule.info("模块消息")

# 支持嵌套访问
sdk.logger.mymodule.database.info("数据库消息")

Router(路由)

HTTP 和 WebSocket 路由管理,基于 FastAPI + Uvicorn。支持装饰器路由、中间件、分组、限流、CORS。

from ErisPulse.Core import HttpRequest

@sdk.router.get("MyModule", "/api")
async def handler(request: HttpRequest):
    data = await request.json()
    return {"status": "ok"}

完整的路由 API(WebSocket、中间件、速率限制、CORS 等)请参考 路由管理器。

Client(网络客户端)

统一的网络客户端,聚合了 HTTP 请求、WebSocket 连接、连接池管理、自动重试、超时控制、请求统计和生命周期事件集成。

from ErisPulse.Core import client

# HTTP 请求
resp = await client.get("https://api.example.com/users")
data = await resp.json()

# 带重试和超时
resp = await client.get(url, timeout=30, max_retries=3)

# WebSocket 连接
ws = await client.ws_connect("wss://example.com/ws")
async for text in ws.iter_text():
    await ws.send_text(f"Echo: {text}")

完整的网络客户端 API 请参考 网络客户端。

SendDSL 消息发送

适配器提供链式调用的消息发送接口。

基础发送

# 获取适配器实例
yunhu = sdk.adapter.get("yunhu")

# 发送消息
await yunhu.Send.To("user", "U1001").Text("Hello")

# 指定发送账号
await yunhu.Send.Using("bot1").To("group", "G1001").Text("群消息")

链式修饰

# @用户
await yunhu.Send.To("group", "G1001").At("U2001").Text("@消息")

# 回复消息
await yunhu.Send.To("group", "G1001").Reply("msg123").Text("回复")

# @全体
await yunhu.Send.To("group", "G1001").AtAll().Text("公告")

Event 回复方法

Event 对象提供了便捷的回复方法:

@command("test")
async def test_handler(event):
    # 简单文本回复
    await event.reply("回复内容")
    
    # 发送图片
    await event.reply("http://example.com/image.jpg", method="Image")
    
    # 发送语音
    await event.reply("http://example.com/voice.mp3", method="Voice")

懒加载系统

ErisPulse 默认启用模块懒加载,模块只在首次被访问(如 sdk.MyModule)时才初始化,显著提高启动速度。

from ErisPulse.loaders import ModuleLoadStrategy

class Main(BaseModule):
    @staticmethod
    def get_load_strategy():
        return ModuleLoadStrategy(
            lazy_load=True,   # 启用懒加载(默认)
            priority=0        # 加载优先级,数值越大越先初始化
        )

需要禁用懒加载的场景(lazy_load=False):

详细的懒加载机制和注意事项请参考 懒加载系统。

下一步