app.receiver.on('message', callback) // 触发
app.group(123).receiver.on('message', callback) // 触发
app.groups.except(456).receiver.on('message', callback) // 触发
app.group(456).receiver.on('message', callback) // 不触发
app.user(123).receiver.on('message', callback) // 不触发
app.discusses.receiver.on('message', callback) // 不触发
# 接收器 (Receiver)
一个接收器是一个 EventEmitter 实例,其上封装了所有 CQHTTP 事件,并添加了一些专用于 Koishi 的事件。不同的事件可能触发在不同的上下文上。
# 事件:message
message 事件发生在机器人收到信息时,它会在相应的上下文触发。例如,一个发生在群 123 的 message 事件会有以下的触发效果:
message 事件还拥有以下的子事件:
- message/normal: 普通群聊天信息
- message/anonymous: 匿名群聊天信息
- message/notice: 群提醒信息
- message/friend: 好友私聊信息
- message/group: 群友私聊信息
- message/discuss: 讨论组私聊信息
- message/other: 其他私聊信息
所有的 message 事件的回调函数都会传入一个 Meta
对象。
注意
message/group 表示由非好友的群友发起的私聊信息,并不是群聊信息,请注意区分。群聊信息与其他信息的区分直接通过上下文而不是子事件实现。message/discuss 同理。
# 事件:request
request 事件发生于机器人收到请求时,会在相应的上下文触发。所有的 request 事件的回调函数都会传入一个 Meta
对象。这个事件本身不会触发,只会通过以下子事件的形式触发:
- request/friend: 好友申请
- request/group/add: 加群申请
- request/group/invite: 群邀请
注意
如果与 Sender API 进行比对,你会发现这里有一个小坑:request/friend 事件对应着 sender.setFriendAddRequest()
,而两种 request/group 事件都对应着 sender.setGroupAddRequest()
,并没有 sender.setGroupInviteRequest()
这个方法,也就是说 Sender API 中的 add 与这里的 subType 是没有关系的!
# notice 系列事件
notice 系列事件发生于机器人收到提醒时,会在相应的上下文触发。所有这些事件的回调函数都会传入一个 Meta
对象。这些事件的共同点是 meta.postType
都为 'notice'
。
# 事件:friend-add
新增好友事件,会在好友上下文触发。
# 事件:group-increase
群成员增加事件,会在群上下文触发。拥有下面的子事件:
- group-increase/approve: 通过申请加群
- group-increase/invite: 通过邀请加群
# 事件:group-decrease
群成员减少事件,会在群上下文触发。拥有下面的子事件:
- group-decrease/leave: 主动退群
- group-decrease/kick: 非登录号被踢出群
- group-decrease/kick-me: 登录号被踢出群
# 事件:group-upload
群文件上传事件,会在群上下文触发。
# 事件:group-admin
群管理员变动事件,会在群上下文触发。拥有下面的子事件:
- group-admin/set: 设置管理员
- group-admin/unset: 取消管理员
# 事件:group-ban
群禁言变动事件,会在群上下文触发。拥有下面的子事件:
- group-admin/ban: 禁言
- group-admin/lift-ban: 解除禁言
# metaEvent 系列事件
metaEvent 系列事件对应这 CQHTTP 插件本身的元事件,只会在 App 实例触发。所有这些事件的回调函数都会传入一个 Meta
对象。这些事件的共同点是 meta.postType
都为 'meta_event'
。
# 事件:heartbeat
心跳元事件,仅对 WebSocket 生效。产生此事件需要通过将配置项 enable_heartbeat
设置为 true
,并可通过 heartbeat_interval
配置心跳间隔(单位毫秒)。
# 事件:lifecycle
生命周期事件,仅对 HTTP 生效。拥有下面的子事件:
- lifecycle/enable: CQHTTP 插件启用
- lifecycle/disable: CQHTTP 插件停用
- lifecycle/connect: 成功建立 WebSocket 连接
# Koishi 内部事件
以下事件与 CQHTTP 无关,是 Koishi 内部的事件。
# 事件:before-connect
开始连接到服务器时在 App 实例触发。
# 事件:connect
成功连接到服务器时在 App 实例触发。
# 事件:ready
成功连接到服务器且已经获得 QQ 号时触发。参见 ready 事件。
# 事件:error
运行时产生错误时在 App 实例触发。调用时传入一个 Error 对象。拥有下面的子事件:
- error/command: 指令调用出错
- error/middleware: 中间件调用出错
# 事件:before-group
当 Koishi 试图从数据库获取群信息前触发。调用时会传入一个 Set<GroupField>
对象和一个 ParsedCommandLine
对象。如果当前没有正在解析的指令,则该对象只会有一个 meta
属性。你可以在回调函数中修改传入的字段集合,增加的字段将可以被之后的中间件获取到。
如果没有配置数据库,则该事件不会触发。
# 事件:before-user
当 Koishi 试图从数据库获取用户信息前触发。调用时会传入一个 Set<UserField>
对象和一个 ParsedCommandLine
对象。如果当前没有正在解析的指令,则该对象只会有一个 meta
属性。你可以在回调函数中修改传入的字段集合,增加的字段将可以被之后的中间件获取到。
如果没有配置数据库,则该事件不会触发。
# 事件:attach deprecated
请使用 attach-user 事件。
# 事件:attach-group 1.10.0+
当 Koishi 完成群数据获取后触发。调用时会传入一个 Meta 对象,将会拥有 $group
属性。你可以在回调函数中对这两个属性做同步的修改(注意:只能是同步的修改)。这些修改会在后续过程中自动更新到数据库。
如果没有配置数据库或不是群聊消息,则该事件不会触发。
# 事件:attach-user 1.10.0+
当 Koishi 完成用户数据获取后触发。调用时会传入一个 Meta 对象,将会拥有 $user
属性(如果是群消息则还会拥有 $group
属性)。你可以在回调函数中对这两个属性做同步的修改(注意:只能是同步的修改)。这些修改会在后续过程中自动更新到数据库。
如果没有配置数据库,则该事件不会触发。
# 事件:before-send
准备发送信息时会在对应的上下文触发。调用时会传入一个伪 Meta 对象,拥有与 Meta
对象类似的结构,但是 postType
字段为 send
。
# 事件:send
成功发送信息时会在对应的上下文触发。调用时会传入一个伪 Meta 对象,比 before-send
事件传入的对象多出一个 messageId
属性。
提示
注意只有非异步 Sender API 成功调用会触发此事件,而异步调用和快速回复都只会触发 before-send
事件,因此你在实际使用中可能更需要上一个事件。
# 事件:before-command
调用指令前会在对应的上下文触发。此时指令的可用性还未经检测,因此可能出现参数错误、权限不足、超过使用次数等情况。调用时传入一个 ParsedCommandLine
对象。
# 事件:command
执行指令的 action
回调函数前会在对应的上下文触发。调用时传入一个 ParsedCommandLine
对象。
# 事件:after-command
成功调用指令后会在对应的上下文触发。如果调用过程出错或者在指令内部触发 next
则不会触发。调用时传入一个 ParsedCommandLine
对象。
# 事件:after-middleware
在执行完全部中间件后会在对应的上下文触发。调用时传入一个 Meta
对象。
# 事件:before-disconnect
关闭服务器前在 App 实例触发。
# 事件:disconnect
成功关闭服务器时在 App 实例触发。
# 事件:logger 1.3.0+
当调用 Logger 方法时在 App 实例触发。拥有下面的子事件,分别在对应的方法被调用时触发:
- logger/success
- logger/error
- logger/info
- logger/warn
- logger/debug
调用时传入的第一个参数是字符串,表示产生输出的来源;第二个参数也是字符串,表示输出的内容。logger 事件本身还会产生第三个字符串参数表示输出的类型,如 info
等等。
← 应用 (App) 发送器 (Sender) →