diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs
index f7c526f51..98cbf3ff3 100644
--- a/src/Discord.Net/DiscordSocketClient.cs
+++ b/src/Discord.Net/DiscordSocketClient.cs
@@ -900,7 +900,7 @@ namespace Discord
if (data.ChannelId == null)
guild.RemoveVoiceState(data.UserId);
else
- guild.AddOrUpdateVoiceState(data);
+ guild.AddOrUpdateVoiceState(data, DataStore);
var user = guild.GetUser(data.UserId);
if (user != null)
diff --git a/src/Discord.Net/Entities/Users/GuildUser.cs b/src/Discord.Net/Entities/Users/GuildUser.cs
index 8351aa57b..b95b943a7 100644
--- a/src/Discord.Net/Entities/Users/GuildUser.cs
+++ b/src/Discord.Net/Entities/Users/GuildUser.cs
@@ -16,7 +16,7 @@ namespace Discord
{
public bool IsDeaf { get; private set; }
public bool IsMute { get; private set; }
- public DateTime JoinedAt { get; private set; }
+ public DateTime? JoinedAt { get; private set; }
public string Nickname { get; private set; }
public GuildPermissions GuildPermissions { get; private set; }
diff --git a/src/Discord.Net/Entities/Users/IGuildUser.cs b/src/Discord.Net/Entities/Users/IGuildUser.cs
index ad90b6901..424313d30 100644
--- a/src/Discord.Net/Entities/Users/IGuildUser.cs
+++ b/src/Discord.Net/Entities/Users/IGuildUser.cs
@@ -13,7 +13,7 @@ namespace Discord
/// Returns true if the guild has muted this user.
bool IsMute { get; }
/// Gets when this user joined this guild.
- DateTime JoinedAt { get; }
+ DateTime? JoinedAt { get; }
/// Gets the nickname for this user.
string Nickname { get; }
/// Gets the guild-level permissions granted to this user by their roles.
diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs
index ed7af9e90..66106e1db 100644
--- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs
+++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs
@@ -79,7 +79,6 @@ namespace Discord
_channels = channels;
var members = new ConcurrentDictionary();
- var presences = new ConcurrentDictionary();
if (model.Members != null)
{
DownloadedMemberCount = 0;
@@ -89,24 +88,25 @@ namespace Discord
if (!model.Large)
_downloaderPromise.SetResult(true);
}
+ _members = members;
+
+ var presences = new ConcurrentDictionary();
if (model.Presences != null)
{
for (int i = 0; i < model.Presences.Length; i++)
{
var presence = model.Presences[i];
AddOrUpdatePresence(presence, presences);
- if (presence.Roles.IsSpecified)
- AddUser(presence, dataStore, members); //TODO: Does this ever happen?
+ //AddUser(presence, dataStore, members);
}
}
_presences = presences;
- _members = members;
var voiceStates = new ConcurrentDictionary();
if (model.VoiceStates != null)
{
for (int i = 0; i < model.VoiceStates.Length; i++)
- AddOrUpdateVoiceState(model.VoiceStates[i], voiceStates);
+ AddOrUpdateVoiceState(model.VoiceStates[i], dataStore, voiceStates);
}
_voiceStates = voiceStates;
}
@@ -165,9 +165,9 @@ namespace Discord
return null;
}
- public VoiceState AddOrUpdateVoiceState(VoiceStateModel model, ConcurrentDictionary voiceStates = null)
+ public VoiceState AddOrUpdateVoiceState(VoiceStateModel model, DataStore dataStore, ConcurrentDictionary voiceStates = null)
{
- var voiceChannel = GetChannel(model.ChannelId.Value) as CachedVoiceChannel;
+ var voiceChannel = dataStore.GetChannel(model.ChannelId.Value) as CachedVoiceChannel;
var voiceState = new VoiceState(voiceChannel, model.SessionId, model.SelfMute, model.SelfDeaf, model.Suppress);
(voiceStates ?? _voiceStates)[model.UserId] = voiceState;
return voiceState;
@@ -214,7 +214,6 @@ namespace Discord
}
public CachedGuildUser AddUser(PresenceModel model, DataStore dataStore, ConcurrentDictionary members = null)
{
- var user = Discord.GetOrAddUser(model.User, dataStore);
members = members ?? _members;
CachedGuildUser member;
@@ -222,6 +221,7 @@ namespace Discord
member.Update(model, UpdateSource.WebSocket);
else
{
+ var user = Discord.GetOrAddUser(model.User, dataStore);
member = new CachedGuildUser(this, user, model);
members[user.Id] = member;
user.AddRef();