Browse Source

Fixed errors when members haven't been downloaded.

tags/1.0-rc
RogueException 9 years ago
parent
commit
be354f5614
4 changed files with 67 additions and 17 deletions
  1. +8
    -0
      src/Discord.Net/DiscordSocketClient.cs
  2. +11
    -3
      src/Discord.Net/Entities/Users/GuildUser.cs
  3. +43
    -14
      src/Discord.Net/Entities/WebSocket/CachedGuild.cs
  4. +5
    -0
      src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs

+ 8
- 0
src/Discord.Net/DiscordSocketClient.cs View File

@@ -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


+ 11
- 3
src/Discord.Net/Entities/Users/GuildUser.cs View File

@@ -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);
} }


+ 43
- 14
src/Discord.Net/Entities/WebSocket/CachedGuild.cs View File

@@ -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)
{
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) 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,
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 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)[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; return member;
} }
public CachedGuildUser GetUser(ulong id) public CachedGuildUser GetUser(ulong id)


+ 5
- 0
src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs View File

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


Loading…
Cancel
Save