Example #1
0
        void IModule.Install(ModuleManager manager)
        {
            _client        = manager.Client;
            _moduleService = _client.GetService <ModuleService>();

            manager.CreateDynCommands("module", PermissionLevel.ServerAdmin, group =>
            {
                group.AddCheck((cmd, usr, chnl) => !chnl.IsPrivate);

                group.CreateCommand("channel enable")
                .Description("Enables a module on the current channel.")
                .Parameter("module", ParameterType.Unparsed)
                .Do(async e =>
                {
                    ModuleManager module = await VerifyFindModule(e.GetArg("module"), e.Channel);
                    if (module == null)
                    {
                        return;
                    }

                    if (!await CanChangeModuleStateInServer(module, ModuleFilter.ChannelWhitelist, e))
                    {
                        return;
                    }

                    Channel channel = e.Channel;

                    if (!module.EnableChannel(channel))
                    {
                        await
                        e.Channel.SafeSendMessage(
                            $"Module `{module.Id}` was already enabled for channel `{channel.Name}`.");
                        return;
                    }
                    _channelModulesDictionary.AddModuleToSave(module.Id, e.Channel.Id);
                    await
                    e.Channel.SafeSendMessage($"Module `{module.Id}` was enabled for channel `{channel.Name}`.");
                });

                group.CreateCommand("channel disable")
                .Description("Disable a module on the current channel.")
                .Parameter("module", ParameterType.Unparsed)
                .Do(async e =>
                {
                    ModuleManager module = await VerifyFindModule(e.GetArg("module"), e.Channel);
                    if (module == null)
                    {
                        return;
                    }

                    if (!await CanChangeModuleStateInServer(module, ModuleFilter.ChannelWhitelist, e, false))
                    {
                        return;
                    }

                    Channel channel = e.Channel;

                    if (!module.DisableChannel(channel))
                    {
                        await
                        e.Channel.SafeSendMessage(
                            $"Module `{module.Id}` was not enabled for channel `{channel.Name}`.");
                        return;
                    }
                    _channelModulesDictionary.DeleteModuleFromSave(module.Id, e.Channel.Id);
                    await
                    e.Channel.SafeSendMessage($"Module `{module.Id}` was disabled for channel `{channel.Name}`.");
                });

                group.CreateCommand("server enable")
                .Description("Enables a module on the current server.")
                .Parameter("module", ParameterType.Unparsed)
                .Do(async e =>
                {
                    ModuleManager module = await VerifyFindModule(e.GetArg("module"), e.Channel);
                    if (module == null)
                    {
                        return;
                    }

                    if (!await CanChangeModuleStateInServer(module, ModuleFilter.ServerWhitelist, e))
                    {
                        return;
                    }

                    Server server = e.Server;

                    if (!module.EnableServer(server))
                    {
                        await
                        e.Channel.SafeSendMessage(
                            $"Module `{module.Id}` was already enabled for server `{server.Name}`.");
                        return;
                    }
                    _serverModulesDictionary.AddModuleToSave(module.Id, e.Server.Id);
                    await e.Channel.SafeSendMessage($"Module `{module.Id}` was enabled for server `{server.Name}`.");
                });
                group.CreateCommand("server disable")
                .Description("Disables a module for the current server.")
                .Parameter("module", ParameterType.Unparsed)
                .Do(async e =>
                {
                    ModuleManager module = await VerifyFindModule(e.GetArg("module"), e.Channel);
                    if (module == null)
                    {
                        return;
                    }

                    if (!await CanChangeModuleStateInServer(module, ModuleFilter.ServerWhitelist, e, false))
                    {
                        return;
                    }

                    Server server = e.Server;

                    if (!module.DisableServer(server))
                    {
                        await
                        e.Channel.SafeSendMessage(
                            $"Module `{module.Id}` was not enabled for server `{server.Name}`.");
                        return;
                    }
                    _serverModulesDictionary.DeleteModuleFromSave(module.Id, e.Server.Id);
                    await
                    e.Channel.SafeSendMessage($"Module `{module.Id}` was disabled for server `{server.Name}`.");
                });
                group.CreateCommand("list")
                .Description("Lists all available modules.")
                .Do(async e =>
                {
                    StringBuilder builder = new StringBuilder("**Available modules:**\r\n");

                    foreach (ModuleManager module in _moduleService.Modules)
                    {
                        builder.Append($"`* {module.Id,-20} ");

                        if (e.Channel.IsPrivate)
                        {
                            if (module.FilterType.HasFlag(ModuleFilter.AlwaysAllowPrivate))
                            {
                                builder.Append($"Always available on prviate.");
                            }
                        }
                        else
                        {
                            if (module.FilterType.HasFlag(ModuleFilter.ServerWhitelist))
                            {
                                builder.Append($"Globally server: {module.EnabledServers.Contains(e.Server),-5} ");
                            }
                            if (module.FilterType.HasFlag(ModuleFilter.ChannelWhitelist))
                            {
                                builder.Append($"Channel: {module.EnabledChannels.Contains(e.Channel),-5}");
                            }
                        }

                        builder.AppendLine("`");
                    }

                    await e.Channel.SafeSendMessage(builder.ToString());
                });
            });

            _client.JoinedServer += async(s, e) =>
            {
                foreach (string moduleName in DefaultModules)
                {
                    ModuleManager module = await VerifyFindModule(moduleName, null, false);

                    if (module == null)
                    {
                        return;
                    }

                    if (!module.FilterType.HasFlag(ModuleFilter.ServerWhitelist))
                    {
                        throw new InvalidOperationException();
                    }

                    Server server = e.Server;

                    module.EnableServer(server);
                    _serverModulesDictionary.AddModuleToSave(module.Id, server.Id);
                }
            };
        }