From c47867e7559d0b293ba98bf0a9329180f73e4b40 Mon Sep 17 00:00:00 2001 From: Richard Chien Date: Thu, 16 Aug 2018 23:18:13 +0800 Subject: [PATCH] Done whats-happened page --- .../echo_and_say.png} | Bin docs/guide/whats-happened.md | 26 ++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) rename docs/guide/{echo-and-say.png => assets/echo_and_say.png} (100%) diff --git a/docs/guide/echo-and-say.png b/docs/guide/assets/echo_and_say.png similarity index 100% rename from docs/guide/echo-and-say.png rename to docs/guide/assets/echo_and_say.png diff --git a/docs/guide/whats-happened.md b/docs/guide/whats-happened.md index 8550e917..08e9dcd6 100644 --- a/docs/guide/whats-happened.md +++ b/docs/guide/whats-happened.md @@ -57,10 +57,30 @@ if __name__ == '__main__': NoneBot 的内置插件只包含了两个命令,`echo` 和 `say`,两者的功能都是重复发送者的话,区别在于,`echo` 命令任何人都可以调用(不限制权限),但只能原样重复消息,不能手动指定要发送的 CQ 码,`say` 命令只有超级用户(通常是你自己,需要在配置中指定,下一章会介绍)可以调用,可以在消息中指定要发送的 CQ 码,如下图: -![Echo and Say](./echo-and-say.png) +![Echo and Say](./assets/echo_and_say.png) 最后,`none.run(host='127.0.0.1', port=8080)` 让 NoneBot 跑在了地址 `127.0.0.1:8080` 上,向 CoolQ HTTP API 插件提供 `/`、`/ws/event/`、`/ws/api/` 三个入口,在我们的反向 WebSocket 配置中,插件利用了后两个入口。 -### 命令处理函数 +### 命令处理器 -现在,我们知道了最小 NoneBot 实例中已经加载了 `echo` 和 `say` 两个命令,在 [初步处理](#初步处理) 中也知道了消息内容符合命令的格式,并且解析出了命令的名字(`echo`),这时候消息处理函数发现,这条消息中解析出来的命令确实是存在的,于是它将剩余部分(`你好,世界`)当做命令的参数,并通过命令名获取到对应的命令处理函数,然后把命令、参数、消息事件中附带的其它信息一起打包成一个 Session 对象(具体来说,是一个 `CommandSession` 类的对象),传给命令处理函数并调用。 +现在,我们知道了最小 NoneBot 实例中已经加载了 `echo` 和 `say` 两个命令,在 [初步处理](#初步处理) 中也知道了消息内容符合命令的格式,并且从中拿到了命令名(`echo`),这时候消息处理函数发现,这条消息中解析出来的命令确实是存在的,于是它将剩余部分(`你好,世界`)当做命令的参数,并通过命令名获取到对应的命令处理器,然后把参数、消息事件中附带的其它信息一起打包成一个 Session 对象(具体来说,是一个 `CommandSession` 类的对象),传给命令处理器来调用它。 + +`echo` 命令处理器的代码其实非常简单,如下: + +```python +@on_command('echo') +async def echo(session: CommandSession): + await session.send(session.get_optional('message') or session.current_arg) +``` + +你现在不用关心它是如何从 Session 中拿到参数的,只需看到,命令处理器中实际内容只有一行 `session.send()` 函数调用,这个调用会直接把参数中的消息内容原样发送。 + +## 再次进入 CoolQ HTTP API 插件 + +命令处理器在调用 `session.send()` 之后,NoneBot 把消息内容发送给了 CoolQ HTTP API 插件那边已连接的反向 WebSocket 客户端,同时告诉它要把消息发送到和收到消息相同的地方(即接收到消息所在的群组、讨论组或私聊)。CoolQ HTTP API 插件明白了 NoneBot 的要求之后,会对消息做一些必要的处理,然后按照指示调用酷 Q 提供的相应接口。 + +## 一切又在酷 Q 结束 + +酷 Q 收到 CoolQ HTTP API 插件的接口调用之后,将消息内容发送给腾讯的服务器,就像一个真正的 QQ 客户端一样,于是你就收到了 QQ 机器人发来的消息了。 + +至此,我们已经理清楚了第一次对话中每一步到底都发生了些什么,以及 NoneBot 如何解析消息并调用到相应的命令处理器来进行回复。下面的几章中我们将一步一步地对最小 NoneBot 实例进行扩充,以实现一些非常棒的功能!