Stop parsing READY twice
This commit is contained in:
@@ -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}");
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user