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,9 +118,12 @@ 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 {
4000..=4003 | 4005..=4009 => {
state_event = ShardStateEvent::Reconnect; state_event = ShardStateEvent::Reconnect;
} }
_ => {}
}
close.code.to_string() close.code.to_string()
} else { } else {
"unknown".to_string() "unknown".to_string()
@ -176,8 +179,9 @@ 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 {
Event::Ready(_) | Event::Resumed => {
if let Err(error) = tx_state.try_send(( if let Err(error) = tx_state.try_send((
shard.id(), shard.id(),
ShardStateEvent::Other, ShardStateEvent::Other,
@ -187,22 +191,34 @@ pub async fn runner(
tracing::error!(?error, "error updating shard state"); tracing::error!(?error, "error updating shard state");
} }
} }
Event::GatewayReconnect => {
if let Err(error) = tx_state.try_send((
shard.id(),
ShardStateEvent::Reconnect,
Some(event.clone()),
None,
)) {
tracing::error!(?error, "error updating shard state for reconnect");
}
}
Event::GatewayHeartbeatAck => {
// need to do heartbeat separately, to get the latency // need to do heartbeat separately, to get the latency
let latency_num = shard let latency_num = shard
.latency() .latency()
.recent() .recent()
.first() .first()
.map_or_else(|| 0, |d| d.as_millis()) as i32; .map_or_else(|| 0, |d| d.as_millis()) as i32;
if let Event::GatewayHeartbeatAck = event if let Err(error) = tx_state.try_send((
&& let Err(error) = tx_state.try_send((
shard.id(), shard.id(),
ShardStateEvent::Heartbeat, ShardStateEvent::Heartbeat,
Some(event.clone()), Some(event.clone()),
Some(latency_num), Some(latency_num),
)) )) {
{
tracing::error!(?error, "error updating shard state for latency"); tracing::error!(?error, "error updating shard state for latency");
} }
}
_ => {}
}
if let Event::Ready(_) = event { if let Event::Ready(_) = event {
if !cache.2.read().await.contains(&shard_id) { if !cache.2.read().await.contains(&shard_id) {