Done whats-happened page

This commit is contained in:
Richard Chien 2018-08-16 23:18:13 +08:00
parent 83059013c3
commit c47867e755
2 changed files with 23 additions and 3 deletions

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -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 实例进行扩充,以实现一些非常棒的功能!