警告:这个插件修改了koishi的ctx.emit方法,这会影响到整个事件系统(通常情况下这不会影响koishi其他部分和其他插件的运行),我暂时不能保证它没有Bug,请避免在生产环境使用,如果出现任何问题可在非官方群@2596628651进行反馈
这个插件会从根源上拦截一条消息的接收。
koishi收到消息后的顺序是这样的:
graph TD
subgraph "外部平台与适配器"
A["聊天平台<br/>(QQ, Discord等)"] --> B["适配器 Adapter<br/>接收原始事件"]
B --> C["创建标准 Session 对象"]
C --> D["bot.dispatch(session)"]
end
subgraph "Koishi 核心事件广播"
D -- "主要调用" --> E{"ctx.emit<br/>广播核心事件"}
E -- "同时广播" --> F["'message-created' 事件"]
E -- "同时广播" --> G["'message' 事件"]
end
subgraph "事件监听与处理"
G -- "广播给所有监听者" --> H["ctx.on('message', ..., true)<br/>高优先级事件监听器"]
G --> I["<b>Koishi 核心中间件系统</b><br/>(它本身也是一个 message 事件监听器)"]
G --> J["ctx.on('message', ...)<br/>普通优先级事件监听器"]
end
subgraph "中间件串行处理栈"
I --> K["开始执行中间件栈"]
K --> L{"前置中间件<br/>ctx.middleware(..., true)"}
L -- "调用 next()" --> M{"普通中间件<br/>ctx.middleware(...)"}
L -- "直接 return" --> Z(["流程中断"])
M -- "调用 next()" --> N{"指令解析中间件"}
M -- "直接 return" --> Z
N -- "匹配成功" --> O["执行指令 Action 函数"]
N -- "匹配失败" --> P(["流程结束"])
O --> Q["通过 session.send() 等方式响应"]
end
style I fill:#f9f,stroke:#333,stroke-width:2px
emit-blacklist直接修改了app.emit,当一个message/message-created事件将要被广播时,插件会提取session中的platform和userid并进行匹配,如果发现是黑名单用户,会阻止广播。如果不是黑名单用户,会继续之后的广播流程。