From 924041bff4ae00eac879ee8fcb1087f1317209df Mon Sep 17 00:00:00 2001 From: Luck Date: Thu, 6 Oct 2016 21:23:27 +0100 Subject: [PATCH] Add server and world args to clear command, and add clearmeta command --- .../commands/group/GroupMainCommand.java | 1 + .../group/subcommands/GroupClear.java | 45 +++++++++-- .../group/subcommands/GroupClearMeta.java | 79 +++++++++++++++++++ .../commands/user/UserMainCommand.java | 1 + .../commands/user/subcommands/UserClear.java | 44 +++++++++-- .../user/subcommands/UserClearMeta.java | 79 +++++++++++++++++++ .../me/lucko/luckperms/constants/Message.java | 5 +- .../lucko/luckperms/constants/Permission.java | 2 + .../luckperms/core/PermissionHolder.java | 70 ++++++++++++++++ 9 files changed, 309 insertions(+), 17 deletions(-) create mode 100644 common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClearMeta.java create mode 100644 common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClearMeta.java diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java index 9bb4433d3..bbef412d4 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/GroupMainCommand.java @@ -60,6 +60,7 @@ public class GroupMainCommand extends MainCommand { .add(new GroupAddTempSuffix()) .add(new GroupRemoveTempPrefix()) .add(new GroupRemoveTempSuffix()) + .add(new GroupClearMeta()) .add(new GroupBulkChange()) .add(new GroupClear()) .add(new GroupRename()) diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClear.java b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClear.java index 5e727bab8..33cc6c892 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClear.java +++ b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClear.java @@ -23,27 +23,56 @@ package me.lucko.luckperms.commands.group.subcommands; import me.lucko.luckperms.LuckPermsPlugin; -import me.lucko.luckperms.commands.CommandResult; -import me.lucko.luckperms.commands.Predicate; -import me.lucko.luckperms.commands.Sender; -import me.lucko.luckperms.commands.SubCommand; +import me.lucko.luckperms.commands.*; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.data.LogEntry; import me.lucko.luckperms.groups.Group; +import me.lucko.luckperms.utils.ArgumentChecker; import java.util.List; +import java.util.stream.Collectors; public class GroupClear extends SubCommand { public GroupClear() { - super("clear", "Clears the group's permissions", Permission.GROUP_CLEAR, Predicate.alwaysFalse(), null); + super("clear", "Clears the group's permissions and parent groups", Permission.GROUP_CLEAR, Predicate.notInRange(0, 2), + Arg.list( + Arg.create("server", false, "the server name to filter by"), + Arg.create("world", false, "the world name to filter by") + ) + ); } @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Group group, List args, String label) { - group.clearNodes(); - Message.CLEAR_SUCCESS.send(sender, group.getDisplayName()); - LogEntry.build().actor(sender).acted(group).action("clear").build().submit(plugin, sender); + int before = group.getNodes().size(); + + if (args.size() == 0) { + group.clearNodes(); + } else { + final String server = args.get(0); + if (ArgumentChecker.checkServer(server)) { + Message.SERVER_INVALID_ENTRY.send(sender); + return CommandResult.INVALID_ARGS; + } + + if (args.size() == 2) { + final String world = args.get(1); + group.clearNodes(server, world); + + } else { + group.clearNodes(server); + } + } + + int changed = before - group.getNodes().size(); + if (changed == 1) { + Message.CLEAR_SUCCESS_SINGULAR.send(sender, group.getName(), changed); + } else { + Message.CLEAR_SUCCESS.send(sender, group.getName(), changed); + } + + LogEntry.build().actor(sender).acted(group).action("clear " + args.stream().collect(Collectors.joining(" "))).build().submit(plugin, sender); save(group, sender, plugin); return CommandResult.SUCCESS; } diff --git a/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClearMeta.java b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClearMeta.java new file mode 100644 index 000000000..f0885ee47 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/commands/group/subcommands/GroupClearMeta.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016 Lucko (Luck) + * + * 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.commands.group.subcommands; + +import me.lucko.luckperms.LuckPermsPlugin; +import me.lucko.luckperms.commands.*; +import me.lucko.luckperms.constants.Message; +import me.lucko.luckperms.constants.Permission; +import me.lucko.luckperms.data.LogEntry; +import me.lucko.luckperms.groups.Group; +import me.lucko.luckperms.utils.ArgumentChecker; + +import java.util.List; +import java.util.stream.Collectors; + +public class GroupClearMeta extends SubCommand { + public GroupClearMeta() { + super("clearmeta", "Clears the groups's meta", Permission.GROUP_CLEARMETA, Predicate.notInRange(0, 2), + Arg.list( + Arg.create("server", false, "the server name to filter by"), + Arg.create("world", false, "the world name to filter by") + ) + ); + } + + @Override + public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Group group, List args, String label) { + int before = group.getNodes().size(); + + if (args.size() == 0) { + group.clearMeta(); + } else { + final String server = args.get(0); + if (ArgumentChecker.checkServer(server)) { + Message.SERVER_INVALID_ENTRY.send(sender); + return CommandResult.INVALID_ARGS; + } + + if (args.size() == 2) { + final String world = args.get(1); + group.clearMeta(server, world); + + } else { + group.clearMeta(server); + } + } + + int changed = before - group.getNodes().size(); + if (changed == 1) { + Message.META_CLEAR_SUCCESS_SINGULAR.send(sender, group.getName(), changed); + } else { + Message.META_CLEAR_SUCCESS.send(sender, group.getName(), changed); + } + + LogEntry.build().actor(sender).acted(group).action("clearmeta " + args.stream().collect(Collectors.joining(" "))).build().submit(plugin, sender); + save(group, sender, plugin); + return CommandResult.SUCCESS; + } +} diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java b/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java index 25324a126..b7f3d5f48 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/UserMainCommand.java @@ -67,6 +67,7 @@ public class UserMainCommand extends MainCommand { .add(new UserAddTempSuffix()) .add(new UserRemoveTempPrefix()) .add(new UserRemoveTempSuffix()) + .add(new UserClearMeta()) .add(new UserBulkChange()) .add(new UserClear()) .build() diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClear.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClear.java index 5c3cb3976..46783b8f0 100644 --- a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClear.java +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClear.java @@ -23,28 +23,56 @@ package me.lucko.luckperms.commands.user.subcommands; import me.lucko.luckperms.LuckPermsPlugin; -import me.lucko.luckperms.commands.CommandResult; -import me.lucko.luckperms.commands.Predicate; -import me.lucko.luckperms.commands.Sender; -import me.lucko.luckperms.commands.SubCommand; +import me.lucko.luckperms.commands.*; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.constants.Permission; import me.lucko.luckperms.data.LogEntry; import me.lucko.luckperms.users.User; +import me.lucko.luckperms.utils.ArgumentChecker; import java.util.List; +import java.util.stream.Collectors; public class UserClear extends SubCommand { public UserClear() { - super("clear", "Clears the user's permissions and groups", Permission.USER_CLEAR, Predicate.alwaysFalse(), null); + super("clear", "Clears the user's permissions and groups", Permission.USER_CLEAR, Predicate.notInRange(0, 2), + Arg.list( + Arg.create("server", false, "the server name to filter by"), + Arg.create("world", false, "the world name to filter by") + ) + ); } @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, User user, List args, String label) { - user.clearNodes(); - Message.CLEAR_SUCCESS.send(sender, user.getName()); - LogEntry.build().actor(sender).acted(user).action("clear").build().submit(plugin, sender); + int before = user.getNodes().size(); + if (args.size() == 0) { + user.clearNodes(); + } else { + final String server = args.get(0); + if (ArgumentChecker.checkServer(server)) { + Message.SERVER_INVALID_ENTRY.send(sender); + return CommandResult.INVALID_ARGS; + } + + if (args.size() == 2) { + final String world = args.get(1); + user.clearNodes(server, world); + + } else { + user.clearNodes(server); + } + } + + int changed = before - user.getNodes().size(); + if (changed == 1) { + Message.CLEAR_SUCCESS_SINGULAR.send(sender, user.getName(), changed); + } else { + Message.CLEAR_SUCCESS.send(sender, user.getName(), changed); + } + + LogEntry.build().actor(sender).acted(user).action("clear " + args.stream().collect(Collectors.joining(" "))).build().submit(plugin, sender); save(user, sender, plugin); return CommandResult.SUCCESS; } diff --git a/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClearMeta.java b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClearMeta.java new file mode 100644 index 000000000..f12378934 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/commands/user/subcommands/UserClearMeta.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016 Lucko (Luck) + * + * 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.commands.user.subcommands; + +import me.lucko.luckperms.LuckPermsPlugin; +import me.lucko.luckperms.commands.*; +import me.lucko.luckperms.constants.Message; +import me.lucko.luckperms.constants.Permission; +import me.lucko.luckperms.data.LogEntry; +import me.lucko.luckperms.users.User; +import me.lucko.luckperms.utils.ArgumentChecker; + +import java.util.List; +import java.util.stream.Collectors; + +public class UserClearMeta extends SubCommand { + public UserClearMeta() { + super("clearmeta", "Clears the user's meta", Permission.USER_CLEARMETA, Predicate.notInRange(0, 2), + Arg.list( + Arg.create("server", false, "the server name to filter by"), + Arg.create("world", false, "the world name to filter by") + ) + ); + } + + @Override + public CommandResult execute(LuckPermsPlugin plugin, Sender sender, User user, List args, String label) { + int before = user.getNodes().size(); + + if (args.size() == 0) { + user.clearMeta(); + } else { + final String server = args.get(0); + if (ArgumentChecker.checkServer(server)) { + Message.SERVER_INVALID_ENTRY.send(sender); + return CommandResult.INVALID_ARGS; + } + + if (args.size() == 2) { + final String world = args.get(1); + user.clearMeta(server, world); + + } else { + user.clearMeta(server); + } + } + + int changed = before - user.getNodes().size(); + if (changed == 1) { + Message.META_CLEAR_SUCCESS_SINGULAR.send(sender, user.getName(), changed); + } else { + Message.META_CLEAR_SUCCESS.send(sender, user.getName(), changed); + } + + LogEntry.build().actor(sender).acted(user).action("clearmeta " + args.stream().collect(Collectors.joining(" "))).build().submit(plugin, sender); + save(user, sender, plugin); + return CommandResult.SUCCESS; + } +} diff --git a/common/src/main/java/me/lucko/luckperms/constants/Message.java b/common/src/main/java/me/lucko/luckperms/constants/Message.java index 68d38f61b..784642608 100644 --- a/common/src/main/java/me/lucko/luckperms/constants/Message.java +++ b/common/src/main/java/me/lucko/luckperms/constants/Message.java @@ -171,7 +171,10 @@ public enum Message { UNSET_TEMP_PERMISSION_SUCCESS("&aUnset temporary permission &b{0}&a for &b{1}&a.", true), UNSET_TEMP_PERMISSION_SERVER_SUCCESS("&aUnset temporary permission &b{0}&a for &b{1}&a on server &b{2}&a.", true), UNSET_TEMP_PERMISSION_SERVER_WORLD_SUCCESS("&aUnset temporary permission &b{0}&a for &b{1}&a on server &b{2}&a, world &b{3}&a.", true), - CLEAR_SUCCESS("&b{0}&a's permissions were cleared.", 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), + 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), 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/constants/Permission.java b/common/src/main/java/me/lucko/luckperms/constants/Permission.java index a2253a513..d440d1634 100644 --- a/common/src/main/java/me/lucko/luckperms/constants/Permission.java +++ b/common/src/main/java/me/lucko/luckperms/constants/Permission.java @@ -72,6 +72,7 @@ public enum Permission { USER_REMOVE_TEMP_PREFIX("removetempprefix", "user"), USER_ADD_TEMP_SUFFIX("addtempsuffix", "user"), USER_REMOVE_TEMP_SUFFIX("removetempsuffix", "user"), + USER_CLEARMETA("clearmeta", "user"), USER_BULKCHANGE("bulkchange", "user"), USER_CLEAR("clear", "user"), @@ -98,6 +99,7 @@ public enum Permission { GROUP_REMOVE_TEMP_PREFIX("removetempprefix", "group"), GROUP_ADD_TEMP_SUFFIX("addtempsuffix", "group"), GROUP_REMOVE_TEMP_SUFFIX("removetempsuffix", "group"), + GROUP_CLEARMETA("clearmeta", "group"), GROUP_BULKCHANGE("bulkchange", "group"), GROUP_CLEAR("clear", "group"), GROUP_RENAME("rename", "group"), diff --git a/common/src/main/java/me/lucko/luckperms/core/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/core/PermissionHolder.java index 5deb43a62..c7d8d31ed 100644 --- a/common/src/main/java/me/lucko/luckperms/core/PermissionHolder.java +++ b/common/src/main/java/me/lucko/luckperms/core/PermissionHolder.java @@ -162,6 +162,76 @@ public abstract class PermissionHolder { } } + public void clearNodes(String server) { + if (server == null) { + server = "global"; + } + String finalServer = server; + + synchronized (nodes) { + nodes.removeIf(n -> n.getServer().orElse("global").equalsIgnoreCase(finalServer)); + invalidateCache(true); + } + } + + public void clearNodes(String server, String world) { + if (server == null) { + server = "global"; + } + String finalServer = server; + + if (world == null) { + world = "null"; + } + String finalWorld = world; + + synchronized (nodes) { + nodes.removeIf(n -> n.getServer().orElse("global").equalsIgnoreCase(finalServer) && n.getWorld().orElse("null").equalsIgnoreCase(finalWorld)); + invalidateCache(true); + } + } + + public void clearMeta() { + synchronized (nodes) { + nodes.removeIf(n -> n.isMeta() || n.isPrefix() || n.isSuffix()); + invalidateCache(true); + } + } + + public void clearMeta(String server) { + if (server == null) { + server = "global"; + } + String finalServer = server; + + synchronized (nodes) { + nodes.removeIf(n -> (n.isMeta() || n.isPrefix() || n.isSuffix()) && + n.getServer().orElse("global").equalsIgnoreCase(finalServer) + ); + invalidateCache(true); + } + } + + public void clearMeta(String server, String world) { + if (server == null) { + server = "global"; + } + String finalServer = server; + + if (world == null) { + world = "null"; + } + String finalWorld = world; + + synchronized (nodes) { + nodes.removeIf(n -> (n.isMeta() || n.isPrefix() || n.isSuffix()) && + (n.getServer().orElse("global").equalsIgnoreCase(finalServer) && + n.getWorld().orElse("null").equalsIgnoreCase(finalWorld)) + ); + invalidateCache(true); + } + } + public void clearTransientNodes() { synchronized (transientNodes) { transientNodes.clear();