Add not_on_track meta stack criteria

This commit is contained in:
Luck 2017-04-16 11:06:05 +01:00
parent a27436b086
commit 3314e94a9a
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
8 changed files with 181 additions and 1 deletions

View File

@ -116,6 +116,8 @@ group-weight:
# - lowest_own
# - highest_on_track_<track>
# - lowest_on_track_<track>
# - highest_not_on_track_<track>
# - lowest_not_on_track_<track>
#
# Each element is added in the order listed.
meta-formatting:

View File

@ -116,6 +116,8 @@ group-weight:
# - lowest_own
# - highest_on_track_<track>
# - lowest_on_track_<track>
# - highest_not_on_track_<track>
# - lowest_not_on_track_<track>
#
# Each element is added in the order listed.
meta-formatting:

View File

@ -94,4 +94,20 @@ public interface MetaStackElement {
return t == null || !t.containsGroup(node.getLocation());
}
/**
* Returns true if the node is held by a group on the track
* @param node the node to check
* @param track the track
* @return true if the accumulation should return
*/
static boolean checkNotTrackElement(LuckPermsPlugin plugin, LocalizedNode node, String track) {
// it's not come from a group on this track (from the user directly)
if (node.getLocation() == null || node.getLocation().equals("")) {
return false;
}
Track t = plugin.getTrackManager().getIfLoaded(track);
return t == null || t.containsGroup(node.getLocation());
}
}

View File

@ -28,9 +28,11 @@ package me.lucko.luckperms.common.caching.stacking;
import lombok.experimental.UtilityClass;
import me.lucko.luckperms.common.caching.stacking.elements.HighestPriorityElement;
import me.lucko.luckperms.common.caching.stacking.elements.HighestPriorityNotOnTrackElement;
import me.lucko.luckperms.common.caching.stacking.elements.HighestPriorityOwnElement;
import me.lucko.luckperms.common.caching.stacking.elements.HighestPriorityTrackElement;
import me.lucko.luckperms.common.caching.stacking.elements.LowestPriorityElement;
import me.lucko.luckperms.common.caching.stacking.elements.LowestPriorityNotOnTrackElement;
import me.lucko.luckperms.common.caching.stacking.elements.LowestPriorityOwnElement;
import me.lucko.luckperms.common.caching.stacking.elements.LowestPriorityTrackElement;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
@ -71,6 +73,16 @@ public class StackElementFactory {
return Optional.of(new LowestPriorityTrackElement(prefix, plugin, track));
}
if (s.startsWith("highest_not_on_track_") && s.length() > "highest_not_on_track_".length()) {
String track = s.substring("highest_not_on_track_".length());
return Optional.of(new HighestPriorityNotOnTrackElement(prefix, plugin, track));
}
if (s.startsWith("lowest_not_on_track_") && s.length() > "lowest_not_on_track_".length()) {
String track = s.substring("lowest_not_on_track_".length());
return Optional.of(new LowestPriorityNotOnTrackElement(prefix, plugin, track));
}
new IllegalArgumentException("Cannot parse MetaStackElement: " + s).printStackTrace();
return Optional.empty();
}

View File

@ -0,0 +1,73 @@
/*
* This file is part of LuckPerms, licensed under the MIT License.
*
* Copyright (c) lucko (Luck) <luck@lucko.me>
* 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.caching.stacking.elements;
import lombok.RequiredArgsConstructor;
import me.lucko.luckperms.api.LocalizedNode;
import me.lucko.luckperms.common.caching.stacking.MetaStackElement;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import java.util.Map;
import java.util.Optional;
@RequiredArgsConstructor
public class HighestPriorityNotOnTrackElement implements MetaStackElement {
private final boolean prefix;
private final LuckPermsPlugin plugin;
private final String trackName;
private Map.Entry<Integer, String> entry = null;
@Override
public Optional<Map.Entry<Integer, String>> getEntry() {
return Optional.ofNullable(entry);
}
@Override
public boolean accumulateNode(LocalizedNode node) {
if (MetaStackElement.checkMetaType(prefix, node)) {
return false;
}
Map.Entry<Integer, String> entry = prefix ? node.getPrefix() : node.getSuffix();
if (HighestPriorityElement.compareEntries(this.entry, entry)) {
return false;
}
if (MetaStackElement.checkNotTrackElement(plugin, node, trackName)) {
return false;
}
this.entry = entry;
return true;
}
@Override
public MetaStackElement copy() {
return new HighestPriorityNotOnTrackElement(prefix, plugin, trackName);
}
}

View File

@ -0,0 +1,73 @@
/*
* This file is part of LuckPerms, licensed under the MIT License.
*
* Copyright (c) lucko (Luck) <luck@lucko.me>
* 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.caching.stacking.elements;
import lombok.RequiredArgsConstructor;
import me.lucko.luckperms.api.LocalizedNode;
import me.lucko.luckperms.common.caching.stacking.MetaStackElement;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import java.util.Map;
import java.util.Optional;
@RequiredArgsConstructor
public class LowestPriorityNotOnTrackElement implements MetaStackElement {
private final boolean prefix;
private final LuckPermsPlugin plugin;
private final String trackName;
private Map.Entry<Integer, String> entry = null;
@Override
public Optional<Map.Entry<Integer, String>> getEntry() {
return Optional.ofNullable(entry);
}
@Override
public boolean accumulateNode(LocalizedNode node) {
if (MetaStackElement.checkMetaType(prefix, node)) {
return false;
}
Map.Entry<Integer, String> entry = prefix ? node.getPrefix() : node.getSuffix();
if (LowestPriorityElement.compareEntries(this.entry, entry)) {
return false;
}
if (MetaStackElement.checkNotTrackElement(plugin, node, trackName)) {
return false;
}
this.entry = entry;
return true;
}
@Override
public MetaStackElement copy() {
return new LowestPriorityNotOnTrackElement(prefix, plugin, trackName);
}
}

View File

@ -57,7 +57,6 @@ import java.util.stream.Collectors;
/**
* An immutable permission node
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
@ToString(of = {"permission", "value", "override", "server", "world", "expireAt", "contexts"})
@EqualsAndHashCode(of = {"permission", "value", "override", "server", "world", "expireAt", "contexts"})
public final class ImmutableNode implements Node {
@ -193,6 +192,7 @@ public final class ImmutableNode implements Node {
* @param world the world this node applies on
* @param contexts any additional contexts applying to this node
*/
@SuppressWarnings("deprecation")
public ImmutableNode(String permission, boolean value, boolean override, long expireAt, String server, String world, ContextSet contexts) {
if (permission == null || permission.equals("")) {
throw new IllegalArgumentException("Empty permission");

View File

@ -118,6 +118,8 @@ group-weight {
# - lowest_own
# - highest_on_track_<track>
# - lowest_on_track_<track>
# - highest_not_on_track_<track>
# - lowest_not_on_track_<track>
#
# Each element is added in the order listed.
meta-formatting {