#nullable disable using NadekoBot.Common.ModuleBehaviors; namespace NadekoBot.Modules.Permissions.Services; public class GlobalPermissionService : IExecPreCommand, INService { public int Priority { get; } = 0; public HashSet BlockedCommands => _bss.Data.Blocked.Commands; public HashSet BlockedModules => _bss.Data.Blocked.Modules; private readonly BotConfigService _bss; public GlobalPermissionService(BotConfigService bss) => _bss = bss; public Task ExecPreCommandAsync(ICommandContext ctx, string moduleName, CommandInfo command) { var settings = _bss.Data; var commandName = command.Name.ToLowerInvariant(); if (commandName != "resetglobalperms") { if (settings.Blocked.Commands.Contains(commandName) || settings.Blocked.Modules.Contains(moduleName.ToLowerInvariant())) return Task.FromResult(true); if (ctx.Guild is null) { if (settings.DmBlocked.Commands.Contains(commandName) || settings.DmBlocked.Modules.Contains(moduleName.ToLowerInvariant())) return Task.FromResult(true); } } return Task.FromResult(false); } /// /// Toggles module blacklist /// /// Lowercase module name /// Whether the module is added public bool ToggleModule(string moduleName, bool priv = false) { var added = false; _bss.ModifyConfig(bs => { if (priv) { if (bs.DmBlocked.Modules.Add(moduleName)) { added = true; } else { bs.DmBlocked.Modules.Remove(moduleName); added = false; } return; } if (bs.Blocked.Modules.Add(moduleName)) { added = true; } else { bs.Blocked.Modules.Remove(moduleName); added = false; } }); return added; } /// /// Toggles command blacklist /// /// Lowercase command name /// Whether the command is added public bool ToggleCommand(string commandName, bool priv = false) { var added = false; _bss.ModifyConfig(bs => { if (priv) { if (bs.DmBlocked.Commands.Add(commandName)) { added = true; } else { bs.DmBlocked.Commands.Remove(commandName); added = false; } return; } if (bs.Blocked.Commands.Add(commandName)) { added = true; } else { bs.Blocked.Commands.Remove(commandName); added = false; } }); return added; } /// /// Resets all global permissions /// public Task Reset() { _bss.ModifyConfig(bs => { bs.Blocked.Commands.Clear(); bs.Blocked.Modules.Clear(); }); return Task.CompletedTask; } }