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


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

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


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

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


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

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


Loading…
Cancel
Save