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();