Voice crashfix, Properly getting data for large servers.pull/49/head
| @@ -407,7 +407,7 @@ namespace Discord.Net.WebSockets | |||||
| WebSocketMessage msg; | WebSocketMessage msg; | ||||
| using (var reader = new JsonTextReader(new StringReader(json))) | using (var reader = new JsonTextReader(new StringReader(json))) | ||||
| msg = _serializer.Deserialize(reader, typeof(WebSocketMessage)) as WebSocketMessage; | msg = _serializer.Deserialize(reader, typeof(WebSocketMessage)) as WebSocketMessage; | ||||
| var opCode = (OpCodes)msg.Operation; | var opCode = (OpCodes)msg.Operation; | ||||
| switch (opCode) | switch (opCode) | ||||
| { | { | ||||
| @@ -418,7 +418,11 @@ namespace Discord.Net.WebSockets | |||||
| var payload = (msg.Payload as JToken).ToObject<ReadyEvent>(_serializer); | var payload = (msg.Payload as JToken).ToObject<ReadyEvent>(_serializer); | ||||
| _heartbeatInterval = payload.HeartbeatInterval; | _heartbeatInterval = payload.HeartbeatInterval; | ||||
| _ssrc = payload.SSRC; | _ssrc = payload.SSRC; | ||||
| string hostname = Host.Substring(0, Host.IndexOf('?')).Replace("wss://", ""); | |||||
| string hostname; | |||||
| if (Host.Contains("?")) | |||||
| hostname = Host.Substring(0, Host.IndexOf('?')).Replace("wss://", ""); | |||||
| else | |||||
| hostname = Host.Replace("wss://", ""); | |||||
| var address = (await Dns.GetHostAddressesAsync(hostname).ConfigureAwait(false)).FirstOrDefault(); | var address = (await Dns.GetHostAddressesAsync(hostname).ConfigureAwait(false)).FirstOrDefault(); | ||||
| _endpoint = new IPEndPoint(address, payload.Port); | _endpoint = new IPEndPoint(address, payload.Port); | ||||
| @@ -528,24 +528,22 @@ namespace Discord | |||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| ulong serverId; | |||||
| ulong[] serverIds = new ulong[50]; | |||||
| int i = 0; | |||||
| const short batchSize = 50; | |||||
| int largeServersCount = 0; | |||||
| await Task.Delay(2500, cancelToken); | await Task.Delay(2500, cancelToken); | ||||
| while (true) | |||||
| do | |||||
| { | { | ||||
| while (_largeServers.TryDequeue(out serverId) && i < 50) | |||||
| serverIds[i++] = serverId; | |||||
| if (i > 0) | |||||
| largeServersCount = 0; | |||||
| ulong[] serverIds = new ulong[batchSize]; | |||||
| while (largeServersCount < batchSize && _largeServers.TryDequeue(out serverIds[largeServersCount++])) { } | |||||
| if (largeServersCount > 0) | |||||
| { | { | ||||
| Logger.Verbose($"Downloading data for {largeServersCount} large servers."); | |||||
| cancelToken.ThrowIfCancellationRequested(); | cancelToken.ThrowIfCancellationRequested(); | ||||
| GatewaySocket.SendRequestMembers(serverIds, "", 0); | GatewaySocket.SendRequestMembers(serverIds, "", 0); | ||||
| await Task.Delay(1500, cancelToken); | await Task.Delay(1500, cancelToken); | ||||
| } | } | ||||
| if (i < 50) | |||||
| break; | |||||
| } | |||||
| } while (largeServersCount == batchSize); | |||||
| await Task.Delay(2500, cancelToken); | await Task.Delay(2500, cancelToken); | ||||
| EndConnect(); | EndConnect(); | ||||
| } | } | ||||