Browse Source

Fixed some race conditions

tags/docs-0.9
RogueException 9 years ago
parent
commit
8cc94994d6
3 changed files with 28 additions and 13 deletions
  1. +2
    -2
      src/Discord.Net/DiscordClient.cs
  2. +15
    -1
      src/Discord.Net/Extensions.cs
  3. +11
    -10
      src/Discord.Net/Models/Server.cs

+ 2
- 2
src/Discord.Net/DiscordClient.cs View File

@@ -346,8 +346,8 @@ namespace Discord
private Channel AddPrivateChannel(ulong id, ulong recipientId)
{
Channel channel;
if (_privateChannels.TryGetOrAdd(recipientId, x => new Channel(this, id, new User(this, x, null)), out channel))
AddChannel(channel);
if (_channels.TryGetOrAdd(id, x => new Channel(this, x, new User(this, recipientId, null)), out channel))
_privateChannels[recipientId] = channel;
return channel;
}
internal Channel GetPrivateChannel(ulong recipientId)


+ 15
- 1
src/Discord.Net/Extensions.cs View File

@@ -48,7 +48,21 @@ namespace Discord
}
}
}
public static bool TryGetOrAdd<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> d,
TKey key, TValue value, out TValue result)
{
while (true)
{
if (d.TryGetValue(key, out result))
return false;
if (d.TryAdd(key, value))
{
result = value;
return true;
}
}
}

public static IEnumerable<Channel> Find(this IEnumerable<Channel> channels, string name, ChannelType type = null, bool exactMatch = false)
{
//Search by name


+ 11
- 10
src/Discord.Net/Models/Server.cs View File

@@ -205,8 +205,8 @@ namespace Discord
internal Channel AddChannel(ulong id)
{
var channel = new Channel(Client, id, this);
channel = _channels.GetOrAdd(id, x => channel);
Client.AddChannel(channel);
channel = _channels.GetOrAdd(id, x => channel);
return channel;
}
internal Channel RemoveChannel(ulong id)
@@ -389,18 +389,19 @@ namespace Discord
#region Users
internal User AddUser(ulong id)
{
Member user;
if (_users.TryGetOrAdd(id, x => new Member(new User(Client, x, this)), out user))
Member member = new Member(new User(Client, id, this));
if (id == Client.CurrentUser.Id)
{
member.User.CurrentGame = Client.CurrentGame;
member.User.Status = Client.Status;
}
if (_users.TryGetOrAdd(id, member, out member))
{
foreach (var channel in AllChannels)
channel.AddUser(user.User);
if (id == Client.CurrentUser.Id)
{
user.User.CurrentGame = Client.CurrentGame;
user.User.Status = Client.Status;
}
channel.AddUser(member.User);
}
return user.User;
return member.User;
}
internal User RemoveUser(ulong id)
{


Loading…
Cancel
Save