/** * PermissionsEx * Copyright (C) zml and PermissionsEx contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ninja.leaping.permissionsex.bukkit; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import net.milkbowl.vault.permission.Permission; import ninja.leaping.permissionsex.PermissionsEx; import ninja.leaping.permissionsex.subject.CalculatedSubject; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import javax.annotation.Nullable; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import static ninja.leaping.permissionsex.PermissionsEx.SUBJECTS_GROUP; @SuppressWarnings("deprecation") class PEXVault extends Permission { final PermissionsExPlugin plugin; PEXVault(PermissionsExPlugin plugin) { this.plugin = plugin; } @Override public String getName() { return this.plugin.getName(); } @Override public boolean isEnabled() { return this.plugin.isEnabled(); } @Override public boolean hasSuperPermsCompat() { return true; } @Override public String[] getGroups() { return Iterables.toArray(this.plugin.getGroupSubjects().getAllIdentifiers(), String.class); } @Override public boolean hasGroupSupport() { return true; } private <T> T getUnchecked(CompletableFuture<T> future) { try { return future.get(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } } CalculatedSubject getGroup(String name) { return getUnchecked(this.plugin.getGroupSubjects().get(Preconditions.checkNotNull(name, "name"))); } CalculatedSubject getSubject(OfflinePlayer player) { return getUnchecked(this.plugin.getUserSubjects().get(Preconditions.checkNotNull(player, "player").getUniqueId().toString())); } CalculatedSubject getSubject(String player) { return getUnchecked(this.plugin.getUserSubjects().get(Preconditions.checkNotNull(player, "player"))); } private Set<Map.Entry<String, String>> contextsFrom(@Nullable String world) { return world == null ? PermissionsEx.GLOBAL_CONTEXT : ImmutableSet.of(Maps.immutableEntry("world", world)); } @Override public boolean groupHas(String world, String name, String permission) { return getGroup(name).getPermission(contextsFrom(world), permission) > 0; } @Override public boolean groupAdd(final String world, String name, final String permission) { return !getGroup(name).data().update(input -> input.setPermission(contextsFrom(world), permission, 1)).isCancelled(); } @Override public boolean groupRemove(final String world, String name, final String permission) { return !getGroup(name).data().update(input -> input.setPermission(contextsFrom(world), permission, 0)).isCancelled(); } @Override public boolean playerHas(String world, OfflinePlayer player, String permission) { return getSubject(player).getPermission(contextsFrom(world), permission) > 0; } @Override public boolean playerAdd(final String world, OfflinePlayer player, final String permission) { return !getSubject(player).data().update(input -> input.setPermission(contextsFrom(world), permission, 1)).isCancelled(); } @Override public boolean playerAddTransient(OfflinePlayer player, String permission) { return playerAddTransient(null, player, permission); } @Override public boolean playerAddTransient(Player player, String permission) { return playerAddTransient(null, player, permission); } @Override public boolean playerAddTransient(final String worldName, OfflinePlayer player, final String permission) { return !getSubject(player).transientData().update(input -> input.setPermission(contextsFrom(worldName), permission, 1)).isCancelled(); } @Override public boolean playerRemoveTransient(final String worldName, OfflinePlayer player, final String permission) { return !getSubject(player).transientData().update(input -> input.setPermission(contextsFrom(worldName), permission, 0)).isCancelled(); } @Override public boolean playerRemove(final String world, OfflinePlayer player, final String permission) { return !getSubject(player).data().update(input -> input.setPermission(contextsFrom(world), permission, 0)).isCancelled(); } @Override public boolean playerRemoveTransient(Player player, String permission) { return playerRemoveTransient(null, player, permission); } @Override public boolean playerRemoveTransient(OfflinePlayer player, String permission) { return playerRemoveTransient(null, player, permission); } @Override public boolean playerInGroup(String world, OfflinePlayer player, String group) { return getSubject(player).getParents(contextsFrom(world)).contains(Maps.immutableEntry(SUBJECTS_GROUP, group)); } @Override public boolean playerAddGroup(final String world, OfflinePlayer player, final String group) { return !getSubject(player).data().update(input -> input.addParent(contextsFrom(world), SUBJECTS_GROUP, group)).isCancelled(); } @Override public boolean playerRemoveGroup(final String world, OfflinePlayer player, final String group) { return !getSubject(player).data().update(input -> input.removeParent(contextsFrom(world), SUBJECTS_GROUP, group)).isCancelled(); } @Override public String[] getPlayerGroups(String world, OfflinePlayer player) { return getSubject(player).getParents(contextsFrom(world)).stream() .filter(parent -> parent.getKey().equals(SUBJECTS_GROUP)) .map(Map.Entry::getValue) .toArray(String[]::new); } @Override public String getPrimaryGroup(String world, OfflinePlayer player) { String[] groups = getPlayerGroups(world, player); return groups.length > 0 ? groups[0] : null; } // -- Deprecated methods @SuppressWarnings("deprecation") private OfflinePlayer pFromName(String name) { return this.plugin.getServer().getOfflinePlayer(name); } @Override public boolean playerHas(String world, String name, String permission) { return playerHas(world, pFromName(name), permission); } @Override public boolean playerAdd(String world, String name, String permission) { return playerAdd(world, pFromName(name), permission); } @Override public boolean playerRemove(String world, String name, String permission) { return playerRemove(world, pFromName(name), permission); } @Override public boolean playerInGroup(String world, String player, String group) { return playerInGroup(world, pFromName(player), group); } @Override public boolean playerAddGroup(String world, String player, String group) { return playerAddGroup(world, pFromName(player), group); } @Override public boolean playerRemoveGroup(String world, String player, String group) { return playerRemoveGroup(world, pFromName(player), group); } @Override public String[] getPlayerGroups(String world, String player) { return getPlayerGroups(world, pFromName(player)); } @Override public String getPrimaryGroup(String world, String player) { return getPrimaryGroup(world, pFromName(player)); } @Override @Deprecated public boolean playerAddTransient(String worldName, String player, String permission) { return playerAddTransient(worldName, pFromName(player), permission); } @Override @Deprecated public boolean playerRemoveTransient(String worldName, String player, String permission) { return playerRemoveTransient(worldName, pFromName(player), permission); } }