mirror of
https://github.com/PluralKit/PluralKit.git
synced 2026-02-04 04:56:49 +00:00
fix(gateway): properly check for reconnect
This commit is contained in:
parent
24361d9d2b
commit
39179f8e3a
1 changed files with 44 additions and 28 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue