事件 (Events)
建议配套阅读:事件与生命周期
上报事件
所有的上报事件都是通过 emit 方式在对应的上下文中触发的(即上下文选择器对这些事件有效,且回调函数的返回值不会影响后续行为)。
通用会话属性
以下属性对所有会话都有:
- type:
string
事件名称 - subtype:
string
一级子事件名称 - subsubtype:
string
二级子事件名称 - platform:
string
产生事件的平台 - selfId:
string
收到事件的机器人的平台 ID - userId:
string
触发事件的用户的平台 ID - groupId:
string
触发事件的群组的平台 ID - channelId:
string
触发事件的频道的平台 ID - timestamp:
number
收到事件的 UNIX 时间,单位为毫秒
消息类事件
跟消息有关的几种事件统称为消息类事件,共有以下几种:
- message: 收到新消息
- message-deleted: 消息被删除
- message-updated: 消息被修改
- send: 机器人发出消息
这些事件都还拥有以下的子事件:
- private: 该消息是私聊消息
- group: 该消息是群组消息
与此类事件相关的属性有:
- messageId:
string
消息 ID - content:
string
消息内容 - author: 发送者信息
- author.userId:
string
发送者的平台 ID - author.avatar:
string
发送者的头像链接 - author.username:
string
发送者的平台昵称 - author.nickname:
string
发送者在当前群组中的昵称
- author.userId:
- quote: 引用的消息,同样包含
messageId
,content
等属性
成员类事件
跟群组、好友有关的事件统称为成员类事件,共有以下几种:
- group-added: 加入了群组
- group-deleted: 退出了群组
- group-request: 收到了群组邀请
- group-member-added: 群组成员增加
- group-member-deleted: 群组成员减少
- group-member-request: 收到了入群申请
- friend-added: 好友数量增加
- friend-deleted: 好友数量减少
- friend-request: 收到了好友请求
形如 group(-member)?-(added|deleted) 的事件拥有以下的子事件:
- active: 该操作是由加入或退出方发起的
- passive: 该操作是群组方发起的
形如 group(-member)?-(added|deleted) 的事件拥有以下的属性:
- operatorId:
string
操作者 ID
以 request 结尾的事件拥有下面的属性:
- messageId:
string
请求 ID,可用于 Bot 方法 - content:
string
请求文本
操作类事件
上报事件中最主要的一部分都有着统一的结构:事件主体 + 操作类型。例如好友请求事件是 friend-request,群组文件更新事件是 group-file-updated 等。目前支持的事件主体包括以下几种:
- friend
- channel
- group
- group-member
- group-role
- group-file
- group-emoji
操作类型包含以下几种:
- added
- removed
- deleted
群成员类事件
通知类事件
由系统在频道中发送的各种通知构成了通知类事件,共有以下几种:
- notice/poke: 戳一戳
- notice/lucky-king: 运气王
- notice/honor: 群荣誉
与此类事件相关的属性有:
- targetId:
string
戳一戳的目标用户 ID,运气王的获得者 ID - honorType:
string
荣誉类型,可能为 talkative, performer, emotion
内部事件
若非特别说明,这里的所有事件在全体上下文触发的(即上下文选择器对这些事件无效)。
事件:before-connect
- 触发方式: parallel
开始连接到服务器时触发。
事件:connect
- 触发方式: emit
成功连接到服务器时触发。如果一个插件在注册时,应用已经处于连接状态,则会立即触发。
事件:before-parse
- content:
string
要解析的文本 - session:
Session
当前会话 - 触发方式: bail
尝试将文本解析成 Argv 对象时调用。你可以在回调函数中返回一个 Argv 对象以覆盖默认的解析行为。
事件:parse
- argv:
Argv
运行时参数 - 触发方式: bail
尝试将一个未识别出指令的 Argv 对象识别成指令调用时使用。你可以在回调函数中修改传入的 Argv 对象,或者返回一个字符串表示识别出的指令。
事件:before-attach-channel
事件:before-attach-user
- session:
Session
当前会话 - fields:
Set<string>
要获取的字段列表 - 触发方式: emit
当 Koishi 试图从数据库获取频道 / 用户信息前触发。你可以在回调函数中通过 fields.add()
修改传入的字段集合,增加的字段将可以被指令以及之后的中间件获取到。
如果没有配置数据库,则两个事件都不会触发;如果不是群聊消息,则 before-attach-channel 事件不会触发。
事件:attach-channel
事件:attach-user
- session:
Session
当前会话 - 触发方式: serial
当 Koishi 完成频道 / 用户数据获取后触发。调用时会传入一个 Session 对象,将会拥有 channel
/user
属性。你可以在回调函数中修改这两个属性,这些修改会在后续过程中自动更新到数据库。如果你在回调函数中返回一个 truthy 值,则该会话不会触发指令以及之后的中间件。
如果没有配置数据库,则两个事件都不会触发;如果不是群聊消息,则 attach-channel 事件不会触发。
事件:before-send
- session:
Session
消息会话 - 触发方式: bail
即将发送信息时会在对应的上下文触发。调用时会传入一个事件类型为 send 的会话实例。由于该消息还未发送,这个会话并没有 messageId
属性。你可以通过修改 session.content
改变发送的内容,或者返回一个 truthy 值以取消该消息的发送。
事件:before-command
- argv:
Argv
运行时参数 - 触发方式: serial
调用指令前会在对应的上下文触发。此时指令的可用性还未经检测,因此可能出现参数错误、权限不足、超过使用次数等情况。你可以通过在回调函数中返回一个字符串以取消该指令的执行。进一步,如果该字符串非空,则会作为此指令执行的结果。
事件:command
- argv:
Argv
运行时参数 - 触发方式: parallel
指令调用完毕后会在对应的上下文触发。
事件:middleware
- session:
Session
当前会话 - 触发方式: emit
在执行完全部中间件后会在对应的上下文触发。
事件:before-disconnect
- 触发方式: parallel
关闭服务器前,或所属插件被卸载时触发。参见 可卸载的插件。
事件:disconnect
- 触发方式: emit
成功关闭服务器后触发。