Stop parsing READY twice

This commit is contained in:
RogueException
2016-01-02 01:50:39 -04:00
parent 6e1dbb0e0e
commit ee9045a12d
3 changed files with 26 additions and 24 deletions

View File

@@ -224,6 +224,7 @@ namespace Discord
ClientAPI.Token = token; ClientAPI.Token = token;
GatewaySocket.Token = token; GatewaySocket.Token = token;
GatewaySocket.SessionId = null;
//Get gateway and check token //Get gateway and check token
try try
@@ -274,6 +275,7 @@ namespace Discord
await GatewaySocket.Disconnect(); await GatewaySocket.Disconnect();
ClientAPI.Token = null; ClientAPI.Token = null;
GatewaySocket.Token = null; GatewaySocket.Token = null;
GatewaySocket.SessionId = null;
_servers.Clear(); _servers.Clear();
_channels.Clear(); _channels.Clear();
@@ -468,6 +470,8 @@ namespace Discord
case "READY": case "READY":
{ {
var data = e.Payload.ToObject<ReadyEvent>(_serializer); var data = e.Payload.ToObject<ReadyEvent>(_serializer);
GatewaySocket.StartHeartbeat(data.HeartbeatInterval);
GatewaySocket.SessionId = data.SessionId;
SessionId = data.SessionId; SessionId = data.SessionId;
PrivateUser = new User(this, data.User.Id, null); PrivateUser = new User(this, data.User.Id, null);
PrivateUser.Update(data.User); PrivateUser.Update(data.User);
@@ -488,6 +492,12 @@ namespace Discord
} }
} }
break; break;
case "RESUMED":
{
var data = e.Payload.ToObject<ResumedEvent>(_serializer);
GatewaySocket.StartHeartbeat(data.HeartbeatInterval);
}
break;
//Servers //Servers
case "GUILD_CREATE": case "GUILD_CREATE":
@@ -1004,9 +1014,6 @@ namespace Discord
case "GUILD_EMOJIS_UPDATE": case "GUILD_EMOJIS_UPDATE":
break; break;
case "RESUMED": //Handled in DataWebSocket
break;
//Others //Others
default: default:
Logger.Warning($"Unknown message type: {e.Type}"); Logger.Warning($"Unknown message type: {e.Type}");

View File

@@ -57,6 +57,7 @@ namespace Discord
var loginResponse = await Client.ClientAPI.Send(loginRequest).ConfigureAwait(false); var loginResponse = await Client.ClientAPI.Send(loginRequest).ConfigureAwait(false);
Client.ClientAPI.Token = loginResponse.Token; Client.ClientAPI.Token = loginResponse.Token;
Client.GatewaySocket.Token = loginResponse.Token; Client.GatewaySocket.Token = loginResponse.Token;
Client.GatewaySocket.SessionId = null;
} }
} }

View File

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