| @@ -46,7 +46,7 @@ namespace Discord.Modules | |||
| private readonly DiscordClient _client; | |||
| private readonly string _name, _id; | |||
| 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, Channel> _enabledChannels; | |||
| private readonly ConcurrentDictionary<string, int> _indirectServers; | |||
| @@ -64,15 +64,16 @@ namespace Discord.Modules | |||
| _name = name; | |||
| _id = name.ToLowerInvariant(); | |||
| _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); | |||
| _enabledServers = new ConcurrentDictionary<string, Server>(); | |||
| _enabledChannels = new ConcurrentDictionary<string, Channel>(); | |||
| _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.ServerUpdated += (s, e) => { if (ServerUpdated != null && HasIndirectServer(e.Server)) ServerUpdated(s, e); }; | |||
| @@ -120,7 +121,7 @@ namespace Discord.Modules | |||
| public bool EnableServer(Server 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) | |||
| { | |||
| @@ -136,7 +137,7 @@ namespace Discord.Modules | |||
| public bool DisableServer(Server 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) | |||
| { | |||
| @@ -151,7 +152,7 @@ namespace Discord.Modules | |||
| } | |||
| 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) | |||
| { | |||
| @@ -168,7 +169,7 @@ namespace Discord.Modules | |||
| public bool EnableChannel(Channel 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) | |||
| { | |||
| @@ -192,7 +193,7 @@ namespace Discord.Modules | |||
| public bool DisableChannel(Channel 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) | |||
| { | |||
| @@ -219,7 +220,7 @@ namespace Discord.Modules | |||
| } | |||
| 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) | |||
| { | |||
| @@ -236,23 +237,26 @@ namespace Discord.Modules | |||
| public void DisableAll() | |||
| { | |||
| if (_allowServerWhitelist) | |||
| if (_useServerWhitelist) | |||
| DisableAllServers(); | |||
| if (_allowChannelWhitelist) | |||
| if (_useChannelWhitelist) | |||
| 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) | |||
| { | |||
| 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; | |||
| if (server == null) return false; | |||