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收到任意消息message、raw_message、sender
message.private收到私聊消息friend、sender、message
message.group收到群消息group_id、group、member、sender、message
message.discuss收到讨论组消息discuss、message
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_id、nickname
notice.friend.decrease好友减少user_id、nickname
notice.friend.recall好友撤回消息operator_id、message_id
notice.friend.poke好友戳一戳operator_id、target_id、action

群相关 notice.group.*:

事件触发时机关键 payload
notice.group.increase群成员增加group_id、user_id、nickname
notice.group.decrease群成员减少group_id、user_id、operator_id、dismiss
notice.group.recall群消息撤回user_id、operator_id、message_id
notice.group.admin管理员变更user_id、set
notice.group.ban群禁言user_id、operator_id、duration
notice.group.transfer群转让operator_id、user_id
notice.group.poke群内戳一戳operator_id、target_id、action
notice.group.sign群打卡user_id、nickname、sign_text
js
client.on("notice.group.increase", (e) => {
  e.group.sendMsg([segment.at(e.user_id), " 欢迎入群!"]);
});

请求事件 request.* ​

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

请求事件都带便捷方法 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需要设备锁验证url、phone
system.login.error登录出错code、message
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_id、time
sync.read.group群聊已读同步group_id、seq
js
client.on("sync.message", (e) => {
  console.log("我在其它设备发了:", e.raw_message);
});

相关 ​