Use WebSocket4Net instead of WebSocketSharp
This commit is contained in:
@@ -62,8 +62,8 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="websocket-sharp, Version=1.0.2.59610, Culture=neutral, PublicKeyToken=5660b08a1845a91e, processorArchitecture=MSIL">
|
<Reference Include="WebSocket4Net, Version=0.14.1.0, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\..\..\DiscordBot\packages\WebSocketSharp.1.0.3-rc10\lib\websocket-sharp.dll</HintPath>
|
<HintPath>..\..\..\DiscordBot\packages\WebSocket4Net.0.14.1\lib\net45\WebSocket4Net.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -239,6 +239,9 @@
|
|||||||
<Compile Include="..\Discord.Net\Net\WebSockets\WebSocketSharpEngine.cs">
|
<Compile Include="..\Discord.Net\Net\WebSockets\WebSocketSharpEngine.cs">
|
||||||
<Link>Net\WebSockets\WebSocketSharpEngine.cs</Link>
|
<Link>Net\WebSockets\WebSocketSharpEngine.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="..\Discord.Net\Net\WebSockets\WS4NetEngine.cs">
|
||||||
|
<Link>Net\WebSockets\WS4NetEngine.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="..\Discord.Net\Services\IService.cs">
|
<Compile Include="..\Discord.Net\Services\IService.cs">
|
||||||
<Link>Services\IService.cs</Link>
|
<Link>Services\IService.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||||
<package id="RestSharp" version="105.2.3" targetFramework="net45" />
|
<package id="RestSharp" version="105.2.3" targetFramework="net45" />
|
||||||
<package id="WebSocketSharp" version="1.0.3-rc10" targetFramework="net45" />
|
<package id="WebSocket4Net" version="0.14.1" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
||||||
128
src/Discord.Net/Net/WebSockets/WS4NetEngine.cs
Normal file
128
src/Discord.Net/Net/WebSockets/WS4NetEngine.cs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
#if !DOTNET5_4
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using WS4NetWebSocket = WebSocket4Net.WebSocket;
|
||||||
|
|
||||||
|
namespace Discord.Net.WebSockets
|
||||||
|
{
|
||||||
|
internal class WS4NetEngine : IWebSocketEngine
|
||||||
|
{
|
||||||
|
private readonly DiscordConfig _config;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
private readonly ConcurrentQueue<string> _sendQueue;
|
||||||
|
private readonly WebSocket _parent;
|
||||||
|
private WS4NetWebSocket _webSocket;
|
||||||
|
private ManualResetEventSlim _waitUntilConnect;
|
||||||
|
|
||||||
|
public event EventHandler<WebSocketBinaryMessageEventArgs> BinaryMessage;
|
||||||
|
public event EventHandler<WebSocketTextMessageEventArgs> TextMessage;
|
||||||
|
private void RaiseBinaryMessage(byte[] data)
|
||||||
|
{
|
||||||
|
if (BinaryMessage != null)
|
||||||
|
BinaryMessage(this, new WebSocketBinaryMessageEventArgs(data));
|
||||||
|
}
|
||||||
|
private void RaiseTextMessage(string msg)
|
||||||
|
{
|
||||||
|
if (TextMessage != null)
|
||||||
|
TextMessage(this, new WebSocketTextMessageEventArgs(msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
internal WS4NetEngine(WebSocket parent, DiscordConfig config, Logger logger)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
_config = config;
|
||||||
|
_logger = logger;
|
||||||
|
_sendQueue = new ConcurrentQueue<string>();
|
||||||
|
_waitUntilConnect = new ManualResetEventSlim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task Connect(string host, CancellationToken cancelToken)
|
||||||
|
{
|
||||||
|
_webSocket = new WS4NetWebSocket(host);
|
||||||
|
_webSocket.EnableAutoSendPing = false;
|
||||||
|
_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();
|
||||||
|
};
|
||||||
|
|
||||||
|
_waitUntilConnect.Reset();
|
||||||
|
_webSocket.Open();
|
||||||
|
_waitUntilConnect.Wait(cancelToken);
|
||||||
|
return TaskHelper.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task Disconnect()
|
||||||
|
{
|
||||||
|
string ignored;
|
||||||
|
while (_sendQueue.TryDequeue(out ignored)) { }
|
||||||
|
|
||||||
|
var socket = _webSocket;
|
||||||
|
_webSocket = null;
|
||||||
|
if (socket != null)
|
||||||
|
socket.Close();
|
||||||
|
|
||||||
|
return TaskHelper.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Task> GetTasks(CancellationToken cancelToken)
|
||||||
|
{
|
||||||
|
return new Task[]
|
||||||
|
{
|
||||||
|
SendAsync(cancelToken)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task SendAsync(CancellationToken cancelToken)
|
||||||
|
{
|
||||||
|
var sendInterval = _config.WebSocketInterval;
|
||||||
|
return Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (!cancelToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
string json;
|
||||||
|
while (_sendQueue.TryDequeue(out json))
|
||||||
|
_webSocket.Send(json);
|
||||||
|
await Task.Delay(sendInterval, cancelToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException) { }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void QueueMessage(string message)
|
||||||
|
{
|
||||||
|
_sendQueue.Enqueue(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -75,7 +75,7 @@ namespace Discord.Net.WebSockets
|
|||||||
_connectedEvent = new ManualResetEventSlim(false);
|
_connectedEvent = new ManualResetEventSlim(false);
|
||||||
|
|
||||||
#if !DOTNET5_4
|
#if !DOTNET5_4
|
||||||
_engine = new WebSocketSharpEngine(this, _config, _logger);
|
_engine = new WS4NetEngine(this, _config, _logger);
|
||||||
#else
|
#else
|
||||||
//_engine = new BuiltInWebSocketEngine(this, _config, _logger);
|
//_engine = new BuiltInWebSocketEngine(this, _config, _logger);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#if !DOTNET5_4
|
/*#if !DOTNET5_4
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -42,7 +42,7 @@ namespace Discord.Net.WebSockets
|
|||||||
_webSocket = new WSSharpWebSocket(host);
|
_webSocket = new WSSharpWebSocket(host);
|
||||||
_webSocket.EmitOnPing = false;
|
_webSocket.EmitOnPing = false;
|
||||||
_webSocket.EnableRedirection = true;
|
_webSocket.EnableRedirection = true;
|
||||||
_webSocket.Compression = WebSocketSharp.CompressionMethod.Deflate;
|
//_webSocket.Compression = WebSocketSharp.CompressionMethod.Deflate;
|
||||||
_webSocket.SetProxy(null, null, null); //Disable
|
_webSocket.SetProxy(null, null, null); //Disable
|
||||||
//_webSocket.SetProxy(_config.ProxyUrl, _config.ProxyCredentials?.UserName, _config.ProxyCredentials?.Password);
|
//_webSocket.SetProxy(_config.ProxyUrl, _config.ProxyCredentials?.UserName, _config.ProxyCredentials?.Password);
|
||||||
_webSocket.OnMessage += (s, e) =>
|
_webSocket.OnMessage += (s, e) =>
|
||||||
@@ -115,4 +115,4 @@ namespace Discord.Net.WebSockets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif*/
|
||||||
@@ -35,10 +35,10 @@
|
|||||||
|
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
"net45": {
|
"net45": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"WebSocketSharp": "1.0.3-rc10",
|
"WebSocket4Net": "0.14.1",
|
||||||
"RestSharp": "105.2.3"
|
"RestSharp": "105.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dotnet5.4": {
|
"dotnet5.4": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
Reference in New Issue
Block a user