@@ -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 (_allow ServerWhitelist) //Server-only events
if (_use ServerWhitelist) //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 (!_allow ServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist.");
if (!_use ServerWhitelist) 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 (!_allow ServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist.");
if (!_use ServerWhitelist) 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 (!_allow ServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist.");
if (!_use ServerWhitelist) 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 (!_allow ChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist.");
if (!_use ChannelWhitelist) 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 (!_allow ChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist.");
if (!_use ChannelWhitelist) 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 (!_allow ChannelWhitelist) throw new InvalidOperationException("This module is not configured to use a channel whitelist.");
if (!_use ChannelWhitelist) 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 (_allow ServerWhitelist)
if (_use ServerWhitelist)
DisableAllServers();
if (_allow ChannelWhitelist)
if (_use ChannelWhitelist)
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 (_allow ChannelWhitelist && _enabledChannels.ContainsKey(channel.Id)) return true;
if (_allow ServerWhitelist)
if (_use ChannelWhitelist && _enabledChannels.ContainsKey(channel.Id)) return true;
if (_use ServerWhitelist)
{
var server = channel.Server;
if (server == null) return false;