@@ -13,11 +13,10 @@ namespace Discord.Net.WebSockets
public sealed class GatewaySocket : WebSocket
{
private uint _lastSequence;
private string _sessionId;
private string _token;
private int _reconnects;
public string Token { get { return _token; } internal set { _token = value; _sessionId = null; } }
public string Token { get; internal set; }
public string SessionId { get; internal set; }
public event EventHandler<WebSocketEventEventArgs> ReceivedDispatch = delegate { };
private void OnReceivedDispatch(string type, JToken payload)
@@ -36,7 +35,7 @@ namespace Discord.Net.WebSockets
public async Task Connect()
{
await BeginConnect().ConfigureAwait(false);
if (_s essionId == null)
if (S essionId == null)
SendIdentify(Token);
else
SendResume();
@@ -81,7 +80,7 @@ namespace Discord.Net.WebSockets
{
var ex = _taskManager.Exception;
if (ex == null || (ex as WebSocketException)?.Code != 1012) //if (ex == null || (ex as WebSocketException)?.Code != 1012)
_s essionId = null; //Reset session unless close code 1012
S essionId = null; //Reset session unless close code 1012
return base.Cleanup();
}
@@ -97,22 +96,12 @@ namespace Discord.Net.WebSockets
{
case OpCodes.Dispatch:
{
JToken token = msg.Payload as JToken ;
if (msg.Type == "READY ")
{
OnReceivedDispatch(msg.Type, msg.Payload as JToken) ;
if (msg.Type == "READY" || msg.Type == "RESUMED ")
{
_reconnects = 0;
var payload = token.ToObject<ReadyEvent>(_serializer);
_sessionId = payload.SessionId;
_heartbeatInterval = payload.HeartbeatInterval;
}
else if (msg.Type == "RESUMED")
{
var payload = token.ToObject<ResumedEvent>(_serializer);
_heartbeatInterval = payload.HeartbeatInterval;
}
OnReceivedDispatch(msg.Type, token);
if (msg.Type == "READY" || msg.Type == "RESUMED")
EndConnect(); //Complete the connect
EndConnect(); //Complete the connect
}
}
break;
case OpCodes.Redirect:
@@ -153,7 +142,7 @@ namespace Discord.Net.WebSockets
}
public void SendResume()
=> QueueMessage(new ResumeCommand { SessionId = _s essionId, Sequence = _lastSequence });
=> QueueMessage(new ResumeCommand { SessionId = S essionId, Sequence = _lastSequence });
public override void SendHeartbeat()
=> QueueMessage(new HeartbeatCommand());
public void SendUpdateStatus(long? idleSince, string gameName)
@@ -167,6 +156,11 @@ namespace Discord.Net.WebSockets
public void SendRequestMembers(ulong serverId, string query, int limit)
=> QueueMessage(new RequestMembersCommand { GuildId = serverId, Query = query, Limit = limit });
internal void StartHeartbeat(int interval)
{
_heartbeatInterval = interval;
}
//Cancel if either DiscordClient.Disconnect is called, data socket errors or timeout is reached
public override void WaitForConnection(CancellationToken cancelToken)
=> base.WaitForConnection(CancellationTokenSource.CreateLinkedTokenSource(cancelToken, CancelToken).Token);