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