internal ModuleManager(DiscordClient client, IModule instance, string name, ModuleFilter filterType) { Client = client; Instance = instance; Name = name; FilterType = filterType; Id = name.ToLowerInvariant(); _lock = new AsyncLock(); _allowAll = filterType == ModuleFilter.None; _useServerWhitelist = filterType.HasFlag(ModuleFilter.ServerWhitelist); _useChannelWhitelist = filterType.HasFlag(ModuleFilter.ChannelWhitelist); _allowPrivate = filterType.HasFlag(ModuleFilter.AlwaysAllowPrivate); _enabledServers = new ConcurrentDictionary<ulong, Server>(); _enabledChannels = new ConcurrentDictionary<ulong, Channel>(); _indirectServers = new ConcurrentDictionary<ulong, int>(); if (_allowAll || _useServerWhitelist) //Server-only events { client.ChannelCreated += (s, e) => { if (e.Server != null && HasServer(e.Server)) ChannelCreated(s, e); }; client.UserVoiceStateUpdated += (s, e) => { if (HasServer(e.Server)) UserVoiceStateUpdated(s, e); }; } client.ChannelDestroyed += (s, e) => { if (HasChannel(e.Channel)) ChannelDestroyed(s, e); }; client.ChannelUpdated += (s, e) => { if (HasChannel(e.Channel)) ChannelUpdated(s, e); }; client.MessageReceived += (s, e) => { if (HasChannel(e.Channel)) MessageReceived(s, e); }; client.MessageSent += (s, e) => { if (HasChannel(e.Channel)) MessageSent(s, e); }; client.MessageDeleted += (s, e) => { if (HasChannel(e.Channel)) MessageDeleted(s, e); }; client.MessageUpdated += (s, e) => { if (HasChannel(e.Channel)) MessageUpdated(s, e); }; client.MessageAcknowledged += (s, e) => { if (HasChannel(e.Channel)) MessageReadRemotely(s, e); }; client.RoleCreated += (s, e) => { if (HasIndirectServer(e.Server)) RoleCreated(s, e); }; client.RoleUpdated += (s, e) => { if (HasIndirectServer(e.Server)) RoleUpdated(s, e); }; client.RoleDeleted += (s, e) => { if (HasIndirectServer(e.Server)) RoleDeleted(s, e); }; client.LeftServer += (s, e) => { if (HasIndirectServer(e.Server)) { DisableServer(e.Server); LeftServer(s, e); } }; client.ServerUpdated += (s, e) => { if (HasIndirectServer(e.Server)) ServerUpdated(s, e); }; client.ServerUnavailable += (s, e) => { if (HasIndirectServer(e.Server)) ServerUnavailable(s, e); }; client.ServerAvailable += (s, e) => { if (HasIndirectServer(e.Server)) ServerAvailable(s, e); }; client.UserJoined += (s, e) => { if (HasIndirectServer(e.Server)) UserJoined(s, e); }; client.UserLeft += (s, e) => { if (HasIndirectServer(e.Server)) UserLeft(s, e); }; client.UserUpdated += (s, e) => { if (HasIndirectServer(e.Server)) UserUpdated(s, e); }; client.UserIsTypingUpdated += (s, e) => { if (HasChannel(e.Channel)) UserIsTypingUpdated(s, e); }; //TODO: We aren't getting events from UserPresence if AllowPrivate is enabled, but the server we know that user through isn't on the whitelist client.UserPresenceUpdated += (s, e) => { if (HasIndirectServer(e.Server)) UserPresenceUpdated(s, e); }; client.UserBanned += (s, e) => { if (HasIndirectServer(e.Server)) UserBanned(s, e); }; client.UserUnbanned += (s, e) => { if (HasIndirectServer(e.Server)) UserUnbanned(s, e); }; }
internal ModuleManager(DiscordClient client, IModule instance, string name, ModuleFilter filterType) { Client = client; Instance = instance; Name = name; FilterType = filterType; Id = name.ToLowerInvariant(); _lock = new AsyncLock(); _allowAll = filterType == ModuleFilter.None; _useServerWhitelist = filterType.HasFlag(ModuleFilter.ServerWhitelist); _useChannelWhitelist = filterType.HasFlag(ModuleFilter.ChannelWhitelist); _allowPrivate = filterType.HasFlag(ModuleFilter.AlwaysAllowPrivate); _enabledServers = new ConcurrentDictionary <ulong, Server>(); _enabledChannels = new ConcurrentDictionary <ulong, Channel>(); _indirectServers = new ConcurrentDictionary <ulong, int>(); if (_allowAll || _useServerWhitelist) //Server-only events { client.ChannelCreated += (s, e) => { if (e.Server != null && HasServer(e.Server)) { ChannelCreated(s, e); } }; //TODO: This *is* a channel update if the before/after voice channel is whitelisted //client.UserVoiceStateUpdated += (s, e) => { if (HasServer(e.Server)) UserVoiceStateUpdated(s, e); }; } client.ChannelDestroyed += (s, e) => { if (HasChannel(e.Channel)) { ChannelDestroyed(s, e); } }; client.ChannelUpdated += (s, e) => { if (HasChannel(e.After)) { ChannelUpdated(s, e); } }; client.MessageReceived += (s, e) => { if (HasChannel(e.Channel)) { MessageReceived(s, e); } }; client.MessageSent += (s, e) => { if (HasChannel(e.Channel)) { MessageSent(s, e); } }; client.MessageDeleted += (s, e) => { if (HasChannel(e.Channel)) { MessageDeleted(s, e); } }; client.MessageUpdated += (s, e) => { if (HasChannel(e.Channel)) { MessageUpdated(s, e); } }; client.MessageAcknowledged += (s, e) => { if (HasChannel(e.Channel)) { MessageReadRemotely(s, e); } }; client.RoleCreated += (s, e) => { if (HasIndirectServer(e.Server)) { RoleCreated(s, e); } }; client.RoleUpdated += (s, e) => { if (HasIndirectServer(e.Server)) { RoleUpdated(s, e); } }; client.RoleDeleted += (s, e) => { if (HasIndirectServer(e.Server)) { RoleDeleted(s, e); } }; client.JoinedServer += (s, e) => { if (_allowAll) { JoinedServer(s, e); } }; client.LeftServer += (s, e) => { if (HasIndirectServer(e.Server)) { LeftServer(s, e); } }; client.ServerUpdated += (s, e) => { if (HasIndirectServer(e.After)) { ServerUpdated(s, e); } }; client.ServerUnavailable += (s, e) => { if (HasIndirectServer(e.Server)) { ServerUnavailable(s, e); } }; client.ServerAvailable += (s, e) => { if (HasIndirectServer(e.Server)) { ServerAvailable(s, e); } }; client.UserJoined += (s, e) => { if (HasIndirectServer(e.Server)) { UserJoined(s, e); } }; client.UserLeft += (s, e) => { if (HasIndirectServer(e.Server)) { UserLeft(s, e); } }; client.UserUpdated += (s, e) => { if (HasIndirectServer(e.Server)) { UserUpdated(s, e); } }; client.UserIsTyping += (s, e) => { if (HasChannel(e.Channel)) { UserIsTyping(s, e); } }; //TODO: We aren't getting events from UserPresence if AllowPrivate is enabled, but the server we know that user through isn't on the whitelist //client.UserPresenceUpdated += (s, e) => { if (HasIndirectServer(e.Server)) UserPresenceUpdated(s, e); }; client.UserBanned += (s, e) => { if (HasIndirectServer(e.Server)) { UserBanned(s, e); } }; client.UserUnbanned += (s, e) => { if (HasIndirectServer(e.Server)) { UserUnbanned(s, e); } }; }