From 2a014bf8f82c6c052c2c57555beb9914f6f92c19 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 24 May 2025 13:20:45 -0500 Subject: [PATCH] fix: change order of resuming and make sure to reset heartbeat tracking values after canceling the heartbeat task --- .../Discord/Gateway/DiscordGatewayClient.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs index 9984b63..64d3a3d 100644 --- a/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs +++ b/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs @@ -238,17 +238,17 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient switch (e) { case HelloDiscordEvent he: + _logger.LogInformation("Hello event received"); await SetHeartbeatIntervalAsync(he.Data.HeartbeatInterval, cancellationToken); await StartHeartbeatAsync(cancellationToken); await IdentifyAsync(cancellationToken); - _logger.LogInformation("Hello event received"); break; case HeartbeatAckDiscordEvent: + _logger.LogInformation("Heartbeat acknowledged event received"); await SetHeartbeatAcknowledgedAsync(_timeProvider.GetUtcNow(), cancellationToken); - _logger.LogInformation("Heartbeat acknowledged"); break; case HeartbeatDiscordEvent: - _logger.LogInformation("Heartbeat request received"); + _logger.LogInformation("Heartbeat request event received"); await SendHeartbeatAsync(cancellationToken); break; case DispatchDiscordEvent de: @@ -257,9 +257,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient if (de is ReadyDiscordEvent re) { + _logger.LogInformation("Ready event received"); await SetSessionIdAsync(re.Data.SessionId, cancellationToken); await SetResumeGatewayUrlAsync(re.Data.ResumeGatewayUrl, cancellationToken); - _logger.LogInformation("Ready event received"); } if (_eventHandlers.TryGetValue(eventType, out var handler)) @@ -377,6 +377,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient private async Task ReconnectAsync(CancellationToken cancellationToken) { await CancelHeartbeatTaskAsync(cancellationToken); + await SetHeartbeatSentAsync(DateTimeOffset.MinValue, cancellationToken); + await SetHeartbeatAcknowledgedAsync(DateTimeOffset.MinValue, cancellationToken); + await CancelReceiveMessagesTaskAsync(cancellationToken); var closeStatus = _canResume ? WebSocketCloseStatus.MandatoryExtension : WebSocketCloseStatus.NormalClosure; @@ -395,9 +398,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient await SetWebSocketAsync(_webSocketFactory.Create(), cancellationToken); await ConnectWithResumeUrlAsync(cancellationToken); - await SendResumeAsync(cancellationToken); await StartReceiveMessagesAsync(cancellationToken); await StartHeartbeatAsync(cancellationToken); + await SendResumeAsync(cancellationToken); return; }