From cd2cfebfa3fbaa718d343fbed2cb7a4481aedb83 Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Sat, 13 Feb 2016 02:11:30 +0100 Subject: [PATCH] permissions pretty much finished, bugfixes and 1 improvement left --- .../Classes/Permissions/PermissionChecker.cs | 51 +++- .../Classes/Permissions/PermissionHelper.cs | 2 + NadekoBot/Modules/Administration.cs | 95 +------ NadekoBot/Modules/Permissions.cs | 244 ++++++++++++++---- NadekoBot/NadekoBot.cs | 1 + 5 files changed, 253 insertions(+), 140 deletions(-) diff --git a/NadekoBot/Classes/Permissions/PermissionChecker.cs b/NadekoBot/Classes/Permissions/PermissionChecker.cs index c5e36955..7544cafe 100644 --- a/NadekoBot/Classes/Permissions/PermissionChecker.cs +++ b/NadekoBot/Classes/Permissions/PermissionChecker.cs @@ -17,25 +17,60 @@ namespace NadekoBot.Classes.Permissions { public bool CanRun(Command command, User user, Channel channel, out string error) { error = null; + + if (channel.IsPrivate) + return true; + try { //is it a permission command? - if (command.Text == "Permissions") - // if it is, check if the user has the correct role - // if yes return true, if no return false + // if it is, check if the user has the correct role + // if yes return true, if no return false + if (command.Category == "Permissions") if (user.Server.IsOwner || user.HasRole(PermissionHelper.ValidateRole(user.Server, PermissionsHandler.GetServerPermissionsRoleName(user.Server)))) return true; else - throw new Exception("You do not have necessary role to change permissions."); + throw new Exception($"You don't have the necessary role (**{PermissionsHandler._permissionsDict[user.Server].PermissionsControllerRole}**) to change permissions."); var permissionType = PermissionsHandler.GetPermissionBanType(command, user, channel); - if (permissionType == PermissionsHandler.PermissionBanType.None) - return true; + string msg; - throw new InvalidOperationException($"Cannot run this command: {permissionType}"); + switch (permissionType) { + case PermissionsHandler.PermissionBanType.None: + return true; + case PermissionsHandler.PermissionBanType.ServerBanCommand: + msg = $"**{command.Text}** command has been banned from use on this **server**."; + break; + case PermissionsHandler.PermissionBanType.ServerBanModule: + msg = $"**{command.Category}** module has been banned from use on this **server**."; + break; + case PermissionsHandler.PermissionBanType.ChannelBanCommand: + msg = $"**{command.Text}** command has been banned from use on this **channel**."; + break; + case PermissionsHandler.PermissionBanType.ChannelBanModule: + msg = $"**{command.Category}** module has been banned from use on this **channel**."; + break; + case PermissionsHandler.PermissionBanType.RoleBanCommand: + msg = $"You do not have a **role** which permits you the usage of **{command.Text}** command."; + break; + case PermissionsHandler.PermissionBanType.RoleBanModule: + msg = $"You do not have a **role** which permits you the usage of **{command.Category}** module."; + break; + case PermissionsHandler.PermissionBanType.UserBanCommand: + msg = $"{user.Mention}, You have been banned from using **{command.Text}** command."; + break; + case PermissionsHandler.PermissionBanType.UserBanModule: + msg = $"{user.Mention}, You have been banned from using **{command.Category}** module."; + break; + default: + return true; + } + if (PermissionsHandler._permissionsDict[user.Server].Verbose) //if verbose - print errors + Task.Run(() => channel.SendMessage(msg)); + return false; } catch (Exception ex) { if (PermissionsHandler._permissionsDict[user.Server].Verbose) //if verbose - print errors - channel.SendMessage(ex.Message); + Task.Run(() => channel.SendMessage(ex.Message)); return false; } } diff --git a/NadekoBot/Classes/Permissions/PermissionHelper.cs b/NadekoBot/Classes/Permissions/PermissionHelper.cs index 44cf654b..d183e2cf 100644 --- a/NadekoBot/Classes/Permissions/PermissionHelper.cs +++ b/NadekoBot/Classes/Permissions/PermissionHelper.cs @@ -19,6 +19,7 @@ namespace NadekoBot.Classes { case "t": case "true": case "enable": + case "enabled": case "allow": case "unban": return true; @@ -26,6 +27,7 @@ namespace NadekoBot.Classes { case "f": case "false": case "disable": + case "disabled": case "disallow": case "ban": return false; diff --git a/NadekoBot/Modules/Administration.cs b/NadekoBot/Modules/Administration.cs index ae56d185..953a5a5b 100644 --- a/NadekoBot/Modules/Administration.cs +++ b/NadekoBot/Modules/Administration.cs @@ -141,9 +141,18 @@ namespace NadekoBot.Modules { }); cgb.CreateCommand(".roles") - .Description("List all roles on this server") + .Description("List all roles on this server or a single user if specified.") + .Parameter("user", ParameterType.Unparsed) .Do(async e => { - await e.Send("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles).Replace("@everyone", "[everyone]")); + + if (!string.IsNullOrWhiteSpace(e.GetArg("user"))) { + var usr = e.Server.FindUsers(e.GetArg("user")).FirstOrDefault(); + if (usr != null) { + await e.Send($"`List of roles for **{usr.Name}**:` \n• " + string.Join("\n• ", usr.Roles).Replace("@everyone", "මeveryone")); + return; + } + } + await e.Send("`List of roles:` \n• " + string.Join("\n• ", e.Server.Roles).Replace("@everyone", "මeveryone")); }); cgb.CreateCommand(".modules") @@ -395,22 +404,6 @@ namespace NadekoBot.Modules { if (!e.User.ServerPermissions.ManageMessages) return; await e.Send("This feature is being reconstructed."); - /* - if (pruneDict.ContainsKey(e.Server)) - return; - int num; - if (!Int32.TryParse(e.GetArg("num"), out num) || num < 1) { - await e.Send("Incorrect amount."); - return; - } - if (num > 10) - num = 10; - var msgs = await e.Channel.DownloadMessages(num); - foreach (var m in msgs) { - await m.Delete(); - await Task.Delay(500); - } - */ }); cgb.CreateCommand(".die") @@ -435,23 +428,6 @@ namespace NadekoBot.Modules { foreach (var m in msgs) await m.Delete(); }); - /* - try { - if (clearDictionary.ContainsKey(e.Server)) - return; - clearDictionary.TryAdd(e.Server, true); - var msgs = await e.Channel.DownloadMessages(100); - await Task.Run(async () => { - var ms = msgs.Where(msg => msg.User.Id == client.CurrentUser.Id); - foreach (var m in ms) { - try { await m.Delete(); } catch (Exception) { } - await Task.Delay(500); - } - }); - } catch (Exception) { } - bool throwaway; - clearDictionary.TryRemove(e.Server, out throwaway); - */ }); cgb.CreateCommand(".newname") .Alias(".setname") @@ -552,7 +528,7 @@ namespace NadekoBot.Modules { cgb.CreateCommand(".menrole") .Alias(".mentionrole") - .Description("Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention @everyone permission.") + .Description("Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission.") .Parameter("roles", ParameterType.Unparsed) .Do(async e => { if (!e.User.ServerPermissions.MentionEveryone) return; @@ -603,10 +579,8 @@ namespace NadekoBot.Modules { var rows = Classes.DBHandler.Instance.GetAllRows(); var donatorsOrdered = rows.OrderBy(d => d.Amount); string str = $"`Total number of people who donated is {donatorsOrdered.Count()}`\n"; - foreach (var don in donatorsOrdered) { - str += don.UserName; - } - await e.Channel.SendMessage(str); + + await e.Channel.SendMessage(string.Join(", ", donatorsOrdered)); }); }); @@ -633,47 +607,6 @@ namespace NadekoBot.Modules { Console.WriteLine("---------------\nInner error:\n" + ex.InnerException); } }); - /* - cgb.CreateCommand(".no") - .Description("desc") - .Parameter("arg", ParameterType.Required) - .Do(async e => { - var arg = e.GetArg("arg"); - - }); - - cgb.CreateCommand(".voicetext") - .Description("Enabled or disabled voice to text channel connection. Only people in a certain voice channel will see ") - - cgb.CreateCommand(".jsontype") - .Do(async e => { - Newtonsoft.Json.Linq.JArray data = Newtonsoft.Json.Linq.JArray.Parse(File.ReadAllText("data.json")); - if (data == null || data.Count == 0) return; - - var wer = data.Where(jt => jt["Description"].ToString().Length > 120); - var list = wer.Select(jt => { - var obj = new Parse.ParseObject("TypingArticles"); - obj["text"] = jt["Description"].ToString(); - return obj; - }); - await Parse.ParseObject.SaveAllAsync(list); - await e.Send("saved to parse"); - - }); - - cgb.CreateCommand(".repeat") - .Do(async e => { - if (e.User.Id != NadekoBot.OwnerID) return; - - string[] notifs = { "Admin use .bye .greet", "Unstable - fixing", "fixing ~ani, ~mang", "join NadekoLog server", "-h is help, .stats",}; - int i = notifs.Length; - while (true) { - await e.Channel.SendMessage($".setgame {notifs[--i]}"); - await Task.Delay(20000); - if (i == 0) i = notifs.Length; - } - }); - */ }); } diff --git a/NadekoBot/Modules/Permissions.cs b/NadekoBot/Modules/Permissions.cs index 7270da3f..68b2955d 100644 --- a/NadekoBot/Modules/Permissions.cs +++ b/NadekoBot/Modules/Permissions.cs @@ -4,10 +4,11 @@ using Discord.Commands; using NadekoBot.Extensions; using NadekoBot.Classes; using PermsHandler = NadekoBot.Classes.Permissions.PermissionsHandler; +using System.Linq; namespace NadekoBot.Modules { class PermissionModule : DiscordModule { - string prefix = "*"; + string prefix = ";"; public PermissionModule() : base() { //Empty for now } @@ -21,57 +22,78 @@ namespace NadekoBot.Modules { cgb.AddCheck(Classes.Permissions.PermissionChecker.Instance); cgb.CreateCommand(prefix + "serverperms") - .Description("Shows banned permissions for this server.") - .Do(async e => { - - var perms = PermsHandler.GetServerPermissions(e.Server); - if (perms == null) - await e.Send("No permissions set."); - await e.Send(perms.ToString()); - }); + .Alias(prefix + "sp") + .Description("Shows banned permissions for this server.") + .Do(async e => { + var perms = PermsHandler.GetServerPermissions(e.Server); + if (string.IsNullOrWhiteSpace(perms?.ToString())) + await e.Send("No permissions set for this server."); + await e.Send(perms.ToString()); + }); cgb.CreateCommand(prefix + "roleperms") - .Description("Shows banned permissions for a certain role. No argument means for everyone.") - .Parameter("role", ParameterType.Unparsed) - .Do(async e => { - var arg = e.GetArg("role"); - var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + .Alias(prefix + "rp") + .Description("Shows banned permissions for a certain role. No argument means for everyone.") + .Parameter("role", ParameterType.Unparsed) + .Do(async e => { + var arg = e.GetArg("role"); + Discord.Role role = e.Server.EveryoneRole; + if (!string.IsNullOrWhiteSpace(arg)) + try { + role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + } catch (Exception ex) { + await e.Send("💢 Error: " + ex.Message); + return; + } - var perms = PermsHandler.GetRolePermissionsById(e.Server, role.Id); - if (perms == null) - await e.Send("No permissions set."); - await e.Send(perms.ToString()); - }); + var perms = PermsHandler.GetRolePermissionsById(e.Server, role.Id); + + if (string.IsNullOrWhiteSpace(perms?.ToString())) + await e.Send($"No permissions set for **{role.Name}** role."); + await e.Send(perms.ToString()); + }); cgb.CreateCommand(prefix + "channelperms") - .Description("Shows banned permissions for a certain channel. No argument means for this channel.") - .Parameter("channel", ParameterType.Unparsed) - .Do(async e => { - var arg = e.GetArg("channel"); - var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + .Alias(prefix + "cp") + .Description("Shows banned permissions for a certain channel. No argument means for this channel.") + .Parameter("channel", ParameterType.Unparsed) + .Do(async e => { + var arg = e.GetArg("channel"); + Discord.Channel channel = e.Channel; + if (!string.IsNullOrWhiteSpace(arg)) + try { + channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + } catch (Exception ex) { + await e.Send("💢 Error: " + ex.Message); + return; + } - var perms = PermsHandler.GetChannelPermissionsById(e.Server, channel.Id); - if (perms == null) - await e.Send("No permissions set."); - await e.Send(perms.ToString()); - }); + var perms = PermsHandler.GetChannelPermissionsById(e.Server, channel.Id); + if (string.IsNullOrWhiteSpace(perms?.ToString())) + await e.Send($"No permissions set for **{channel.Name}** channel."); + await e.Send(perms.ToString()); + }); cgb.CreateCommand(prefix + "userperms") - .Description("Shows banned permissions for a certain user. No argument means for yourself.") - .Parameter("user", ParameterType.Unparsed) - .Do(async e => { - var arg = e.GetArg("user"); - Discord.User user; - if (string.IsNullOrWhiteSpace(e.GetArg("user"))) - user = e.User; - else - user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); + .Alias(prefix + "up") + .Description("Shows banned permissions for a certain user. No argument means for yourself.") + .Parameter("user", ParameterType.Unparsed) + .Do(async e => { + var arg = e.GetArg("user"); + Discord.User user = e.User; + if (!string.IsNullOrWhiteSpace(e.GetArg("user"))) + try { + user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); + } catch (Exception ex) { + await e.Send("💢 Error: " + ex.Message); + return; + } - var perms = PermsHandler.GetUserPermissionsById(e.Server, user.Id); - if (perms == null) - await e.Send("No permissions set."); - await e.Send(perms.ToString()); - }); + var perms = PermsHandler.GetUserPermissionsById(e.Server, user.Id); + if (string.IsNullOrWhiteSpace(perms?.ToString())) + await e.Send($"No permissions set for user **{user.Name}**."); + await e.Send(perms.ToString()); + }); cgb.CreateCommand(prefix + "sm").Alias(prefix + "servermodule") .Parameter("module", ParameterType.Required) @@ -83,7 +105,7 @@ namespace NadekoBot.Modules { bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); PermsHandler.SetServerModulePermission(e.Server, module, state); - await e.Send("I'm setting " + e.GetArg("module") + " to " + state); + await e.Send($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -101,7 +123,7 @@ namespace NadekoBot.Modules { bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); PermsHandler.SetServerCommandPermission(e.Server, command, state); - await e.Send("I'm setting " + e.GetArg("command") + " to " + state); + await e.Send($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -121,7 +143,7 @@ namespace NadekoBot.Modules { Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); PermsHandler.SetRoleModulePermission(role, module, state); - await e.Send("I'm setting " + e.GetArg("module") + " to " + state); + await e.Send($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -141,7 +163,7 @@ namespace NadekoBot.Modules { Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); PermsHandler.SetRoleCommandPermission(role, command, state); - await e.Send("I'm setting " + e.GetArg("command") + " to " + state); + await e.Send($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -161,7 +183,7 @@ namespace NadekoBot.Modules { Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); PermsHandler.SetChannelModulePermission(channel, module, state); - await e.Send("I'm setting " + e.GetArg("module") + " to " + state); + await e.Send($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -181,7 +203,7 @@ namespace NadekoBot.Modules { Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); PermsHandler.SetChannelCommandPermission(channel, command, state); - await e.Send("I'm setting " + e.GetArg("command") + " to " + state); + await e.Send($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -201,7 +223,7 @@ namespace NadekoBot.Modules { Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); PermsHandler.SetUserModulePermission(user, module, state); - await e.Send("I'm setting " + e.GetArg("module") + " to " + state); + await e.Send($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { @@ -221,7 +243,127 @@ namespace NadekoBot.Modules { Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user")); PermsHandler.SetUserCommandPermission(user, command, state); - await e.Send("I'm setting " + e.GetArg("command") + " to " + state); + await e.Send($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "asm").Alias(prefix + "allservermodules") + .Parameter("bool", ParameterType.Required) + .Description("Sets permissions for all modules at the server level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + + foreach (var module in NadekoBot.client.Modules().Modules) { + PermsHandler.SetServerModulePermission(e.Server, module.Name, state); + } + await e.Send($"All modules have been **{(state ? "enabled" : "disabled")}** on this server."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "asc").Alias(prefix + "allservercommands") + .Parameter("module", ParameterType.Required) + .Parameter("bool", ParameterType.Required) + .Description("Sets permissions for all commands from a module at the server level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + string module = PermissionHelper.ValidateModule(e.GetArg("module")); + + foreach (var command in NadekoBot.client.Commands().AllCommands.Where(c => c.Category == module)) { + PermsHandler.SetServerCommandPermission(e.Server, command.Text, state); + } + await e.Send($"All commands from {module} module have been **{(state ? "enabled" : "disabled")}** on this server."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "acm").Alias(prefix + "allchannelmodules") + .Parameter("bool", ParameterType.Required) + .Parameter("channel", ParameterType.Unparsed) + .Description("Sets permissions for all modules at the server level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + foreach (var module in NadekoBot.client.Modules().Modules) { + PermsHandler.SetChannelModulePermission(channel, module.Name, state); + } + + await e.Send($"All modules have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "acc").Alias(prefix + "allchannelcommands") + .Parameter("module", ParameterType.Required) + .Parameter("bool", ParameterType.Required) + .Parameter("channel", ParameterType.Unparsed) + .Description("Sets permissions for all commands from a module at the server level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + string module = PermissionHelper.ValidateModule(e.GetArg("module")); + Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel")); + foreach (var command in NadekoBot.client.Commands().AllCommands.Where(c => c.Category == module)) { + PermsHandler.SetChannelCommandPermission(channel, command.Text, state); + } + await e.Send($"All commands have been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "arm").Alias(prefix + "allrolemodules") + .Parameter("bool", ParameterType.Required) + .Parameter("role", ParameterType.Unparsed) + .Description("Sets permissions for all modules at the role level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role")); + foreach (var module in NadekoBot.client.Modules().Modules) { + PermsHandler.SetRoleModulePermission(role, module.Name, state); + } + + await e.Send($"All modules have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); + } catch (ArgumentException exArg) { + await e.Send(exArg.Message); + } catch (Exception ex) { + await e.Send("Something went terribly wrong - " + ex.Message); + } + }); + + cgb.CreateCommand(prefix + "arc").Alias(prefix + "allrolecommands") + .Parameter("module", ParameterType.Required) + .Parameter("bool", ParameterType.Required) + .Parameter("channel", ParameterType.Unparsed) + .Description("Sets permissions for all commands from a certain module at the role level.") + .Do(async e => { + try { + bool state = PermissionHelper.ValidateBool(e.GetArg("bool")); + string module = PermissionHelper.ValidateModule(e.GetArg("module")); + Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel")); + foreach (var command in NadekoBot.client.Commands().AllCommands.Where(c => c.Category == module)) { + PermsHandler.SetRoleCommandPermission(role, command.Text, state); + } + await e.Send($"All commands have been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role."); } catch (ArgumentException exArg) { await e.Send(exArg.Message); } catch (Exception ex) { diff --git a/NadekoBot/NadekoBot.cs b/NadekoBot/NadekoBot.cs index 85f72f5c..4f422b1f 100644 --- a/NadekoBot/NadekoBot.cs +++ b/NadekoBot/NadekoBot.cs @@ -121,6 +121,7 @@ namespace NadekoBot { if (request != null) { if (string.IsNullOrWhiteSpace(request.Content)) e.Cancel = true; + request.Content = request.Content.Replace("@everyone", "@everyοne"); } }; });