From fb36bd0ced44be91ed3a52f6a85a362e77eda63c Mon Sep 17 00:00:00 2001 From: Emily <35617540+emilyy-dev@users.noreply.github.com> Date: Sun, 4 Jul 2021 06:00:18 -0300 Subject: [PATCH] Bulk update triggers for group related commands (#3073) --- bukkit/src/main/resources/luckperms.commodore | 8 +++- .../common/commands/group/DeleteGroup.java | 39 +++++++++++++++++- .../common/commands/group/GroupRename.java | 40 ++++++++++++++++++- .../commands/misc/BulkUpdateCommand.java | 2 +- 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/resources/luckperms.commodore b/bukkit/src/main/resources/luckperms.commodore index b6693077f..c74b52525 100644 --- a/bukkit/src/main/resources/luckperms.commodore +++ b/bukkit/src/main/resources/luckperms.commodore @@ -62,7 +62,9 @@ luckperms { } } deletegroup { - name brigadier:string single_word; + name brigadier:string single_word { + flags brigadier:string greedy_phrase; + } } listgroups; createtrack { @@ -546,7 +548,9 @@ luckperms { context brigadier:string greedy_phrase; } rename { - newname brigadier:string single_word; + newname brigadier:string single_word { + flags brigadier:string greedy_phrase; + } } clone { newname brigadier:string single_word; diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java index 66628c6aa..9a59556f2 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/DeleteGroup.java @@ -26,16 +26,28 @@ package me.lucko.luckperms.common.commands.group; import me.lucko.luckperms.common.actionlog.LoggedAction; +import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.BulkUpdateBuilder; +import me.lucko.luckperms.common.bulkupdate.DataType; +import me.lucko.luckperms.common.bulkupdate.action.DeleteAction; +import me.lucko.luckperms.common.bulkupdate.comparison.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparison.StandardComparison; +import me.lucko.luckperms.common.bulkupdate.query.Query; +import me.lucko.luckperms.common.bulkupdate.query.QueryField; import me.lucko.luckperms.common.command.abstraction.SingleCommand; import me.lucko.luckperms.common.command.access.ArgumentPermissions; import me.lucko.luckperms.common.command.access.CommandPermission; import me.lucko.luckperms.common.command.spec.CommandSpec; +import me.lucko.luckperms.common.command.tabcomplete.CompletionSupplier; import me.lucko.luckperms.common.command.tabcomplete.TabCompleter; import me.lucko.luckperms.common.command.tabcomplete.TabCompletions; import me.lucko.luckperms.common.command.utils.ArgumentList; +import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.locale.Message; +import me.lucko.luckperms.common.messaging.InternalMessagingService; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.manager.group.GroupManager; +import me.lucko.luckperms.common.node.types.Inheritance; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.util.Predicates; @@ -44,10 +56,11 @@ import net.luckperms.api.actionlog.Action; import net.luckperms.api.event.cause.DeletionCause; import java.util.List; +import java.util.Optional; public class DeleteGroup extends SingleCommand { public DeleteGroup() { - super(CommandSpec.DELETE_GROUP, "DeleteGroup", CommandPermission.DELETE_GROUP, Predicates.not(1)); + super(CommandSpec.DELETE_GROUP, "DeleteGroup", CommandPermission.DELETE_GROUP, Predicates.notInRange(1, 2)); } @Override @@ -89,13 +102,35 @@ public class DeleteGroup extends SingleCommand { .description("delete") .build().submit(plugin, sender); - plugin.getSyncTaskBuffer().request(); + if (!args.remove("--update-parent-lists")) { + plugin.getSyncTaskBuffer().request(); + } else { + // the group is now deleted, proceed to remove its representing inheritance nodes + BulkUpdate operation = BulkUpdateBuilder.create() + .trackStatistics(false) + .dataType(DataType.ALL) + .action(DeleteAction.create()) + .query(Query.of(QueryField.PERMISSION, Constraint.of(StandardComparison.EQUAL, Inheritance.key(groupName)))) + .build(); + plugin.getStorage().applyBulkUpdate(operation).whenCompleteAsync((v, ex) -> { + if (ex != null) { + ex.printStackTrace(); + } + + plugin.getSyncTaskBuffer().requestDirectly(); // sync regardless of failure state + Optional messagingService = plugin.getMessagingService(); + if (messagingService.isPresent() && plugin.getConfiguration().get(ConfigKeys.AUTO_PUSH_UPDATES)) { + messagingService.get().getUpdateBuffer().request(); + } + }, plugin.getBootstrap().getScheduler().async()); + } } @Override public List tabComplete(LuckPermsPlugin plugin, Sender sender, ArgumentList args) { return TabCompleter.create() .at(0, TabCompletions.groups(plugin)) + .at(1, CompletionSupplier.startsWith("--update-parent-lists")) .complete(args); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java index 11081760c..0186e3dcf 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupRename.java @@ -26,14 +26,24 @@ package me.lucko.luckperms.common.commands.group; import me.lucko.luckperms.common.actionlog.LoggedAction; +import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.BulkUpdateBuilder; +import me.lucko.luckperms.common.bulkupdate.action.UpdateAction; +import me.lucko.luckperms.common.bulkupdate.comparison.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparison.StandardComparison; +import me.lucko.luckperms.common.bulkupdate.query.Query; +import me.lucko.luckperms.common.bulkupdate.query.QueryField; import me.lucko.luckperms.common.command.abstraction.ChildCommand; import me.lucko.luckperms.common.command.access.ArgumentPermissions; import me.lucko.luckperms.common.command.access.CommandPermission; import me.lucko.luckperms.common.command.spec.CommandSpec; +import me.lucko.luckperms.common.command.tabcomplete.CompletionSupplier; +import me.lucko.luckperms.common.command.tabcomplete.TabCompleter; import me.lucko.luckperms.common.command.utils.ArgumentList; import me.lucko.luckperms.common.command.utils.StorageAssistant; import me.lucko.luckperms.common.locale.Message; import me.lucko.luckperms.common.model.Group; +import me.lucko.luckperms.common.node.types.Inheritance; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.sender.Sender; import me.lucko.luckperms.common.storage.misc.DataConstraints; @@ -44,9 +54,11 @@ import net.luckperms.api.event.cause.CreationCause; import net.luckperms.api.event.cause.DeletionCause; import net.luckperms.api.model.data.DataType; +import java.util.List; + public class GroupRename extends ChildCommand { public GroupRename() { - super(CommandSpec.GROUP_RENAME, "rename", CommandPermission.GROUP_RENAME, Predicates.not(1)); + super(CommandSpec.GROUP_RENAME, "rename", CommandPermission.GROUP_RENAME, Predicates.notInRange(1, 2)); } @Override @@ -92,6 +104,30 @@ public class GroupRename extends ChildCommand { .description("rename", newGroup.getName()) .build().submit(plugin, sender); - StorageAssistant.save(newGroup, sender, plugin); + if (!args.remove("--update-parent-lists")) { + StorageAssistant.save(newGroup, sender, plugin); + } else { + // the group is now renamed, proceed to update its representing inheritance nodes + BulkUpdate operation = BulkUpdateBuilder.create() + .trackStatistics(false) + .dataType(me.lucko.luckperms.common.bulkupdate.DataType.ALL) + .action(UpdateAction.of(QueryField.PERMISSION, Inheritance.key(newGroupName))) + .query(Query.of(QueryField.PERMISSION, Constraint.of(StandardComparison.EQUAL, Inheritance.key(target.getName())))) + .build(); + plugin.getStorage().applyBulkUpdate(operation).whenCompleteAsync((v, ex) -> { + plugin.getSyncTaskBuffer().requestDirectly(); + if (ex != null) { + ex.printStackTrace(); + } + }, plugin.getBootstrap().getScheduler().async()) + .thenRunAsync(() -> StorageAssistant.save(newGroup, sender, plugin)); + } + } + + @Override + public List tabComplete(LuckPermsPlugin plugin, Sender sender, ArgumentList args) { + return TabCompleter.create() + .at(1, CompletionSupplier.startsWith("--update-parent-lists")) + .complete(args); } } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java index 7c5091590..9f6d9d78d 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java @@ -87,7 +87,7 @@ public class BulkUpdateCommand extends SingleCommand { BulkUpdateBuilder bulkUpdateBuilder = BulkUpdateBuilder.create(); - bulkUpdateBuilder.trackStatistics(!args.remove("--silent")); + bulkUpdateBuilder.trackStatistics(!args.remove("-s")); try { bulkUpdateBuilder.dataType(DataType.valueOf(args.remove(0).toUpperCase()));