Fixed errors when members haven't been downloaded.
This commit is contained in:
@@ -825,6 +825,14 @@ namespace Discord
|
||||
else
|
||||
{
|
||||
guild.AddOrUpdatePresence(data);
|
||||
if (data.Roles.IsSpecified) //Happens when a user we haven't seen before logs in
|
||||
{
|
||||
CachedGuildUser user = guild.GetUser(data.User.Id);
|
||||
if (user == null)
|
||||
guild.AddUser(data, DataStore);
|
||||
else
|
||||
user.Update(data, UpdateSource.WebSocket);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -37,11 +37,19 @@ namespace Discord
|
||||
|
||||
public DiscordClient Discord => Guild.Discord;
|
||||
|
||||
public GuildUser(Guild guild, User user, Model model)
|
||||
private GuildUser(Guild guild, User user)
|
||||
{
|
||||
Guild = guild;
|
||||
User = user;
|
||||
|
||||
}
|
||||
public GuildUser(Guild guild, User user, Model model)
|
||||
: this(guild, user)
|
||||
{
|
||||
Update(model, UpdateSource.Creation);
|
||||
}
|
||||
public GuildUser(Guild guild, User user, PresenceModel model)
|
||||
: this(guild, user)
|
||||
{
|
||||
Update(model, UpdateSource.Creation);
|
||||
}
|
||||
public void Update(Model model, UpdateSource source)
|
||||
@@ -63,7 +71,7 @@ namespace Discord
|
||||
public void Update(PresenceModel model, UpdateSource source)
|
||||
{
|
||||
if (source == UpdateSource.Rest && IsAttached) return;
|
||||
|
||||
|
||||
if (model.Roles.IsSpecified)
|
||||
UpdateRoles(model.Roles.Value);
|
||||
}
|
||||
|
||||
@@ -77,23 +77,28 @@ namespace Discord
|
||||
AddChannel(model.Channels[i], dataStore, channels);
|
||||
}
|
||||
_channels = channels;
|
||||
|
||||
var presences = new ConcurrentDictionary<ulong, Presence>();
|
||||
|
||||
var members = new ConcurrentDictionary<ulong, CachedGuildUser>();
|
||||
if (model.Presences != null)
|
||||
{
|
||||
for (int i = 0; i < model.Presences.Length; i++)
|
||||
AddOrUpdatePresence(model.Presences[i], presences, members);
|
||||
}
|
||||
var presences = new ConcurrentDictionary<ulong, Presence>();
|
||||
if (model.Members != null)
|
||||
{
|
||||
DownloadedMemberCount = 0;
|
||||
for (int i = 0; i < model.Members.Length; i++)
|
||||
AddUser(model.Members[i], dataStore, members);
|
||||
DownloadedMemberCount = model.Members.Length;
|
||||
_downloaderPromise = new TaskCompletionSource<bool>();
|
||||
if (!model.Large)
|
||||
_downloaderPromise.SetResult(true);
|
||||
}
|
||||
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?
|
||||
}
|
||||
}
|
||||
_presences = presences;
|
||||
_members = members;
|
||||
|
||||
@@ -124,8 +129,7 @@ namespace Discord
|
||||
return Discord.DataStore.RemoveChannel(id) as ICachedGuildChannel;
|
||||
}
|
||||
|
||||
public Presence AddOrUpdatePresence(PresenceModel model, ConcurrentDictionary<ulong, Presence> presences = null,
|
||||
ConcurrentDictionary<ulong, CachedGuildUser> members = null)
|
||||
public Presence AddOrUpdatePresence(PresenceModel model, ConcurrentDictionary<ulong, Presence> presences = null)
|
||||
{
|
||||
var game = model.Game != null ? new Game(model.Game) : (Game?)null;
|
||||
var presence = new Presence(model.Status, game);
|
||||
@@ -194,10 +198,35 @@ namespace Discord
|
||||
public CachedGuildUser AddUser(MemberModel model, DataStore dataStore, ConcurrentDictionary<ulong, CachedGuildUser> members = null)
|
||||
{
|
||||
var user = Discord.GetOrAddUser(model.User, dataStore);
|
||||
var member = new CachedGuildUser(this, user, model);
|
||||
(members ?? _members)[user.Id] = member;
|
||||
user.AddRef();
|
||||
DownloadedMemberCount++;
|
||||
members = members ?? _members;
|
||||
|
||||
CachedGuildUser member;
|
||||
if (members.TryGetValue(model.User.Id, out member))
|
||||
member.Update(model, UpdateSource.WebSocket);
|
||||
else
|
||||
{
|
||||
member = new CachedGuildUser(this, user, model);
|
||||
members[user.Id] = member;
|
||||
user.AddRef();
|
||||
DownloadedMemberCount++;
|
||||
}
|
||||
return member;
|
||||
}
|
||||
public CachedGuildUser AddUser(PresenceModel model, DataStore dataStore, ConcurrentDictionary<ulong, CachedGuildUser> members = null)
|
||||
{
|
||||
var user = Discord.GetOrAddUser(model.User, dataStore);
|
||||
members = members ?? _members;
|
||||
|
||||
CachedGuildUser member;
|
||||
if (members.TryGetValue(model.User.Id, out member))
|
||||
member.Update(model, UpdateSource.WebSocket);
|
||||
else
|
||||
{
|
||||
member = new CachedGuildUser(this, user, model);
|
||||
members[user.Id] = member;
|
||||
user.AddRef();
|
||||
DownloadedMemberCount++;
|
||||
}
|
||||
return member;
|
||||
}
|
||||
public CachedGuildUser GetUser(ulong id)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Model = Discord.API.GuildMember;
|
||||
using PresenceModel = Discord.API.Presence;
|
||||
|
||||
namespace Discord
|
||||
{
|
||||
@@ -22,6 +23,10 @@ namespace Discord
|
||||
: base(guild, user, model)
|
||||
{
|
||||
}
|
||||
public CachedGuildUser(CachedGuild guild, CachedPublicUser user, PresenceModel model)
|
||||
: base(guild, user, model)
|
||||
{
|
||||
}
|
||||
|
||||
public CachedGuildUser Clone() => MemberwiseClone() as CachedGuildUser;
|
||||
ICachedUser ICachedUser.Clone() => Clone();
|
||||
|
||||
Reference in New Issue
Block a user