| @@ -46,7 +46,7 @@ namespace Discord.Modules | |||||
| private readonly DiscordClient _client; | private readonly DiscordClient _client; | ||||
| private readonly string _name, _id; | private readonly string _name, _id; | ||||
| private readonly FilterType _filterType; | private readonly FilterType _filterType; | ||||
| private readonly bool _allowServerWhitelist, _allowChannelWhitelist, _allowPrivate; | |||||
| private readonly bool _useServerWhitelist, _useChannelWhitelist, _allowAll, _allowPrivate; | |||||
| private readonly ConcurrentDictionary<string, Server> _enabledServers; | private readonly ConcurrentDictionary<string, Server> _enabledServers; | ||||
| private readonly ConcurrentDictionary<string, Channel> _enabledChannels; | private readonly ConcurrentDictionary<string, Channel> _enabledChannels; | ||||
| private readonly ConcurrentDictionary<string, int> _indirectServers; | private readonly ConcurrentDictionary<string, int> _indirectServers; | ||||
| @@ -64,15 +64,16 @@ namespace Discord.Modules | |||||
| _name = name; | _name = name; | ||||
| _id = name.ToLowerInvariant(); | _id = name.ToLowerInvariant(); | ||||
| _filterType = filterType; | _filterType = filterType; | ||||
| _allowServerWhitelist = filterType.HasFlag(FilterType.ServerWhitelist); | |||||
| _allowChannelWhitelist = filterType.HasFlag(FilterType.ChannelWhitelist); | |||||
| _allowAll = filterType == FilterType.Unrestricted; | |||||
| _useServerWhitelist = filterType.HasFlag(FilterType.ServerWhitelist); | |||||
| _useChannelWhitelist = filterType.HasFlag(FilterType.ChannelWhitelist); | |||||
| _allowPrivate = filterType.HasFlag(FilterType.AllowPrivate); | _allowPrivate = filterType.HasFlag(FilterType.AllowPrivate); | ||||
| _enabledServers = new ConcurrentDictionary<string, Server>(); | _enabledServers = new ConcurrentDictionary<string, Server>(); | ||||
| _enabledChannels = new ConcurrentDictionary<string, Channel>(); | _enabledChannels = new ConcurrentDictionary<string, Channel>(); | ||||
| _indirectServers = new ConcurrentDictionary<string, int>(); | _indirectServers = new ConcurrentDictionary<string, int>(); | ||||
| if (_allowServerWhitelist) //Server-only events | |||||
| if (_useServerWhitelist) //Server-only events | |||||
| { | { | ||||
| client.LeftServer += (s, e) => { if (LeftServer != null && HasIndirectServer(e.Server)) DisableServer(e.Server); LeftServer(s, e); }; | client.LeftServer += (s, e) => { if (LeftServer != null && HasIndirectServer(e.Server)) DisableServer(e.Server); LeftServer(s, e); }; | ||||
| client.ServerUpdated += (s, e) => { if (ServerUpdated != null && HasIndirectServer(e.Server)) ServerUpdated(s, e); }; | client.ServerUpdated += (s, e) => { if (ServerUpdated != null && HasIndirectServer(e.Server)) ServerUpdated(s, e); }; | ||||
| @@ -120,7 +121,7 @@ namespace Discord.Modules | |||||
| public bool EnableServer(Server server) | public bool EnableServer(Server server) | ||||
| { | { | ||||
| if (server == null) throw new ArgumentNullException(nameof(server)); | if (server == null) throw new ArgumentNullException(nameof(server)); | ||||
| if (!_allowServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| if (!_useServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -136,7 +137,7 @@ namespace Discord.Modules | |||||
| public bool DisableServer(Server server) | public bool DisableServer(Server server) | ||||
| { | { | ||||
| if (server == null) throw new ArgumentNullException(nameof(server)); | if (server == null) throw new ArgumentNullException(nameof(server)); | ||||
| if (!_allowServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| if (!_useServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -151,7 +152,7 @@ namespace Discord.Modules | |||||
| } | } | ||||
| public void DisableAllServers() | public void DisableAllServers() | ||||
| { | { | ||||
| if (!_allowServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| if (!_useServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -168,7 +169,7 @@ namespace Discord.Modules | |||||
| public bool EnableChannel(Channel channel) | public bool EnableChannel(Channel channel) | ||||
| { | { | ||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
| if (!_allowChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| if (!_useChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -192,7 +193,7 @@ namespace Discord.Modules | |||||
| public bool DisableChannel(Channel channel) | public bool DisableChannel(Channel channel) | ||||
| { | { | ||||
| if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
| if (!_allowChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| if (!_useChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -219,7 +220,7 @@ namespace Discord.Modules | |||||
| } | } | ||||
| public void DisableAllChannels() | public void DisableAllChannels() | ||||
| { | { | ||||
| if (!_allowChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| if (!_useChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist."); | |||||
| lock (this) | lock (this) | ||||
| { | { | ||||
| @@ -236,23 +237,26 @@ namespace Discord.Modules | |||||
| public void DisableAll() | public void DisableAll() | ||||
| { | { | ||||
| if (_allowServerWhitelist) | |||||
| if (_useServerWhitelist) | |||||
| DisableAllServers(); | DisableAllServers(); | ||||
| if (_allowChannelWhitelist) | |||||
| if (_useChannelWhitelist) | |||||
| DisableAllChannels(); | DisableAllChannels(); | ||||
| } | } | ||||
| internal bool HasServer(Server server) => | |||||
| _allowServerWhitelist && _enabledServers.ContainsKey(server.Id); | |||||
| internal bool HasIndirectServer(Server server) => | |||||
| (_allowServerWhitelist && _enabledServers.ContainsKey(server.Id)) || | |||||
| (_allowChannelWhitelist && _indirectServers.ContainsKey(server.Id)); | |||||
| internal bool HasServer(Server server) => | |||||
| _allowAll || | |||||
| _useServerWhitelist && _enabledServers.ContainsKey(server.Id); | |||||
| internal bool HasIndirectServer(Server server) => | |||||
| _allowAll || | |||||
| (_useServerWhitelist && _enabledServers.ContainsKey(server.Id)) || | |||||
| (_useChannelWhitelist && _indirectServers.ContainsKey(server.Id)); | |||||
| internal bool HasChannel(Channel channel) | internal bool HasChannel(Channel channel) | ||||
| { | { | ||||
| if (channel.IsPrivate) return _allowPrivate; | |||||
| if (_allowAll) return true; | |||||
| if (channel.IsPrivate) return _allowPrivate; | |||||
| if (_allowChannelWhitelist && _enabledChannels.ContainsKey(channel.Id)) return true; | |||||
| if (_allowServerWhitelist) | |||||
| if (_useChannelWhitelist && _enabledChannels.ContainsKey(channel.Id)) return true; | |||||
| if (_useServerWhitelist) | |||||
| { | { | ||||
| var server = channel.Server; | var server = channel.Server; | ||||
| if (server == null) return false; | if (server == null) return false; | ||||