Skip to content

Intents

Intents 是一个 32 位标志集,告诉 QQ 网关你的机器人希望接收哪些事件类别。只订阅自己需要的事件可以减少网关流量,也避免框架为不会处理的事件做无用功。

rust
pub struct Intents { pub bits: u32 }

Intents 实现了 Copy,支持位运算 (|&^!),并直接以原始 u32 序列化进网关 Identify 载荷。

构造

  • Intents::new() —— 空集合(bits == 0)。
  • Intents::default() —— 标准公域预设:all() 去掉 GUILD_MESSAGESFORUMSENTER_AIO 仍需显式开启。
  • Intents::all() —— 框架表示的全部标准标志,但不包含 ENTER_AIO。它会包含特权位,请只在权限已审批时使用。
  • Intents::from_bits(bits) —— 把配置或外部传入的整数包成 Intents

标志位一览

每行包含 Rust 常量、底层位、with_* 构建器以及简短说明。

常量构建器含义
Intents::GUILDS1 << 0with_guilds频道创建/更新/删除以及子频道 CRUD。
Intents::GUILD_MEMBERS1 << 1with_guild_members成员加入/更新/退出。
Intents::GUILD_MESSAGES(特权)1 << 9with_guild_messages全部频道消息——需要特权审批。
Intents::GUILD_MESSAGE_REACTIONS1 << 10with_guild_message_reactions频道消息表情回应增/删。
Intents::DIRECT_MESSAGE1 << 12with_direct_message私信创建/删除事件。
Intents::OPEN_FORUM_EVENT1 << 18with_open_forum_event公域论坛活动事件。
Intents::AUDIO_OR_LIVE_CHANNEL_MEMBER1 << 19with_audio_or_live_channel_member语音/直播子频道的成员变化。
Intents::ENTER_AIO1 << 23with_enter_aio用户进入 AIO 聊天面板。
Intents::PUBLIC_MESSAGES1 << 25with_public_messages@bot 消息、C2C 消息、好友事件。
Intents::INTERACTION1 << 26with_interaction互动(按钮/应用)回调。
Intents::MESSAGE_AUDIT1 << 27with_message_audit消息审核通过/拒绝。
Intents::FORUMS(特权)1 << 28with_forums全部论坛事件——需要特权审批。
Intents::AUDIO_ACTION1 << 29with_audio_action音频开始/结束/上麦/下麦事件。
Intents::PUBLIC_GUILD_MESSAGES1 << 30with_public_guild_messages@bot 消息及公域消息删除事件。

查询

对每个标志都有匹配的无参谓词:intents.guilds()intents.public_guild_messages() 等。两个常用的辅助方法:

  • intents.contains(bits) —— 通用位归属判断。
  • intents.has_privileged() —— 当 GUILD_MESSAGESFORUMS 被启用时返回 true

修改

  • with_intent(bits) / without_intent(bits) —— 通用链式 setter。
  • bits() —— 返回原始 u32
  • Display 实现会输出 Intents(GUILDS | DIRECT_MESSAGE | …),便于日志记录。

示例

rust
// 1. 公域预设,不开启特权事件,也不包含 ENTER_AIO。
let default_intents = Intents::default();

// 2. 从空集合开始,用 builder 自定义订阅。
let custom = Intents::new()
    .with_guilds()
    .with_public_guild_messages()
    .with_direct_message();

// 3. 直接位组合。
let public = Intents::from_bits(
    Intents::GUILDS | Intents::PUBLIC_GUILD_MESSAGES | Intents::DIRECT_MESSAGE,
);

// 4. 运行时摘除某个标志。
let trimmed = Intents::all().without_intent(Intents::FORUMS);

特权 intent

GUILD_MESSAGESFORUMS 需要 QQ 开放平台手动审批通过。未获得审批的机器人在 identify 阶段会被网关断开。Intents::default() 默认不开启它们,方便所有机器人共用同一份代码路径。ENTER_AIO 不属于公域预设,需要通过 with_enter_aio() 单独开启。

rust
if intents.has_privileged() && !your_bot_is_approved {
    return Err("特权 intent 未获审批".into());
}

参见

  • Bot API —— 可能产出这些事件的全部接口。
  • 事件处理器 —— 接收这些 intent 选中的事件。
  • 网关指南 —— 框架如何使用所选 intent 建立会话。

基于 MIT 许可证发布