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); } }; }