事件 (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
 
成功关闭服务器后触发。