From e42dfcafbdc7d8fc2b6404433c024606cd9bfc19 Mon Sep 17 00:00:00 2001 From: RogueException Date: Tue, 15 Sep 2015 13:08:39 -0300 Subject: [PATCH] Several bug fixes --- .../Collections/AsyncCollection.cs | 3 ++ src/Discord.Net/Collections/Channels.cs | 8 ++--- src/Discord.Net/DiscordClient.cs | 17 ++++++----- src/Discord.Net/Models/Server.cs | 6 ++-- src/Discord.Net/Net/WebSockets/Commands.cs | 6 ++-- .../Net/WebSockets/DataWebSocket.cs | 4 --- src/Discord.Net/Net/WebSockets/WebSocket.cs | 29 +++++++++++++------ 7 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/Discord.Net/Collections/AsyncCollection.cs b/src/Discord.Net/Collections/AsyncCollection.cs index 3449c14eb..9b57d7015 100644 --- a/src/Discord.Net/Collections/AsyncCollection.cs +++ b/src/Discord.Net/Collections/AsyncCollection.cs @@ -61,6 +61,9 @@ namespace Discord.Collections protected TValue Get(string key) { + if (key == null) + return null; + TValue result; if (!_dictionary.TryGetValue(key, out result)) return null; diff --git a/src/Discord.Net/Collections/Channels.cs b/src/Discord.Net/Collections/Channels.cs index 959a12087..c8f9c32a1 100644 --- a/src/Discord.Net/Collections/Channels.cs +++ b/src/Discord.Net/Collections/Channels.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; namespace Discord.Collections { @@ -15,7 +14,8 @@ namespace Discord.Collections protected override void OnCreated(Channel item) { - item.Server.AddChannel(item.Id); + if (item.ServerId != null) + item.Server.AddChannel(item.Id); if (item.RecipientId != null) { var user = item.Recipient; @@ -27,8 +27,8 @@ namespace Discord.Collections } protected override void OnRemoved(Channel item) { - item.Server.RemoveChannel(item.Id); - + if (item.ServerId != null) + item.Server.RemoveChannel(item.Id); if (item.RecipientId != null) { var user = item.Recipient; diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 96490ecbc..4e90ca5cb 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -376,7 +376,7 @@ namespace Discord case "PRESENCE_UPDATE": { var data = e.Payload.ToObject(_serializer); - var member = _members[data.UserId, data.GuildId]; + var member = _members[data.User.Id, data.GuildId]; /*if (_config.TrackActivity) { var user = _users[data.User.Id]; @@ -539,8 +539,8 @@ namespace Discord } /// Disconnects from the Discord server, canceling any pending requests. - public Task Disconnect() => DisconnectInternal(new Exception("Disconnect was requested by user.")); - protected async Task DisconnectInternal(Exception ex, bool isUnexpected = true) + public Task Disconnect() => DisconnectInternal(new Exception("Disconnect was requested by user."), isUnexpected: false); + protected async Task DisconnectInternal(Exception ex, bool isUnexpected = true, bool skipAwait = false) { int oldState; bool hasWriterLock; @@ -563,9 +563,12 @@ namespace Discord _cancelToken.Cancel(); } - Task task = _runTask; - if (task != null) - await task.ConfigureAwait(false); + if (!skipAwait) + { + Task task = _runTask; + if (task != null) + await task.ConfigureAwait(false); + } if (hasWriterLock) { @@ -587,7 +590,7 @@ namespace Discord { await task.ConfigureAwait(false); } - catch (Exception ex) { await DisconnectInternal(ex).ConfigureAwait(false); } + catch (Exception ex) { await DisconnectInternal(ex, skipAwait: true).ConfigureAwait(false); } await Cleanup().ConfigureAwait(false); _runTask = null; diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index b94a17199..360c9999c 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -129,8 +129,8 @@ namespace Discord var members = _client.Members; foreach (var subModel in model.Members) { - var user = users.GetOrAdd(subModel.UserId); - var member = members.GetOrAdd(subModel.UserId, Id); + var user = users.GetOrAdd(subModel.User.Id); + var member = members.GetOrAdd(subModel.User.Id, Id); user.Update(subModel.User); member.Update(subModel); } @@ -141,7 +141,7 @@ namespace Discord } foreach (var subModel in model.Presences) { - var member = members.GetOrAdd(subModel.UserId, Id); + var member = members.GetOrAdd(subModel.User.Id, Id); member.Update(subModel); } } diff --git a/src/Discord.Net/Net/WebSockets/Commands.cs b/src/Discord.Net/Net/WebSockets/Commands.cs index 2e1cce653..d214c5199 100644 --- a/src/Discord.Net/Net/WebSockets/Commands.cs +++ b/src/Discord.Net/Net/WebSockets/Commands.cs @@ -11,12 +11,12 @@ namespace Discord.Net.WebSockets { internal static class Commands { - public sealed class KeepAlive : WebSocketMessage + public sealed class KeepAlive : WebSocketMessage { public KeepAlive() : base(1, GetTimestamp()) { } private static DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - private static int GetTimestamp() - => (int)(DateTime.UtcNow - epoch).TotalMilliseconds; + private static ulong GetTimestamp() + => (ulong)(DateTime.UtcNow - epoch).TotalMilliseconds; } public sealed class Login : WebSocketMessage { diff --git a/src/Discord.Net/Net/WebSockets/DataWebSocket.cs b/src/Discord.Net/Net/WebSockets/DataWebSocket.cs index cf7855e0c..3341af389 100644 --- a/src/Discord.Net/Net/WebSockets/DataWebSocket.cs +++ b/src/Discord.Net/Net/WebSockets/DataWebSocket.cs @@ -24,11 +24,7 @@ namespace Discord.Net.WebSockets Commands.Login msg = new Commands.Login(); msg.Payload.Token = token; - //msg.Payload.Properties["$os"] = ""; - //msg.Payload.Properties["$browser"] = ""; msg.Payload.Properties["$device"] = "Discord.Net"; - //msg.Payload.Properties["$referrer"] = ""; - //msg.Payload.Properties["$referring_domain"] = ""; QueueMessage(msg); } diff --git a/src/Discord.Net/Net/WebSockets/WebSocket.cs b/src/Discord.Net/Net/WebSockets/WebSocket.cs index 451f2286e..827e8e450 100644 --- a/src/Discord.Net/Net/WebSockets/WebSocket.cs +++ b/src/Discord.Net/Net/WebSockets/WebSocket.cs @@ -1,6 +1,7 @@ using Discord.Helpers; using Newtonsoft.Json; using System; +using System.Linq; using System.Runtime.ExceptionServices; using System.Text; using System.Threading; @@ -96,8 +97,8 @@ namespace Discord.Net.WebSockets public Task Reconnect() => Connect(_host); - public Task Disconnect() => DisconnectInternal(new Exception("Disconnect was requested by user.")); - protected async Task DisconnectInternal(Exception ex, bool isUnexpected = true) + public Task Disconnect() => DisconnectInternal(new Exception("Disconnect was requested by user."), isUnexpected: false); + protected async Task DisconnectInternal(Exception ex, bool isUnexpected = true, bool skipAwait = false) { int oldState; bool hasWriterLock; @@ -120,9 +121,12 @@ namespace Discord.Net.WebSockets _cancelToken.Cancel(); } - Task task = _runTask; - if (task != null) - await task.ConfigureAwait(false); + if (!skipAwait) + { + Task task = _runTask; + if (task != null) + await task.ConfigureAwait(false); + } if (hasWriterLock) { @@ -133,12 +137,13 @@ namespace Discord.Net.WebSockets protected virtual async Task RunTasks() { - Task[] tasks = Run(); + Task task = Task.WhenAll(Run()); + try { - await Task.WhenAll(tasks).ConfigureAwait(false); + await task.ConfigureAwait(false); } - catch (Exception ex) { await DisconnectInternal(ex).ConfigureAwait(false); } + catch (Exception ex) { await DisconnectInternal(ex, skipAwait: true).ConfigureAwait(false); } bool wasUnexpected = _wasDisconnectUnexpected; _wasDisconnectUnexpected = false; @@ -147,7 +152,13 @@ namespace Discord.Net.WebSockets await Cleanup().ConfigureAwait(false); _runTask = null; } - protected virtual Task[] Run() { return _engine.RunTasks(_cancelToken.Token); } + protected virtual Task[] Run() + { + var cancelToken = _cancelToken.Token; + return _engine.RunTasks(cancelToken) + .Concat(new Task[] { HeartbeatAsync(cancelToken) }) + .ToArray(); + } protected virtual Task Cleanup() { return TaskHelper.CompletedTask; } protected abstract Task ProcessMessage(string json);