Skip to content

Commit 35b13e6

Browse files
authored
Fix handling of heartbeat gateway event (#3105)
1 parent 643f048 commit 35b13e6

File tree

2 files changed

+9
-27
lines changed

2 files changed

+9
-27
lines changed

src/gateway/shard.rs

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -309,30 +309,6 @@ impl Shard {
309309
None
310310
}
311311

312-
#[instrument(skip(self))]
313-
fn handle_heartbeat_event(&mut self, s: u64) -> ShardAction {
314-
info!("[{:?}] Received shard heartbeat", self.shard_info);
315-
316-
// Received seq is off -- attempt to resume.
317-
if s > self.seq + 1 {
318-
info!(
319-
"[{:?}] Received off sequence (them: {}; us: {}); resuming",
320-
self.shard_info, s, self.seq
321-
);
322-
323-
if self.stage == ConnectionStage::Handshake {
324-
self.stage = ConnectionStage::Identifying;
325-
326-
return ShardAction::Identify;
327-
}
328-
warn!("[{:?}] Heartbeat during non-Handshake; auto-reconnecting", self.shard_info);
329-
330-
return ShardAction::Reconnect(self.reconnection_type());
331-
}
332-
333-
ShardAction::Heartbeat
334-
}
335-
336312
#[instrument(skip(self))]
337313
fn handle_gateway_closed(
338314
&mut self,
@@ -442,7 +418,11 @@ impl Shard {
442418
pub fn handle_event(&mut self, event: &Result<GatewayEvent>) -> Result<Option<ShardAction>> {
443419
match event {
444420
Ok(GatewayEvent::Dispatch(seq, event)) => Ok(self.handle_gateway_dispatch(*seq, event)),
445-
Ok(GatewayEvent::Heartbeat(s)) => Ok(Some(self.handle_heartbeat_event(*s))),
421+
Ok(GatewayEvent::Heartbeat(..)) => {
422+
info!("[{:?}] Received shard heartbeat", self.shard_info);
423+
424+
Ok(Some(ShardAction::Heartbeat))
425+
},
446426
Ok(GatewayEvent::HeartbeatAck) => {
447427
self.last_heartbeat_ack = Some(Instant::now());
448428
self.last_heartbeat_acknowledged = true;

src/model/event.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ pub struct MessagePollVoteRemoveEvent {
10981098
#[serde(untagged)]
10991099
pub enum GatewayEvent {
11001100
Dispatch(u64, Event),
1101-
Heartbeat(u64),
1101+
Heartbeat(#[deprecated = "always 0 because it is never provided by the gateway"] u64),
11021102
Reconnect,
11031103
/// Whether the session can be resumed.
11041104
InvalidateSession(bool),
@@ -1118,7 +1118,9 @@ impl<'de> Deserialize<'de> for GatewayEvent {
11181118
deserialize_val(Value::from(map))?,
11191119
),
11201120
Opcode::Heartbeat => {
1121-
GatewayEvent::Heartbeat(seq.ok_or_else(|| DeError::missing_field("s"))?)
1121+
// Placeholder value. Discord expects the last Dispatch
1122+
// sequence number and doesn't send it with the heartbeat.
1123+
GatewayEvent::Heartbeat(0)
11221124
},
11231125
Opcode::InvalidSession => {
11241126
GatewayEvent::InvalidateSession(remove_from_map(&mut map, "d")?)

0 commit comments

Comments
 (0)