流程图

消息处理流程

消息预处理器 (message preprocessor),命令处理器 (command handler) 和自然语言处理器 (nl processor) 是 NoneBot 中处理一条聊天消息的三个核心组件。它们的执行顺序如下:

【自然语言处理器】

消息如果不是命令,在最后会匹配由 @on_natural_language 定义的自然语言处理器来将此消息视为自然语言会话的一部分。在这些处理器中,用户可以根据此消息事件决定是否将此消息也当作命令处理(通过返回 IntentCommand 对象)。





























【自然语言处理器】消息如果不是命令,在最后会匹配由 @on_natural_language 定义的自然语言处理器来将此消息视为「自然语言会话」的一部分。在这些处理器中,用户可以根据此消息事件决定是否将此消息也当作命令处理(通过返回 IntentCommand 对象)。...
对于每个













对于每个...
aiocqhttp/Quart
(NoneBot 的依赖)
aiocqhttp/Quart...
消息事件 (群聊, 私聊等)
消息事件 (群聊, 私聊等)
OneBot 通过 HTTP/WS 上报
OneBot 通过 HTTP/WS 上报
【消息预处理】

向机器人发送的聊天消息首先会被消息预处理器*(通过插件中的 @message_preprocessor 注册)接收。

预处理器会接收本次的事件对象 (CQEvent) 和一个插件管理器 (PluginManager) 对象,其可以调用 API,对这次事件进行处理或改动,管理插件的开关,或直接抛出异常来停止处理这条消息。







【消息预处理】向机器人发送的聊天消息首先会被消息预处理器*(通过插件中的 @message_preprocessor 注册)接收。...
【匹配命令】

NoneBot 会尝试根据消息的内容来查找相匹配的命令处理器(通过插件中的 @on_command 注册)来将这条信息视作命令会话的一部分。这是机器人主要的交互方式。





























【匹配命令】NoneBot 会尝试根据消息的内容来查找相匹配的命令处理器(通过插件中的 @on_command 注册)来将这条信息视作命令会话的一部分。这是机器人主要的交互方式。...
该发送者是否有已有尚未过期的
命令会话?
该发送者是否有已有尚未过期的 命令会话?
尝试匹配一个命令
尝试匹配一个命令
OK?
OK?
尝试检查权限
尝试检查权限
OK?
OK?
插件管理器会构建一个新的 CommandSession 对象传入命令处理器并执行。
插件管理器会构建一个新的 CommandSession 对象传入命令处理器并执行。
拾起已存在的 CommandSession 并继续从会话暂停的地方运行 (如 aget 调用)。
拾起已存在的 CommandSession 并继续从会话暂停的地方运行 (如 aget 调用)。
消息处理完毕
消息处理完毕
T
T
T
T
T
T
F
F
F
F
F
F
处理器都成功返回?
处理器都成功返回?
T
T
消息处理完毕
消息处理完毕
F
F
消息处理完毕 (discarded)
消息处理完毕 (discarded)
尝试(多个)自然语言处理器
尝试(多个)自然语言处理器
消息处理完毕
消息处理完毕
尝试匹配关键字,检查 NLP 的权限等
尝试匹配关键字,检查 NLP 的权限等
OK?
OK?
插件管理器会构建一个新的 NLPSession 对象传入自然语言处理器并执行。
插件管理器会构建一个新的 NLPSession 对象传入自然语言处理器并执行。
NoneBot 在返回的所有 IntentCommand 中选择最好的,将该消息以命令执行。
NoneBot 在返回的所有 IntentCommand 中选择最好的,将该消息以命令执行。
T
T
F
F
IntentCommand?
IntentCommand?
T
T
F
F
NoneBot 无法将此消息匹配任何处理器
NoneBot 无法将此消息匹配任何处理器
@bot.on_message

由 aiocqhttp 提供的消息操作器。由此装饰器注册的回调会和左边的步骤同时进行来响应聊天消息。没有特别需要,应该在 NoneBot 项目中避免使用。

@bot.on_message...
该发送者是否有已有尚未过期的
命令会话?
该发送者是否有已有尚未过期的 命令会话?
拾起已存在的 CommandSession 并继续从会话暂停的地方运行 (如 aget 调用)。
拾起已存在的 CommandSession 并继续从会话暂停的地方运行 (如 aget 调用)。
尝试匹配一个命令
尝试匹配一个命令
OK?
OK?
插件管理器会构建一个新的 CommandSession 对象传入命令处理器并执行。
插件管理器会构建一个新的 CommandSession 对象传入命令处理器并执行。
OK?
OK?
尝试检查权限
尝试检查权限
handle_message()
handle_message()
Viewer does not support full SVG 1.1

  • * 多个消息预处理器的执行顺序是未定义的(此为可以改进的地方)