| @@ -1,9 +1,11 @@ | |||||
| #if !DOTNET5_4 | #if !DOTNET5_4 | ||||
| using SuperSocket.ClientEngine; | |||||
| using System; | using System; | ||||
| using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Threading; | using System.Threading; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using WebSocket4Net; | |||||
| using WS4NetWebSocket = WebSocket4Net.WebSocket; | using WS4NetWebSocket = WebSocket4Net.WebSocket; | ||||
| namespace Discord.Net.WebSockets | namespace Discord.Net.WebSockets | ||||
| @@ -46,32 +48,11 @@ namespace Discord.Net.WebSockets | |||||
| _webSocket.NoDelay = true; | _webSocket.NoDelay = true; | ||||
| _webSocket.Proxy = null; //Disable | _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(); | _waitUntilConnect.Reset(); | ||||
| _webSocket.Open(); | _webSocket.Open(); | ||||
| @@ -87,11 +68,43 @@ namespace Discord.Net.WebSockets | |||||
| var socket = _webSocket; | var socket = _webSocket; | ||||
| _webSocket = null; | _webSocket = null; | ||||
| if (socket != 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(); | socket.Close(); | ||||
| } | |||||
| return TaskHelper.CompletedTask; | 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<Task> GetTasks(CancellationToken cancelToken) | public IEnumerable<Task> GetTasks(CancellationToken cancelToken) | ||||
| { | { | ||||
| return new Task[] | return new Task[] | ||||