diff --git a/NadekoBot/Modules/Permissions/Classes/PermissionsHandler.cs b/NadekoBot/Modules/Permissions/Classes/PermissionsHandler.cs index a9bac105..93fa8686 100644 --- a/NadekoBot/Modules/Permissions/Classes/PermissionsHandler.cs +++ b/NadekoBot/Modules/Permissions/Classes/PermissionsHandler.cs @@ -192,6 +192,60 @@ namespace NadekoBot.Modules.Permissions.Classes Task.Run(() => WriteServerToJson(serverPerms)); } + internal static void CopyRolePermissions(Role fromRole, Role toRole) + { + var server = fromRole.Server; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + var from = GetRolePermissionsById(server, fromRole.Id); + if (from == null) + serverPerms.RolePermissions.Add(fromRole.Id, from = new Permissions(fromRole.Name)); + var to = GetRolePermissionsById(server, toRole.Id); + if (to == null) + serverPerms.RolePermissions.Add(toRole.Id, to = new Permissions(toRole.Name)); + + to.CopyFrom(from); + + Task.Run(() => WriteServerToJson(serverPerms)); + } + + internal static void CopyChannelPermissions(Channel fromChannel, Channel toChannel) + { + var server = fromChannel.Server; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + var from = GetChannelPermissionsById(server, fromChannel.Id); + if (from == null) + serverPerms.ChannelPermissions.Add(fromChannel.Id, from = new Permissions(fromChannel.Name)); + var to = GetChannelPermissionsById(server, toChannel.Id); + if (to == null) + serverPerms.ChannelPermissions.Add(toChannel.Id, to = new Permissions(toChannel.Name)); + + to.CopyFrom(from); + + Task.Run(() => WriteServerToJson(serverPerms)); + } + + internal static void CopyUserPermissions(User fromUser, User toUser) + { + var server = fromUser.Server; + var serverPerms = PermissionsDict.GetOrAdd(server.Id, + new ServerPermissions(server.Id, server.Name)); + + var from = GetUserPermissionsById(server, fromUser.Id); + if (from == null) + serverPerms.UserPermissions.Add(fromUser.Id, from = new Permissions(fromUser.Name)); + var to = GetUserPermissionsById(server, toUser.Id); + if (to == null) + serverPerms.UserPermissions.Add(toUser.Id, to = new Permissions(toUser.Name)); + + to.CopyFrom(from); + + Task.Run(() => WriteServerToJson(serverPerms)); + } + public static void SetServerModulePermission(Server server, string moduleName, bool value) { var serverPerms = PermissionsDict.GetOrAdd(server.Id, @@ -424,6 +478,18 @@ namespace NadekoBot.Modules.Permissions.Classes FilterWords = false; } + public void CopyFrom(Permissions other) + { + Modules.Clear(); + foreach (var mp in other.Modules) + Modules.AddOrUpdate(mp.Key, mp.Value, (s, b) => mp.Value); + Commands.Clear(); + foreach (var cp in other.Commands) + Commands.AddOrUpdate(cp.Key, cp.Value, (s, b) => cp.Value); + FilterInvites = other.FilterInvites; + FilterWords = other.FilterWords; + } + public override string ToString() { var toReturn = ""; diff --git a/NadekoBot/Modules/Permissions/PermissionsModule.cs b/NadekoBot/Modules/Permissions/PermissionsModule.cs index 61a5fd52..b3559d87 100644 --- a/NadekoBot/Modules/Permissions/PermissionsModule.cs +++ b/NadekoBot/Modules/Permissions/PermissionsModule.cs @@ -58,6 +58,91 @@ namespace NadekoBot.Modules.Permissions await e.Channel.SendMessage($"Role `{role.Name}` is now required in order to change permissions.").ConfigureAwait(false); }); + cgb.CreateCommand(Prefix + "rpc") + .Alias(Prefix + "rolepermissionscopy") + .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another.\n**Usage**:`{Prefix}rpc Some Role ~ Some other role`") + .Parameter("from_to", ParameterType.Unparsed) + .Do(async e => + { + var arg = e.GetArg("from_to")?.Trim(); + if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) + return; + var args = arg.Split('~').Select(a => a.Trim()).ToArray(); + if (args.Length > 2) + { + await e.Channel.SendMessage("💢Invalid number of '~'s in the argument."); + return; + } + try + { + var fromRole = PermissionHelper.ValidateRole(e.Server, args[0]); + var toRole = PermissionHelper.ValidateRole(e.Server, args[1]); + + PermissionsHandler.CopyRolePermissions(fromRole, toRole); + await e.Channel.SendMessage($"Copied permission settings from **{fromRole.Name}** to **{toRole.Name}**."); + } + catch (Exception ex) + { + await e.Channel.SendMessage($"💢{ex.Message}"); + } + }); + cgb.CreateCommand(Prefix + "cpc") + .Alias(Prefix + "channelpermissionscopy") + .Description($"Copies BOT PERMISSIONS (not discord permissions) from one channel to another.\n**Usage**:`{Prefix}cpc Some Channel ~ Some other channel`") + .Parameter("from_to", ParameterType.Unparsed) + .Do(async e => + { + var arg = e.GetArg("from_to")?.Trim(); + if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) + return; + var args = arg.Split('~').Select(a => a.Trim()).ToArray(); + if (args.Length > 2) + { + await e.Channel.SendMessage("💢Invalid number of '~'s in the argument."); + return; + } + try + { + var fromChannel = PermissionHelper.ValidateChannel(e.Server, args[0]); + var toChannel = PermissionHelper.ValidateChannel(e.Server, args[1]); + + PermissionsHandler.CopyChannelPermissions(fromChannel, toChannel); + await e.Channel.SendMessage($"Copied permission settings from **{fromChannel.Name}** to **{toChannel.Name}**."); + } + catch (Exception ex) + { + await e.Channel.SendMessage($"💢{ex.Message}"); + } + }); + cgb.CreateCommand(Prefix + "upc") + .Alias(Prefix + "userpermissionscopy") + .Description($"Copies BOT PERMISSIONS (not discord permissions) from one role to another.\n**Usage**:`{Prefix}upc @SomeUser ~ @SomeOtherUser`") + .Parameter("from_to", ParameterType.Unparsed) + .Do(async e => + { + var arg = e.GetArg("from_to")?.Trim(); + if (string.IsNullOrWhiteSpace(arg) || !arg.Contains('~')) + return; + var args = arg.Split('~').Select(a => a.Trim()).ToArray(); + if (args.Length > 2) + { + await e.Channel.SendMessage("💢Invalid number of '~'s in the argument."); + return; + } + try + { + var fromUser = PermissionHelper.ValidateUser(e.Server, args[0]); + var toUser = PermissionHelper.ValidateUser(e.Server, args[1]); + + PermissionsHandler.CopyUserPermissions(fromUser, toUser); + await e.Channel.SendMessage($"Copied permission settings from **{fromUser.ToString()}**to * *{toUser.ToString()}**."); + } + catch (Exception ex) + { + await e.Channel.SendMessage($"💢{ex.Message}"); + } + }); + cgb.CreateCommand(Prefix + "verbose") .Alias(Prefix + "v") .Description("Sets whether to show when a command/module is blocked.\n**Usage**: ;verbose true")