1
0
mirror of https://github.com/lucko/LuckPerms.git synced 2025-09-09 05:40:47 +02:00

Fix applying track reordering from the webeditor (#2144)

This commit is contained in:
Luck
2020-04-06 11:55:49 +01:00
parent 0d89fc9d28
commit 54aed80db8

View File

@@ -25,7 +25,6 @@
package me.lucko.luckperms.common.commands.misc; package me.lucko.luckperms.common.commands.misc;
import com.google.common.collect.Maps;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@@ -59,10 +58,10 @@ import net.luckperms.api.model.data.DataType;
import net.luckperms.api.node.Node; import net.luckperms.api.node.Node;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@@ -165,9 +164,8 @@ public class ApplyEditsCommand extends SingleCommand {
Set<Node> before = new HashSet<>(holder.normalData().immutable().values()); Set<Node> before = new HashSet<>(holder.normalData().immutable().values());
Set<Node> after = new HashSet<>(NodeJsonSerializer.deserializeNodes(data.getAsJsonArray("nodes"))); Set<Node> after = new HashSet<>(NodeJsonSerializer.deserializeNodes(data.getAsJsonArray("nodes")));
Map.Entry<Set<Node>, Set<Node>> diff = diff(before, after); Set<Node> diffAdded = getAdded(before, after);
Set<Node> diffAdded = diff.getKey(); Set<Node> diffRemoved = getRemoved(before, after);
Set<Node> diffRemoved = diff.getValue();
int additions = diffAdded.size(); int additions = diffAdded.size();
int deletions = diffRemoved.size(); int deletions = diffRemoved.size();
@@ -212,23 +210,27 @@ public class ApplyEditsCommand extends SingleCommand {
track = plugin.getStorage().createAndLoadTrack(id, CreationCause.WEB_EDITOR).join(); track = plugin.getStorage().createAndLoadTrack(id, CreationCause.WEB_EDITOR).join();
} }
Set<String> before = new LinkedHashSet<>(track.getGroups()); List<String> before = track.getGroups();
Set<String> after = new LinkedHashSet<>(); List<String> after = new ArrayList<>();
data.getAsJsonArray("groups").forEach(e -> after.add(e.getAsString())); data.getAsJsonArray("groups").forEach(e -> after.add(e.getAsString()));
Map.Entry<Set<String>, Set<String>> diff = diff(before, after); if (before.equals(after)) {
Set<String> diffAdded = diff.getKey(); return false;
Set<String> diffRemoved = diff.getValue(); }
Set<String> diffAdded = getAdded(before, after);
Set<String> diffRemoved = getRemoved(before, after);
int additions = diffAdded.size(); int additions = diffAdded.size();
int deletions = diffRemoved.size(); int deletions = diffRemoved.size();
if (additions == 0 && deletions == 0) { track.setGroups(after);
return false;
if (hasBeenReordered(before, after, diffAdded, diffRemoved)) {
LoggedAction.build().source(sender).target(track)
.description("webeditor", "reorder", after)
.build().submit(plugin, sender);
} }
track.setGroups(new ArrayList<>(after));
for (String n : diffAdded) { for (String n : diffAdded) {
LoggedAction.build().source(sender).target(track) LoggedAction.build().source(sender).target(track)
.description("webeditor", "add", n) .description("webeditor", "add", n)
@@ -245,12 +247,8 @@ public class ApplyEditsCommand extends SingleCommand {
Message.APPLY_EDITS_SUCCESS.send(sender, "track", track.getName()); Message.APPLY_EDITS_SUCCESS.send(sender, "track", track.getName());
Message.APPLY_EDITS_SUCCESS_SUMMARY.send(sender, additions, additionsSummary, deletions, deletionsSummary); Message.APPLY_EDITS_SUCCESS_SUMMARY.send(sender, additions, additionsSummary, deletions, deletionsSummary);
for (String n : diffAdded) { Message.APPLY_EDITS_DIFF_REMOVED.send(sender, before);
Message.APPLY_EDITS_DIFF_ADDED.send(sender, n); Message.APPLY_EDITS_DIFF_ADDED.send(sender, after);
}
for (String n : diffRemoved) {
Message.APPLY_EDITS_DIFF_REMOVED.send(sender, n);
}
StorageAssistant.save(track, sender, plugin); StorageAssistant.save(track, sender, plugin);
return true; return true;
} }
@@ -315,17 +313,26 @@ public class ApplyEditsCommand extends SingleCommand {
(n.hasExpiry() ? " &7(" + DurationFormatter.CONCISE.format(n.getExpiryDuration()) + ")" : ""); (n.hasExpiry() ? " &7(" + DurationFormatter.CONCISE.format(n.getExpiryDuration()) + ")" : "");
} }
private static <T> Map.Entry<Set<T>, Set<T>> diff(Set<T> before, Set<T> after) { private static <T> Set<T> getAdded(Collection<T> before, Collection<T> after) {
// entries in before but not after are being removed
// entries in after but not before are being added
Set<T> added = new LinkedHashSet<>(after); Set<T> added = new LinkedHashSet<>(after);
added.removeAll(before); added.removeAll(before);
return added;
}
private static <T> Set<T> getRemoved(Collection<T> before, Collection<T> after) {
Set<T> removed = new LinkedHashSet<>(before); Set<T> removed = new LinkedHashSet<>(before);
removed.removeAll(after); removed.removeAll(after);
return removed;
}
return Maps.immutableEntry(added, removed); private static <T> boolean hasBeenReordered(List<T> before, List<T> after, Collection<T> diffAdded, Collection<T> diffRemoved) {
after = new ArrayList<>(after);
before = new ArrayList<>(before);
after.removeAll(diffAdded);
before.removeAll(diffRemoved);
return !before.equals(after);
} }
@Override @Override