Skip to content

事件系统

icqq 的客户端是一个事件发射器。收到消息、有人加群、登录需要扫码……这些都通过事件通知你的代码。

监听、取消监听

js
// 假设 client 已创建
client.on("message", (e) => {
  console.log(e.raw_message);
});

// 只触发一次
client.once("system.online", () => {
  console.log("上线了");
});

// 取消监听(需要传入同一个函数引用)
function onMsg(e) {}
client.on("message", onMsg);
client.off("message", onMsg);

事件名是分层的

事件名用 . 分层,监听父事件能收到它的所有子事件

  • 监听 message —— 收到全部消息(私聊 + 群 + 讨论组)。
  • 监听 message.group —— 只收群消息
  • 监听 message.private —— 只收私聊消息

回调参数里都有 sub_type 等字段,可进一步区分。下面按类别列出主要事件。详尽的字段表见 事件类型参考

消息事件 message.*

事件触发时机关键 payload
message收到任意消息messageraw_messagesender
message.private收到私聊消息friendsendermessage
message.group收到群消息group_idgroupmembersendermessage
message.discuss收到讨论组消息discussmessage
message.guild收到频道消息频道消息事件
  • message 是已解析的消息段数组 MessageElem[]raw_message 是文本化预览。
  • 所有消息事件都带便捷方法 e.reply(content, quote?) 快速回复;群消息事件还带 e.recall() 撤回本条。
js
client.on("message.group", (e) => {
  if (e.raw_message === "ping") {
    e.reply("pong", true); // 第二个参数 true 表示引用对方这条消息
  }
});

通知事件 notice.*

好友相关 notice.friend.*

事件触发时机关键 payload
notice.friend.increase新增好友user_idnickname
notice.friend.decrease好友减少user_idnickname
notice.friend.recall好友撤回消息operator_idmessage_id
notice.friend.poke好友戳一戳operator_idtarget_idaction

群相关 notice.group.*

事件触发时机关键 payload
notice.group.increase群成员增加group_iduser_idnickname
notice.group.decrease群成员减少group_iduser_idoperator_iddismiss
notice.group.recall群消息撤回user_idoperator_idmessage_id
notice.group.admin管理员变更user_idset
notice.group.ban群禁言user_idoperator_idduration
notice.group.transfer群转让operator_iduser_id
notice.group.poke群内戳一戳operator_idtarget_idaction
notice.group.sign群打卡user_idnicknamesign_text
js
client.on("notice.group.increase", (e) => {
  e.group.sendMsg([segment.at(e.user_id), " 欢迎入群!"]);
});

请求事件 request.*

事件触发时机关键 payload
request.friend.add有人申请加你好友user_idcommentapprove()
request.friend.single对方已单向加你为好友user_idapprove()
request.group.add有人申请加群group_iduser_idcommentapprove()
request.group.invite你被邀请进群group_iduser_idapprove()

请求事件都带便捷方法 e.approve(yes?):传 true(默认)同意,传 false 拒绝。

js
client.on("request.friend.add", (e) => {
  e.approve(true); // 自动同意加好友
});

系统事件 system.*

事件触发时机关键 payload
system.online成功上线
system.offline下线message
system.offline.network因网络原因下线(默认自动重连)message
system.offline.kickoff被服务器踢下线message
system.login.qrcode收到登录二维码image(二维码图片 Buffer)
system.login.slider需要滑动验证url
system.login.device需要设备锁验证urlphone
system.login.error登录出错codemessage
js
client.on("system.online", () => console.log("登录成功"));

client.on("system.login.slider", (e) => {
  console.log("请到此地址完成滑块验证:", e.url);
});

同步事件 sync.*

多端登录时,你在其它设备上的操作会同步过来:

事件触发时机关键 payload
sync.message你在别处发的私聊消息同步过来私聊消息体
sync.read消息已读同步{ user_id, time }{ group_id, seq }
sync.read.private私聊已读同步user_idtime
sync.read.group群聊已读同步group_idseq
js
client.on("sync.message", (e) => {
  console.log("我在其它设备发了:", e.raw_message);
});

相关