From 1b874a34755e1137e46840d3ed93c3bc0c9f4d69 Mon Sep 17 00:00:00 2001 From: RogueException Date: Mon, 12 Oct 2015 20:59:31 -0300 Subject: [PATCH] Added better permissions cache invalidation --- src/Discord.Net/Models/Channel.cs | 29 ++++++++++++++++++++++++----- src/Discord.Net/Models/Member.cs | 2 +- src/Discord.Net/Models/Server.cs | 4 ++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net/Models/Channel.cs b/src/Discord.Net/Models/Channel.cs index 491deae11..a9fc96b61 100644 --- a/src/Discord.Net/Models/Channel.cs +++ b/src/Discord.Net/Models/Channel.cs @@ -27,7 +27,7 @@ namespace Discord private readonly DiscordClient _client; private readonly ConcurrentDictionary _messages; - internal bool _areMembersStale; + private bool _areMembersStale; /// Returns the unique identifier for this channel. public string Id { get; } @@ -85,7 +85,7 @@ namespace Discord /// Returns a collection of all custom permissions used for this channel. private static readonly PermissionOverwrite[] _initialPermissionsOverwrites = new PermissionOverwrite[0]; - private PermissionOverwrite[] _permissionOverwrites; + internal PermissionOverwrite[] _permissionOverwrites; public IEnumerable PermissionOverwrites => _permissionOverwrites; internal Channel(DiscordClient client, string id, string serverId, string recipientId) @@ -95,9 +95,9 @@ namespace Discord ServerId = serverId; RecipientId = recipientId; _messages = new ConcurrentDictionary(); - _areMembersStale = true; _permissionOverwrites = _initialPermissionsOverwrites; - } + _areMembersStale = true; + } internal void Update(API.ChannelReference model) { @@ -120,7 +120,8 @@ namespace Discord _permissionOverwrites = model.PermissionOverwrites .Select(x => new PermissionOverwrite(x.Type, x.Id, x.Allow, x.Deny)) .ToArray(); - } + InvalidatePermissionsCache(); + } } public override string ToString() => Name; @@ -134,5 +135,23 @@ namespace Discord bool ignored; return _messages.TryRemove(messageId, out ignored); } + + internal void InvalidMembersCache() + { + _areMembersStale = true; + } + internal void InvalidatePermissionsCache() + { + _areMembersStale = true; + foreach (var member in Members) + member.UpdatePermissions(Id); + } + internal void InvalidatePermissionsCache(string userId) + { + _areMembersStale = true; + var member = _client.Members[userId, ServerId]; + if (member != null) + member.UpdatePermissions(Id); + } } } diff --git a/src/Discord.Net/Models/Member.cs b/src/Discord.Net/Models/Member.cs index 5698fdadc..a9b6f1fd5 100644 --- a/src/Discord.Net/Models/Member.cs +++ b/src/Discord.Net/Models/Member.cs @@ -202,7 +202,7 @@ namespace Discord if (permissions.RawValue != newPermissions) { permissions.SetRawValue(newPermissions); - channel._areMembersStale = true; + channel.InvalidMembersCache(); } } //TODO: Add GetServerPermissions diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index 2f5de753c..3d6554d42 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -200,7 +200,7 @@ namespace Discord foreach (var channel in Channels) { member.AddChannel(channel.Id); - channel._areMembersStale = true; + channel.InvalidatePermissionsCache(member.UserId); } } internal bool RemoveMember(Member member) @@ -209,7 +209,7 @@ namespace Discord foreach (var channel in Channels) { member.RemoveChannel(channel.Id); - channel._areMembersStale = true; + channel.InvalidatePermissionsCache(member.UserId); } return _members.TryRemove(member.UserId, out ignored); }