diff --git a/src/Discord.Net.Modules/ModuleManager.cs b/src/Discord.Net.Modules/ModuleManager.cs index d8a697e81..74fb76f1e 100644 --- a/src/Discord.Net.Modules/ModuleManager.cs +++ b/src/Discord.Net.Modules/ModuleManager.cs @@ -8,9 +8,9 @@ namespace Discord.Modules public class ModuleManager { public event EventHandler ServerEnabled; - public event EventHandler ServerDisbled; - public event EventHandler ChannelEnabled; - public event EventHandler ChannelDisbled; + public event EventHandler ServerDisabled; + public event EventHandler ChannelEnabled; + public event EventHandler ChannelDisabled; public event EventHandler LeftServer; public event EventHandler ServerUpdated; @@ -41,17 +41,20 @@ namespace Discord.Modules public event EventHandler MessageDeleted; public event EventHandler MessageUpdated; public event EventHandler MessageReadRemotely; - + + private readonly DiscordClient _client; private readonly bool _allowServerWhitelist, _allowChannelWhitelist, _allowPrivate; private readonly ConcurrentDictionary _enabledServers; private readonly ConcurrentDictionary _enabledChannels; private readonly ConcurrentDictionary _indirectServers; + public DiscordClient Client => _client; public IEnumerable EnabledServers => _enabledServers.Select(x => x.Value); public IEnumerable EnabledChannels => _enabledChannels.Select(x => x.Value); internal ModuleManager(DiscordClient client, FilterType type) { + _client = client; _allowServerWhitelist = type.HasFlag(FilterType.Server); _allowChannelWhitelist = type.HasFlag(FilterType.Channel); _allowPrivate = type.HasFlag(FilterType.AllowPrivate); @@ -100,50 +103,71 @@ namespace Discord.Modules if (server == null) throw new ArgumentNullException(nameof(server)); if (!_allowServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); - if (_enabledServers.TryAdd(server.Id, server)) + lock (this) { - if (ServerEnabled != null) - ServerEnabled(this, new ServerEventArgs(server)); - return true; + if (_enabledServers.TryAdd(server.Id, server)) + { + if (ServerEnabled != null) + ServerEnabled(this, new ServerEventArgs(server)); + return true; + } + return false; } - return false; } 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 (_enabledServers.TryRemove(server.Id, out server)) + lock (this) { - if (ServerDisbled != null) - ServerDisbled(this, new ServerEventArgs(server)); - return true; + if (_enabledServers.TryRemove(server.Id, out server)) + { + if (ServerDisabled != null) + ServerDisabled(this, new ServerEventArgs(server)); + return true; + } + return false; } - return false; } public void DisableAllServers() { if (!_allowServerWhitelist) throw new InvalidOperationException("This module is not configured to use a server whitelist."); - _enabledServers.Clear(); + lock (this) + { + if (ServerDisabled != null) + { + foreach (var server in _enabledServers) + ServerDisabled(this, new ServerEventArgs(server.Value)); + } + + _enabledServers.Clear(); + } } - public void EnableChannel(Channel channel) + 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."); lock (this) { - _enabledChannels[channel.Id] = channel; - var server = channel.Server; - if (server != null) + if (_enabledChannels.TryAdd(channel.Id, channel)) { - int value = 0; - _indirectServers.TryGetValue(server.Id, out value); - value++; - _indirectServers[server.Id] = value; + var server = channel.Server; + if (server != null) + { + int value = 0; + _indirectServers.TryGetValue(server.Id, out value); + value++; + _indirectServers[server.Id] = value; + } + if (ChannelEnabled != null) + ChannelEnabled(this, new ChannelEventArgs(channel)); + return true; } + return false; } } public bool DisableChannel(Channel channel) @@ -167,6 +191,8 @@ namespace Discord.Modules else _indirectServers[server.Id] = value; } + if (ChannelDisabled != null) + ChannelDisabled(this, new ChannelEventArgs(channel)); return true; } return false; @@ -178,6 +204,12 @@ namespace Discord.Modules lock (this) { + if (ChannelDisabled != null) + { + foreach (var channel in _enabledChannels) + ChannelDisabled(this, new ChannelEventArgs(channel.Value)); + } + _enabledChannels.Clear(); _indirectServers.Clear(); }