Several bug fixes
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -376,7 +376,7 @@ namespace Discord
|
||||
case "PRESENCE_UPDATE":
|
||||
{
|
||||
var data = e.Payload.ToObject<Events.PresenceUpdate>(_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
|
||||
}
|
||||
|
||||
/// <summary> Disconnects from the Discord server, canceling any pending requests. </summary>
|
||||
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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,12 @@ namespace Discord.Net.WebSockets
|
||||
{
|
||||
internal static class Commands
|
||||
{
|
||||
public sealed class KeepAlive : WebSocketMessage<int>
|
||||
public sealed class KeepAlive : WebSocketMessage<ulong>
|
||||
{
|
||||
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<Login.Data>
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user