From e4c4b3b41fba07e0fab286c868fe7f2ade71642f Mon Sep 17 00:00:00 2001 From: barelyprofessional <150058423+barelyprofessional@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:20:15 +1000 Subject: [PATCH] Hopeful fix for invalid operation exception when reconnecting to Howl and Discord --- KfChatDotNetKickBot/Services/Discord.cs | 11 ++++++++++- KfChatDotNetKickBot/Services/Howlgg.cs | 12 +++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/KfChatDotNetKickBot/Services/Discord.cs b/KfChatDotNetKickBot/Services/Discord.cs index 36d15c9..da43367 100644 --- a/KfChatDotNetKickBot/Services/Discord.cs +++ b/KfChatDotNetKickBot/Services/Discord.cs @@ -161,7 +161,16 @@ public class DiscordService "\"since\":0,\"activities\":[],\"afk\":false},\"compress\":false,\"client_state\":{\"guild_versions\":{}}}}"; _logger.Debug(initPayload); _wsClient.SendInstant(initPayload).Wait(_cancellationToken); - _heartbeatTask?.Dispose(); + if (_heartbeatTask != null) + { + _pingCts.Cancel(); + while (!_heartbeatTask.IsCompleted) + { + _logger.Debug("Waiting for heartbeat task to die"); + Task.Delay(TimeSpan.FromMilliseconds(100), _cancellationToken).Wait(_cancellationToken); + } + _heartbeatTask.Dispose(); + } _heartbeatInterval = TimeSpan.FromMilliseconds(packet.Data.GetProperty("heartbeat_interval").GetInt32()); _heartbeatTask = Task.Run(HeartbeatTimer, _cancellationToken); diff --git a/KfChatDotNetKickBot/Services/Howlgg.cs b/KfChatDotNetKickBot/Services/Howlgg.cs index 105b0bc..e80aeb1 100644 --- a/KfChatDotNetKickBot/Services/Howlgg.cs +++ b/KfChatDotNetKickBot/Services/Howlgg.cs @@ -143,7 +143,17 @@ public class Howlgg // Received on initial connection var packetData = JsonSerializer.Deserialize(message.Text.TrimStart('0')); _heartbeatInterval = TimeSpan.FromMilliseconds(packetData.GetProperty("pingInterval").GetInt32()); - _heartbeatTask?.Dispose(); + if (_heartbeatTask != null) + { + _pingCts.Cancel(); + while (!_heartbeatTask.IsCompleted) + { + _logger.Debug("Waiting for heartbeat task to die"); + Task.Delay(TimeSpan.FromMilliseconds(100), _cancellationToken).Wait(_cancellationToken); + } + _heartbeatTask.Dispose(); + } + _heartbeatTask = Task.Run(HeartbeatTimer, _cancellationToken); _logger.Info("Received connection packet from Howl.gg. Setting up heartbeat timer"); return;