跳到主要内容

事件响应机制

PepperBot 的事件响应

事件响应的实现,很像是 Django 的类视图,如果你对 Django 很熟悉,对 PepperBot 的事件响应也一定很眼熟

class MyClassHandler:
async def group_message(self,...):
...

async def group_request(self,...):
...

async def been_invited_to_group(self,...):
...

async def group_member_increased(self,...):
...

在 PepperBot 中,我们通过类的方法的名字,将所有事件映射了上去,就像 Django 的类视图,get 方法,对应 get 请求,post 方法,对应 post 请求,

在 PepperBot 中,比如,我们想处理群消息事件,我们只需要将方法的名字,设置为 group_message,当接收到群消息事件时,就会自动调用这个方法

同理,加群事件触发时,会自动调用 group_request 方法

信息

并不需要定义所有事件对应的方法,只需要定义需要处理的事件即可

同步还是异步?

方法可以同步也可以异步

    def group_message(self):
...

    async def group_message(self):
...

都是可以的

不过 PepperBot 的 API 基本都是异步的,所以建议没有讲究的话,默认选择异步就好

因为只有在async函数中,才能使用await关键字,其它和同步没啥区别

可用的事件名

目前尚未实现所有的事件,已实现的事件和对应的参数,可以参考这个文件

该参数列表的具体使用,我们会在事件参数部分具体讲解

如果你打开了上方的文件,会发现事件根据平台做了区分,比如 QQ 的事件,都是以 onebot 开头的,微信的事件,都是以 keaimao 开头的

没有 onebot、keaimao 之类的前缀的事件,都是跨平台事件,我们接下来具体讨论

跨平台事件

什么是跨平台事件呢?比如群聊消息事件,如果我们说,我们实现了跨平台的群聊消息事件,意思就是,不管我们是接受到了 QQ 的群消息事件,还是微信的群消息事件,PepperBot 都会将其转化为统一的,PepperBot 风格的群消息事件,也就是说,我们可以在同一个函数定义中,实现对多个平台类似事件的响应。

不同平台的协议端,哪怕都只是发送一条文字消息,其实现的 API 也各不相同,如果要对每一个平台都手动选择对应的 API,显然很难称之为跨平台。为了解决跨平台的 API 调用,PepperBot 也提供了跨平台的,统一的 API。

我们可以通过 PepperBot 提供的统一的 API 书写逻辑,PepperBot 内部,会将跨平台的 API 调用,转化为各个平台特定的数据结构,这一切都是由框架完成的,所以用户看到的,就是在平台间保持一致的 API

总的来说,跨平台 == 跨平台事件 + 跨平台 API

API 的使用,会在调用 API中具体讲解

平台独立事件

使用平台独立事件的场景有三种

第一,尚未实现跨平台事件,只能使用平台独立事件

第二,只想对特定平台的特定事件做出响应

比如,我们同时对接了 QQ 和微信的协议端,但是我们只想对 QQ 的私聊消息响应,只对微信的群聊消息响应,那么显然,此时直接使用平台独立事件,要比使用跨平台事件,再在其内判断消息是来自哪个平台,代码的可读性要好得多


async def onebot_private_message(self):
...

async def keaimao_group_message(self):
...

第三,实现了跨平台事件,但是相对不同平台做一些不同的操作

还是群消息事件,比如,我们想收到来自 QQ 的群消息时,做这些操作;收到来自微信的消息时,做那些操作,那么,就可以将两者共有的操作放在跨平台事件下,再在各自的平台独立事件下,定义专属的逻辑


async def group_message(self):
# 收到QQ和微信的群消息时,都执行的操作

async def onebot_group_message(self):
# 只有当收到QQ消息时,执行的操作

async def keaimao_group_message(self):
# 只有当收到微信消息时,执行的操作

都定义了的情况

如果平台独立事件有对应的跨平台事件,而你也定义了该事件的跨平台事件平台独立事件,那么,都会调用,先调用跨平台事件,再调用平台独立事件

还是一样的示例代码


async def group_message(self):
# 收到QQ和微信的群消息时,都执行的操作

async def onebot_group_message(self):
# 只有当收到QQ消息时,执行的操作

async def keaimao_group_message(self):
# 只有当收到微信消息时,执行的操作

当收到 QQ 消息时,先执行group_message,然后执行onebot_group_message

当收到微信消息时,先执行group_message,然后执行keaimao_group_message