From e25d99129c90e92b40e86ce46f42b200bb373ad3 Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 9 May 2017 14:06:16 +0100 Subject: [PATCH] Implement parent settrack command - closes #112 --- .../commands/impl/generic/meta/MetaClear.java | 5 +- .../impl/generic/other/HolderClear.java | 5 +- .../impl/generic/parent/CommandParent.java | 1 + .../impl/generic/parent/ParentClear.java | 5 +- .../impl/generic/parent/ParentSetTrack.java | 130 ++++++++++++++++++ .../luckperms/common/constants/Message.java | 13 +- .../common/constants/Permission.java | 2 + 7 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/meta/MetaClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/meta/MetaClear.java index d86c46761..ee509c2e7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/meta/MetaClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/meta/MetaClear.java @@ -32,6 +32,7 @@ import me.lucko.luckperms.common.commands.CommandResult; import me.lucko.luckperms.common.commands.abstraction.SharedSubCommand; import me.lucko.luckperms.common.commands.sender.Sender; import me.lucko.luckperms.common.commands.utils.ArgumentUtils; +import me.lucko.luckperms.common.commands.utils.Util; import me.lucko.luckperms.common.constants.Message; import me.lucko.luckperms.common.constants.Permission; import me.lucko.luckperms.common.core.model.PermissionHolder; @@ -65,9 +66,9 @@ public class MetaClear extends SharedSubCommand { int changed = before - holder.getNodes().size(); if (changed == 1) { - Message.META_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), changed); + Message.META_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } else { - Message.META_CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), changed); + Message.META_CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } LogEntry.build().actor(sender).acted(holder) diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderClear.java index 8ee1deac9..7f3ed143e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/other/HolderClear.java @@ -32,6 +32,7 @@ import me.lucko.luckperms.common.commands.CommandResult; import me.lucko.luckperms.common.commands.abstraction.SubCommand; import me.lucko.luckperms.common.commands.sender.Sender; import me.lucko.luckperms.common.commands.utils.ArgumentUtils; +import me.lucko.luckperms.common.commands.utils.Util; import me.lucko.luckperms.common.constants.Message; import me.lucko.luckperms.common.constants.Permission; import me.lucko.luckperms.common.core.model.Group; @@ -68,9 +69,9 @@ public class HolderClear extends SubCommand { int changed = before - holder.getNodes().size(); if (changed == 1) { - Message.CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), changed); + Message.CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } else { - Message.CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), changed); + Message.CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } LogEntry.build().actor(sender).acted(holder) diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/CommandParent.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/CommandParent.java index 733d95949..1f293b8d7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/CommandParent.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/CommandParent.java @@ -38,6 +38,7 @@ public class CommandParent extends SharedMainCommand .add(new ParentSet()) .add(new ParentAdd()) .add(new ParentRemove()) + .add(new ParentSetTrack()) .add(new ParentAddTemp()) .add(new ParentRemoveTemp()) .add(new ParentClear()) diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClear.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClear.java index 6dc610d0f..ac41deabf 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClear.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentClear.java @@ -32,6 +32,7 @@ import me.lucko.luckperms.common.commands.CommandResult; import me.lucko.luckperms.common.commands.abstraction.SharedSubCommand; import me.lucko.luckperms.common.commands.sender.Sender; import me.lucko.luckperms.common.commands.utils.ArgumentUtils; +import me.lucko.luckperms.common.commands.utils.Util; import me.lucko.luckperms.common.constants.Message; import me.lucko.luckperms.common.constants.Permission; import me.lucko.luckperms.common.core.model.PermissionHolder; @@ -65,9 +66,9 @@ public class ParentClear extends SharedSubCommand { int changed = before - holder.getNodes().size(); if (changed == 1) { - Message.PARENT_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), changed); + Message.PARENT_CLEAR_SUCCESS_SINGULAR.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } else { - Message.PARENT_CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), changed); + Message.PARENT_CLEAR_SUCCESS.send(sender, holder.getFriendlyName(), Util.contextSetToString(context), changed); } LogEntry.build().actor(sender).acted(holder) diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java new file mode 100644 index 000000000..19c18d637 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/generic/parent/ParentSetTrack.java @@ -0,0 +1,130 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.commands.impl.generic.parent; + +import me.lucko.luckperms.api.context.MutableContextSet; +import me.lucko.luckperms.common.commands.Arg; +import me.lucko.luckperms.common.commands.CommandException; +import me.lucko.luckperms.common.commands.CommandResult; +import me.lucko.luckperms.common.commands.abstraction.SharedSubCommand; +import me.lucko.luckperms.common.commands.sender.Sender; +import me.lucko.luckperms.common.commands.utils.ArgumentUtils; +import me.lucko.luckperms.common.commands.utils.Util; +import me.lucko.luckperms.common.constants.DataConstraints; +import me.lucko.luckperms.common.constants.Message; +import me.lucko.luckperms.common.constants.Permission; +import me.lucko.luckperms.common.core.model.Group; +import me.lucko.luckperms.common.core.model.PermissionHolder; +import me.lucko.luckperms.common.core.model.Track; +import me.lucko.luckperms.common.data.LogEntry; +import me.lucko.luckperms.common.plugin.LuckPermsPlugin; +import me.lucko.luckperms.common.utils.Predicates; + +import java.util.List; +import java.util.stream.Collectors; + +import static me.lucko.luckperms.common.commands.abstraction.SubCommand.getTrackTabComplete; + +public class ParentSetTrack extends SharedSubCommand { + public ParentSetTrack() { + super("settrack", "Removes all other groups the object inherits from already on the given track and adds them to the one given group", + Permission.USER_PARENT_SET_TRACK, Permission.GROUP_PARENT_SET_TRACK, Predicates.is(0), + Arg.list( + Arg.create("track", true, "the track to set on"), + Arg.create("group", true, "the group to set to, or a number relating to the position of the group on the given track"), + Arg.create("context...", false, "the contexts to set the group in") + ) + ); + } + + @Override + public CommandResult execute(LuckPermsPlugin plugin, Sender sender, PermissionHolder holder, List args, String label) throws CommandException { + final String trackName = args.get(0).toLowerCase(); + if (!DataConstraints.TRACK_NAME_TEST.test(trackName)) { + Message.TRACK_INVALID_ENTRY.send(sender); + return CommandResult.INVALID_ARGS; + } + + if (!plugin.getStorage().loadTrack(trackName).join()) { + Message.TRACK_DOES_NOT_EXIST.send(sender); + return CommandResult.INVALID_ARGS; + } + + Track track = plugin.getTrackManager().getIfLoaded(trackName); + if (track == null) { + Message.TRACK_DOES_NOT_EXIST.send(sender); + return CommandResult.LOADING_ERROR; + } + + if (track.getSize() <= 1) { + Message.TRACK_EMPTY.send(sender); + return CommandResult.STATE_ERROR; + } + + int index = ArgumentUtils.handleIntOrElse(1, args, -1); + String groupName; + if (index > 0) { + List trackGroups = track.getGroups(); + if ((index - 1) >= trackGroups.size()) { + Message.GROUP_DOES_NOT_EXIST.send(sender); + return CommandResult.INVALID_ARGS; + } + groupName = track.getGroups().get(index - 1); + } else { + groupName = ArgumentUtils.handleName(1, args); + } + + MutableContextSet context = ArgumentUtils.handleContext(2, args, plugin); + + if (!plugin.getStorage().loadGroup(groupName).join()) { + Message.GROUP_DOES_NOT_EXIST.send(sender); + return CommandResult.INVALID_ARGS; + } + + Group group = plugin.getGroupManager().getIfLoaded(groupName); + if (group == null) { + Message.GROUP_DOES_NOT_EXIST.send(sender); + return CommandResult.LOADING_ERROR; + } + + holder.removeIf(node -> node.isGroupNode() && node.getFullContexts().equals(context) && track.containsGroup(node.getGroupName())); + holder.setInheritGroup(group, context); + + Message.SET_TRACK_PARENT_SUCCESS.send(sender, holder.getFriendlyName(), track.getName(), group.getDisplayName(), Util.contextSetToString(context)); + + LogEntry.build().actor(sender).acted(holder) + .action("parent settrack " + args.stream().map(ArgumentUtils.WRAPPER).collect(Collectors.joining(" "))) + .build().submit(plugin, sender); + + save(holder, sender, plugin); + return CommandResult.SUCCESS; + } + + @Override + public List onTabComplete(LuckPermsPlugin plugin, Sender sender, List args) { + return getTrackTabComplete(args, plugin); + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/constants/Message.java b/common/src/main/java/me/lucko/luckperms/common/constants/Message.java index 275121907..0a0fe74b3 100644 --- a/common/src/main/java/me/lucko/luckperms/common/constants/Message.java +++ b/common/src/main/java/me/lucko/luckperms/common/constants/Message.java @@ -221,15 +221,16 @@ public enum Message { SET_INHERIT_SUCCESS("&b{0}&a now inherits permissions from &b{1}&a in context {2}&a.", true), SET_TEMP_INHERIT_SUCCESS("&b{0}&a now inherits permissions from &b{1}&a for a duration of &b{2}&a in context {3}&a.", true), SET_PARENT_SUCCESS("&b{0}&a had their existing parent groups cleared, and now only inherits &b{1}&a in context {2}&a.", true), + SET_TRACK_PARENT_SUCCESS("&b{0}&a had their existing parent groups in track &b{1}&a cleared, and now only inherits &b{2}&a in context {3}&a.", true), UNSET_INHERIT_SUCCESS("&b{0}&a no longer inherits permissions from &b{1}&a in context {2}&a.", true), UNSET_TEMP_INHERIT_SUCCESS("&b{0}&a no longer temporarily inherits permissions from &b{1}&a in context {2}&a.", true), - CLEAR_SUCCESS("&b{0}&a's permissions were cleared. (&b{1}&a nodes were removed.)", true), - CLEAR_SUCCESS_SINGULAR("&b{0}&a's permissions were cleared. (&b{1}&a node was removed.)", true), - PARENT_CLEAR_SUCCESS("&b{0}&a's parents were cleared. (&b{1}&a nodes were removed.)", true), - PARENT_CLEAR_SUCCESS_SINGULAR("&b{0}&a's parents were cleared. (&b{1}&a node was removed.)", true), - META_CLEAR_SUCCESS("&b{0}&a's meta was cleared. (&b{1}&a nodes were removed.)", true), - META_CLEAR_SUCCESS_SINGULAR("&b{0}&a's meta was cleared. (&b{1}&a node was removed.)", true), + CLEAR_SUCCESS("&b{0}&a's permissions were cleared in context {1}&a. (&b{2}&a nodes were removed.)", true), + CLEAR_SUCCESS_SINGULAR("&b{0}&a's permissions were cleared in context {1}&a. (&b{2}&a node was removed.)", true), + PARENT_CLEAR_SUCCESS("&b{0}&a's parents were cleared in context {1}&a. &b{2}&a nodes were removed.)", true), + PARENT_CLEAR_SUCCESS_SINGULAR("&b{0}&a's parents were cleared in context {1}&a. &b{2}&a node was removed.)", true), + META_CLEAR_SUCCESS("&b{0}&a's meta was cleared in context {1}&a. &b{2}&a nodes were removed.)", true), + META_CLEAR_SUCCESS_SINGULAR("&b{0}&a's meta was cleared in context {1}&a. &b{2}&a node was removed.)", true), ILLEGAL_DATE_ERROR("Could not parse date '{0}'.", true), PAST_DATE_ERROR("You cannot set a date in the past!", true), diff --git a/common/src/main/java/me/lucko/luckperms/common/constants/Permission.java b/common/src/main/java/me/lucko/luckperms/common/constants/Permission.java index 10b1a07d4..7a6233905 100644 --- a/common/src/main/java/me/lucko/luckperms/common/constants/Permission.java +++ b/common/src/main/java/me/lucko/luckperms/common/constants/Permission.java @@ -68,6 +68,7 @@ public enum Permission { USER_PERM_CHECK_INHERITS(list("permission.checkinherits", "inheritspermission"), Type.USER), USER_PARENT_INFO(list("parent.info", "listgroups"), Type.USER), USER_PARENT_SET(list("parent.set"), Type.USER), + USER_PARENT_SET_TRACK(list("parent.settrack"), Type.USER), USER_PARENT_ADD(list("parent.add", "addgroup"), Type.USER), USER_PARENT_REMOVE(list("parent.remove", "removegroup"), Type.USER), USER_PARENT_ADDTEMP(list("parent.addtemp", "addtempgroup"), Type.USER), @@ -103,6 +104,7 @@ public enum Permission { GROUP_PERM_CHECK_INHERITS(list("permission.checkinherits", "inheritspermission"), Type.GROUP), GROUP_PARENT_INFO(list("parent.info", "listparents"), Type.GROUP), GROUP_PARENT_SET(list("parent.set"), Type.GROUP), + GROUP_PARENT_SET_TRACK(list("parent.settrack"), Type.GROUP), GROUP_PARENT_ADD(list("parent.add", "setinherit"), Type.GROUP), GROUP_PARENT_REMOVE(list("parent.remove", "unsetinherit"), Type.GROUP), GROUP_PARENT_ADDTEMP(list("parent.addtemp", "settempinherit"), Type.GROUP),