diff --git a/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs b/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs index bdcbd423c..41f3328e2 100644 --- a/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs +++ b/src/Discord.Net/Net/WebSockets/WS4NetEngine.cs @@ -1,9 +1,11 @@ #if !DOTNET5_4 +using SuperSocket.ClientEngine; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using WebSocket4Net; using WS4NetWebSocket = WebSocket4Net.WebSocket; namespace Discord.Net.WebSockets @@ -46,32 +48,11 @@ namespace Discord.Net.WebSockets _webSocket.NoDelay = true; _webSocket.Proxy = null; //Disable - _webSocket.DataReceived += (s, e) => - { - RaiseBinaryMessage(e.Data); - }; - _webSocket.MessageReceived += (s, e) => - { - RaiseTextMessage(e.Message); - }; - _webSocket.Error += async (s, e) => - { - _logger.Log(LogSeverity.Error, "WebSocket Error", e.Exception); - await _parent.SignalDisconnect(e.Exception, isUnexpected: true).ConfigureAwait(false); - _waitUntilConnect.Set(); - }; - _webSocket.Closed += async (s, e) => - { - /*string code = e.WasClean ? e.Code.ToString() : "Unexpected"; - string reason = e.Reason != "" ? e.Reason : "No Reason";*/ - var ex = new Exception($"Got Close Message");// ({code}): {reason}"); - await _parent.SignalDisconnect(ex, isUnexpected: false/*true*/).ConfigureAwait(false); - _waitUntilConnect.Set(); - }; - _webSocket.Opened += (s, e) => - { - _waitUntilConnect.Set(); - }; + _webSocket.DataReceived += OnWebSocketBinary; + _webSocket.MessageReceived += OnWebSocketText; + _webSocket.Error += OnWebSocketError; + _webSocket.Closed += OnWebSocketClosed; + _webSocket.Opened += OnWebSocketOpened; _waitUntilConnect.Reset(); _webSocket.Open(); @@ -87,11 +68,43 @@ namespace Discord.Net.WebSockets var socket = _webSocket; _webSocket = null; if (socket != null) + { + //We dont want a slow disconnect to mess up the next connection, so lets just unregister events + socket.DataReceived -= OnWebSocketBinary; + socket.MessageReceived -= OnWebSocketText; + socket.Error -= OnWebSocketError; + socket.Closed -= OnWebSocketClosed; + socket.Opened -= OnWebSocketOpened; socket.Close(); + } return TaskHelper.CompletedTask; } + private async void OnWebSocketError(object sender, ErrorEventArgs e) + { + await _parent.SignalDisconnect(e.Exception, isUnexpected: true).ConfigureAwait(false); + _waitUntilConnect.Set(); + } + private async void OnWebSocketClosed(object sender, EventArgs e) + { + var ex = new Exception($"Connection lost or close message received."); + await _parent.SignalDisconnect(ex, isUnexpected: false/*true*/).ConfigureAwait(false); + _waitUntilConnect.Set(); + } + private void OnWebSocketOpened(object sender, EventArgs e) + { + _waitUntilConnect.Set(); + } + private void OnWebSocketText(object sender, MessageReceivedEventArgs e) + { + RaiseTextMessage(e.Message); + } + private void OnWebSocketBinary(object sender, DataReceivedEventArgs e) + { + RaiseBinaryMessage(e.Data); + } + public IEnumerable GetTasks(CancellationToken cancelToken) { return new Task[]