网关
网关由 Client 管理。应用代码通常通过实现 EventHandler 来处理网关流量。
生命周期
调用 client.start().await 后,框架会:
- 校验
Token; - 创建共享的
BotApi; - 通过
get_bot_info获取 bot 信息; - 通过
get_gateway获取网关元信息; - 根据返回的 URL、shard 数和 session start limit 创建 shard session;
- 连接每个 shard,完成鉴权,发送心跳,并把 gateway dispatch payload 转发到 client 事件循环。
随后 client 会把每个 gateway dispatch 解析成对应的 Rust 模型,并调用匹配的 EventHandler 方法。
心跳与重连
收到 HELLO 后,runtime 使用服务端给出的 heartbeat interval 启动心跳任务。心跳会携带最后一次收到的 sequence number。socket 关闭时,runtime 会用缓存的 session id 和 sequence number 尝试 resume。不可 resume 的关闭码会触发新的 identify;致命 identify 错误会停止该 shard 的重连循环,并由 session manager 记录日志。
session manager 会根据 session_start_limit.max_concurrency 间隔启动 shard,避免网络恢复后集中重连。
事件分发
已知事件名会解析成类型化 payload。例如:
READY->ready(ReadySession)AT_MESSAGE_CREATE->message_create(ChannelReplySession)DIRECT_MESSAGE_CREATE->direct_message_create(DirectReplySession)GROUP_AT_MESSAGE_CREATE->group_message_create(GroupReplySession)C2C_MESSAGE_CREATE->c2c_message_create(C2CReplySession)MESSAGE_REACTION_ADD/MESSAGE_REACTION_REMOVE-> 表情回应回调- guild、channel、member、manage、audio、forum、open-forum 事件 -> 对应回调
未知事件名会进入 unknown_event(UnknownEventSession),这样平台新增事件时仍然可以被观察到。
可配置项
公开配置项保持很小:
Client::new(token, intents, handler, is_sandbox)Client::with_config(token, intents, handler, timeout, is_sandbox)Intents控制 QQ 会发送哪些 gateway 事件类别。is_sandbox控制 REST 和 gateway discovery 是否使用沙箱环境。