Browse Source

Use WebSocket4Net instead of WebSocketSharp

tags/docs-0.9
RogueException 9 years ago
parent
commit
a0cbe5d3b2
6 changed files with 142 additions and 11 deletions
  1. +5
    -2
      src/Discord.Net.Net45/Discord.Net.csproj
  2. +1
    -1
      src/Discord.Net.Net45/packages.config
  3. +128
    -0
      src/Discord.Net/Net/WebSockets/WS4NetEngine.cs
  4. +1
    -1
      src/Discord.Net/Net/WebSockets/WebSocket.cs
  5. +3
    -3
      src/Discord.Net/Net/WebSockets/WebSocketSharpEngine.cs
  6. +4
    -4
      src/Discord.Net/project.json

+ 5
- 2
src/Discord.Net.Net45/Discord.Net.csproj View File

@@ -62,8 +62,8 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Net.Http" />
<Reference Include="websocket-sharp, Version=1.0.2.59610, Culture=neutral, PublicKeyToken=5660b08a1845a91e, processorArchitecture=MSIL">
<HintPath>..\..\..\DiscordBot\packages\WebSocketSharp.1.0.3-rc10\lib\websocket-sharp.dll</HintPath>
<Reference Include="WebSocket4Net, Version=0.14.1.0, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
<HintPath>..\..\..\DiscordBot\packages\WebSocket4Net.0.14.1\lib\net45\WebSocket4Net.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
@@ -239,6 +239,9 @@
<Compile Include="..\Discord.Net\Net\WebSockets\WebSocketSharpEngine.cs">
<Link>Net\WebSockets\WebSocketSharpEngine.cs</Link>
</Compile>
<Compile Include="..\Discord.Net\Net\WebSockets\WS4NetEngine.cs">
<Link>Net\WebSockets\WS4NetEngine.cs</Link>
</Compile>
<Compile Include="..\Discord.Net\Services\IService.cs">
<Link>Services\IService.cs</Link>
</Compile>


+ 1
- 1
src/Discord.Net.Net45/packages.config View File

@@ -2,5 +2,5 @@
<packages>
<package id="Newtonsoft.Json" version="7.0.1" 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>

+ 128
- 0
src/Discord.Net/Net/WebSockets/WS4NetEngine.cs View 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

+ 1
- 1
src/Discord.Net/Net/WebSockets/WebSocket.cs View File

@@ -75,7 +75,7 @@ namespace Discord.Net.WebSockets
_connectedEvent = new ManualResetEventSlim(false);

#if !DOTNET5_4
_engine = new WebSocketSharpEngine(this, _config, _logger);
_engine = new WS4NetEngine(this, _config, _logger);
#else
//_engine = new BuiltInWebSocketEngine(this, _config, _logger);
#endif


+ 3
- 3
src/Discord.Net/Net/WebSockets/WebSocketSharpEngine.cs View File

@@ -1,4 +1,4 @@
#if !DOTNET5_4
/*#if !DOTNET5_4
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -42,7 +42,7 @@ namespace Discord.Net.WebSockets
_webSocket = new WSSharpWebSocket(host);
_webSocket.EmitOnPing = false;
_webSocket.EnableRedirection = true;
_webSocket.Compression = WebSocketSharp.CompressionMethod.Deflate;
//_webSocket.Compression = WebSocketSharp.CompressionMethod.Deflate;
_webSocket.SetProxy(null, null, null); //Disable
//_webSocket.SetProxy(_config.ProxyUrl, _config.ProxyCredentials?.UserName, _config.ProxyCredentials?.Password);
_webSocket.OnMessage += (s, e) =>
@@ -115,4 +115,4 @@ namespace Discord.Net.WebSockets
}
}
}
#endif
#endif*/

+ 4
- 4
src/Discord.Net/project.json View File

@@ -35,10 +35,10 @@

"frameworks": {
"net45": {
"dependencies": {
"WebSocketSharp": "1.0.3-rc10",
"RestSharp": "105.2.3"
}
"dependencies": {
"WebSocket4Net": "0.14.1",
"RestSharp": "105.2.3"
}
},
"dotnet5.4": {
"dependencies": {


Loading…
Cancel
Save