fix(gateway): properly check for reconnect
Some checks failed
Build and push Rust service Docker images / rust docker build (push) Has been cancelled
rust checks / cargo fmt (push) Has been cancelled

This commit is contained in:
asleepyskye 2025-09-19 09:30:20 -04:00
parent 24361d9d2b
commit 39179f8e3a

View file

@ -6,7 +6,7 @@ use std::sync::Arc;
use tokio::sync::mpsc::Sender; use tokio::sync::mpsc::Sender;
use tracing::{error, info, warn}; use tracing::{error, info, warn};
use twilight_gateway::{ use twilight_gateway::{
CloseFrame, ConfigBuilder, Event, EventTypeFlags, Message, Shard, ShardId, create_iterator, ConfigBuilder, Event, EventTypeFlags, Message, Shard, ShardId, create_iterator,
}; };
use twilight_model::gateway::{ use twilight_model::gateway::{
Intents, Intents,
@ -118,8 +118,11 @@ pub async fn runner(
Message::Close(frame) => { Message::Close(frame) => {
let mut state_event = ShardStateEvent::Closed; let mut state_event = ShardStateEvent::Closed;
let close_code = if let Some(close) = frame { let close_code = if let Some(close) = frame {
if close == CloseFrame::RESUME { match close.code {
state_event = ShardStateEvent::Reconnect; 4000..=4003 | 4005..=4009 => {
state_event = ShardStateEvent::Reconnect;
}
_ => {}
} }
close.code.to_string() close.code.to_string()
} else { } else {
@ -176,32 +179,45 @@ pub async fn runner(
) )
.increment(1); .increment(1);
// update shard state and discord cache // check for shard status events
if matches!(event, Event::Ready(_)) || matches!(event, Event::Resumed) { match event {
if let Err(error) = tx_state.try_send(( Event::Ready(_) | Event::Resumed => {
shard.id(), if let Err(error) = tx_state.try_send((
ShardStateEvent::Other, shard.id(),
Some(event.clone()), ShardStateEvent::Other,
None, Some(event.clone()),
)) { None,
tracing::error!(?error, "error updating shard state"); )) {
tracing::error!(?error, "error updating shard state");
}
} }
} Event::GatewayReconnect => {
// need to do heartbeat separately, to get the latency if let Err(error) = tx_state.try_send((
let latency_num = shard shard.id(),
.latency() ShardStateEvent::Reconnect,
.recent() Some(event.clone()),
.first() None,
.map_or_else(|| 0, |d| d.as_millis()) as i32; )) {
if let Event::GatewayHeartbeatAck = event tracing::error!(?error, "error updating shard state for reconnect");
&& let Err(error) = tx_state.try_send(( }
shard.id(), }
ShardStateEvent::Heartbeat, Event::GatewayHeartbeatAck => {
Some(event.clone()), // need to do heartbeat separately, to get the latency
Some(latency_num), let latency_num = shard
)) .latency()
{ .recent()
tracing::error!(?error, "error updating shard state for latency"); .first()
.map_or_else(|| 0, |d| d.as_millis()) as i32;
if let Err(error) = tx_state.try_send((
shard.id(),
ShardStateEvent::Heartbeat,
Some(event.clone()),
Some(latency_num),
)) {
tracing::error!(?error, "error updating shard state for latency");
}
}
_ => {}
} }
if let Event::Ready(_) = event { if let Event::Ready(_) = event {