From e2084be6c724079d63dee695dab1397682e4967a Mon Sep 17 00:00:00 2001 From: RogueException Date: Thu, 5 Nov 2015 17:05:43 -0400 Subject: [PATCH] Improved permission cache --- src/Discord.Net/Models/User.cs | 61 ++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/Discord.Net/Models/User.cs b/src/Discord.Net/Models/User.cs index 1b75db58c..441f65381 100644 --- a/src/Discord.Net/Models/User.cs +++ b/src/Discord.Net/Models/User.cs @@ -7,13 +7,25 @@ using System.Linq; namespace Discord { + public struct ChannelPermissionsPair + { + public Channel Channel; + public ChannelPermissions Permissions; + + public ChannelPermissionsPair(Channel channel) + { + Channel = channel; + Permissions = new ChannelPermissions(); + Permissions.Lock(); + } + } + public class User : CachedObject { internal static string GetId(string userId, string serverId) => (serverId ?? "Private") + '_' + userId; internal static string GetAvatarUrl(string userId, string avatarId) => avatarId != null ? Endpoints.UserAvatar(userId, avatarId) : null; - - private ConcurrentDictionary _channels; - private ConcurrentDictionary _permissions; + + private ConcurrentDictionary _permissions; private ServerPermissions _serverPermissions; /// Returns a unique identifier combining this user's id with its server's. @@ -91,13 +103,8 @@ namespace Discord if (_server.Id != null) { return _permissions - .Where(x => x.Value.ReadMessages) - .Select(x => - { - Channel channel = null; - _channels.TryGetValue(x.Key, out channel); - return channel; - }) + .Where(x => x.Value.Permissions.ReadMessages) + .Select(x => x.Value.Channel) .Where(x => x != null); } else @@ -136,10 +143,10 @@ namespace Discord _roles = new Dictionary(); Status = UserStatus.Offline; - _channels = new ConcurrentDictionary(); + //_channels = new ConcurrentDictionary(); if (serverId != null) { - _permissions = new ConcurrentDictionary(); + _permissions = new ConcurrentDictionary(); _serverPermissions = new ServerPermissions(); } @@ -268,7 +275,6 @@ namespace Discord newPermissions = ServerPermissions.All.RawValue; else { - //var roles = Roles.OrderBy(x => x.Id); var roles = Roles; foreach (var serverRole in roles) newPermissions |= serverRole.Permissions.RawValue; @@ -280,8 +286,8 @@ namespace Discord if (newPermissions != oldPermissions) { _serverPermissions.SetRawValueInternal(newPermissions); - foreach (var channel in _channels) - UpdateChannelPermissions(channel.Value); + foreach (var permission in _permissions) + UpdateChannelPermissions(permission.Value.Channel); } } internal void UpdateChannelPermissions(Channel channel) @@ -290,10 +296,10 @@ namespace Discord if (server == null) return; if (channel.Server != server) throw new InvalidOperationException(); - ChannelPermissions permissions; - if (!_permissions.TryGetValue(channel.Id, out permissions)) return; + ChannelPermissionsPair chanPerms; + if (!_permissions.TryGetValue(channel.Id, out chanPerms)) return; uint newPermissions = _serverPermissions.RawValue; - uint oldPermissions = permissions.RawValue; + uint oldPermissions = chanPerms.Permissions.RawValue; if (server.Owner == this) newPermissions = ChannelPermissions.All(channel).RawValue; @@ -321,11 +327,11 @@ namespace Discord if (newPermissions != oldPermissions) { - permissions.SetRawValueInternal(newPermissions); + chanPerms.Permissions.SetRawValueInternal(newPermissions); channel.InvalidateMembersCache(); } - permissions.SetRawValueInternal(newPermissions); + chanPerms.Permissions.SetRawValueInternal(newPermissions); } public ServerPermissions GetServerPermissions() => _serverPermissions; @@ -337,9 +343,9 @@ namespace Discord if (_server.Id == null) return ChannelPermissions.PrivateOnly; - ChannelPermissions perms; - if (_permissions.TryGetValue(channel.Id, out perms)) - return perms; + ChannelPermissionsPair chanPerms; + if (_permissions.TryGetValue(channel.Id, out chanPerms)) + return chanPerms.Permissions; return null; } @@ -347,10 +353,7 @@ namespace Discord { if (_server.Id != null) { - var perms = new ChannelPermissions(); - perms.Lock(); - _channels.TryAdd(channel.Id, channel); - _permissions.TryAdd(channel.Id, perms); + _permissions.TryAdd(channel.Id, new ChannelPermissionsPair(channel)); UpdateChannelPermissions(channel); } } @@ -358,8 +361,8 @@ namespace Discord { if (_server.Id != null) { - ChannelPermissions ignored; - _channels.TryRemove(channel.Id, out channel); + ChannelPermissionsPair ignored; + //_channels.TryRemove(channel.Id, out channel); _permissions.TryRemove(channel.Id, out ignored); } }