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