Browse Source

Apply unrestricted module filter to events

tags/docs-0.9
RogueException 9 years ago
parent
commit
505e71f57b
1 changed files with 24 additions and 20 deletions
  1. +24
    -20
      src/Discord.Net.Modules/ModuleManager.cs

+ 24
- 20
src/Discord.Net.Modules/ModuleManager.cs View File

@@ -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;


Loading…
Cancel
Save