Skip to content

事件订阅

通过 @bot.subscribe() 装饰器,你可以订阅房间内的各种事件,实时响应变化。

基本用法

typescript
new (class {
  @bot.subscribe('事件名称')
  async handler(data) {
    // 处理事件
  }
})()

事件类型

生命周期事件

事件名触发时机载荷类型
before-start机器人启动前void
after-start机器人启动后void
before-stop机器人关闭前void
after-stop机器人关闭后void

WebSocket 消息事件

事件名触发时机载荷类型
websocket-message收到任何 WebSocket 消息WSMsgImpl

房间事件

事件名触发时机载荷类型
command-message收到指令消息CommandWSMsg
user-join-or-leave-room用户加入或离开房间UserJoinOrLeaveRoomWSMsg
user-add-or-remove-emoji-to-msg用户对消息发表/取消表情反应UserAddOrRemoveEmojiToMsgWSMsg
card-message-btn-click用户点击卡片消息按钮CardMessageBtnClickWSMsg
user-im-message收到用户私信UserImMessageWSMsg

使用示例

监听用户进出房间

typescript
new (class {
  @bot.subscribe('user-join-or-leave-room')
  async onUserJoinOrLeave(data: UserJoinOrLeaveRoomWSMsg) {
    const name = data.userInfo.nickname
    if (data.isJoin) {
      this.sendMsg(`欢迎 ${name} 加入房间!`)
    } else {
      this.sendMsg(`${name} 离开了房间`)
    }
  }
})()

监听表情反应

typescript
new (class {
  @bot.subscribe('user-add-or-remove-emoji-to-msg')
  async onEmojiReaction(data: UserAddOrRemoveEmojiToMsgWSMsg) {
    // data.addOrRemove: 'add' | 'remove'
    // data.emojiId: 表情 ID
    // data.msgId: 消息 ID
    // data.userInfo: 操作用户信息
  }
})()

监听卡片按钮点击

typescript
new (class {
  @bot.subscribe('card-message-btn-click')
  async onCardBtnClick(data: CardMessageBtnClickWSMsg) {
    // data.buttonId: 按钮 ID
    // data.value: 按钮值
    // data.userInfo: 点击用户信息
    this.sendMsg(`${data.userInfo.nickname} 点击了按钮`)
  }
})()

监听原始 WebSocket 消息

typescript
new (class {
  @bot.subscribe('websocket-message')
  async onRawMessage(data: WSMsgImpl) {
    console.log('收到消息:', data.type)
    // data.type: 消息类型码
    // 50 = 指令消息
    // 3001 = 用户进出房间
    // 5003 = 表情反应
    // card_message_btn_click = 卡片按钮点击
    // 5 = 用户私信
  }
})()

指令消息 vs 指令装饰器

注意:command-message 事件会在任何指令被触发时收到,而 @bot.command() 装饰器只会匹配你注册的具体指令。一般情况下,使用 @bot.command() 装饰器更简洁。

Released under the LGPL-3.0 License.