/******************************************************************************* * Copyright 2014 Tobias Welther * * 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 de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.permissionsettings; import java.util.Map; import java.util.Set; import net.milkbowl.vault.permission.Permission; import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.Group; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractTraitHolder; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.util.player.PlayerUtils; public class PermissionRegisterer implements Runnable{ /** * The lists of traitHolders */ private final Set<AbstractTraitHolder> traitHolderList; /** * The Member config to set the Permissions to */ private final Map<RaCPlayer, AbstractTraitHolder> memberList; /** * The prefix of the Permissions */ private final String typeName; /** * The Vault Permission Object */ private Permission vaultPermissions; /** * The Prefix for specific PermissionSystems */ private static String permissionSpecificPrefix = ""; public PermissionRegisterer(Set<AbstractTraitHolder> traitHolderList, Map<RaCPlayer, AbstractTraitHolder> memberList, String typeName){ this.traitHolderList = traitHolderList; this.memberList = memberList; this.typeName = typeName; } @Override public void run() { if(!isVaultActive()) return; vaultPermissions = checkVault(); if(traitHolderList == null || traitHolderList.size() <= 0) return; if(vaultPermissions == null) return; if(!vaultPermissions.hasGroupSupport()) return; checkForSpecificPrefix(); removeAllGroupsWithPrefix(); registerTraitHolders(); giveMembersAccessToGroups(); } /** * Checks if a Permission Plugins needs specific prefixes. */ private void checkForSpecificPrefix() { if("GroupManager".equals(vaultPermissions.getName())){ permissionSpecificPrefix = "g:"; } } /** * Removes all old groups */ private void removeAllGroupsWithPrefix(){ String[] groupNames = vaultPermissions.getGroups(); for(String groupName : groupNames){ if(groupName.toLowerCase().startsWith(this.typeName.toLowerCase() + "-")){ //remove all players from Group. //This is VERY inefficient! for(OfflinePlayer offlinePlayer : Bukkit.getOfflinePlayers()){ vaultPermissions.playerRemoveGroup((String)null, offlinePlayer, permissionSpecificPrefix + groupName); } //remove the group from the list TODO //vaultPermissions.groupRemove((World)null, groupName, "*"); } } } /** * Registers the TraitHolders as Group when supported */ private void registerTraitHolders() { if(traitHolderList == null || traitHolderList.isEmpty()) return; for(AbstractTraitHolder holder : traitHolderList){ HolderPermissions permissions = holder.getPermissions(); if(permissions == null || permissions.getPermissions().size() ==0){ continue; } String groupName = permissions.getGroupIdentificationName(); precreateGroupIfNotExist(groupName); for(String permission : permissions.getPermissions()){ if(!vaultPermissions.groupAdd((String)null, permissionSpecificPrefix + groupName, permission)){ RacesAndClasses.getPlugin().getDebugLogger().logWarning("Could NOT Register Group: " + permissionSpecificPrefix + groupName + " Permission: " + permission + ". Used: " + vaultPermissions.getName()); }; } } } /** * Pre creates the Group if necessary. * This is Permission Plugin specific. * * * @param groupName */ private void precreateGroupIfNotExist(String groupName) { //create for GroupManager if("GroupManager".equals(vaultPermissions.getName())){ if(!GroupManager.getGlobalGroups().hasGroup(permissionSpecificPrefix + groupName)){ Group newGroup = new Group(permissionSpecificPrefix + groupName); GroupManager.getGlobalGroups().newGroup(newGroup); } } } /** * Adds the people to the corresponding groups */ @SuppressWarnings("deprecation") private void giveMembersAccessToGroups() { if(memberList == null || memberList.isEmpty()) return; for(RaCPlayer member : memberList.keySet()){ AbstractTraitHolder holder = memberList.get(member); if(holder == null) continue; String groupName = holder.getPermissions().getGroupIdentificationName(); String name = member.getName(); if(name == null) continue; String[] groups = vaultPermissions.getPlayerGroups((String)null, name); if(groups == null || groups.length == 0) continue; for(String group : groups){ if(group.startsWith(permissionSpecificPrefix + typeName)){ vaultPermissions.playerRemoveGroup((String) null, name, permissionSpecificPrefix + group); RacesAndClasses.getPlugin().getPermissionManager() .removeSubgroup(PlayerUtils.getOfflinePlayer(name), permissionSpecificPrefix + group); } } RacesAndClasses.getPlugin().getPermissionManager() .addSubgroup(PlayerUtils.getOfflinePlayer(name), permissionSpecificPrefix + groupName); } } /** * Checks if Vault is active. * Also Checks for Group support. * * @return */ private static boolean isVaultActive(){ try{ boolean isPresent = RacesAndClasses.getPlugin().getServer().getPluginManager().isPluginEnabled("Vault"); if(!isPresent) return false; RegisteredServiceProvider<Permission> rsp = RacesAndClasses.getPlugin().getServer() .getServicesManager().getRegistration(Permission.class); Permission perms = rsp.getProvider(); return perms.hasGroupSupport(); }catch(NoSuchMethodError exp){ return false; }catch(Exception exp){ return false; } } /** * Gets the service for Vault * * WARNING: Returns null if the Groups are not supported!!! */ private static Permission checkVault(){ try{ if(!isVaultActive()) return null; RegisteredServiceProvider<Permission> rsp = Bukkit.getServer().getServicesManager().getRegistration(Permission.class); Permission perms = rsp.getProvider(); return perms.hasGroupSupport() ? perms : null; }catch(NoSuchMethodError exp){ return null; }catch(Exception exp){ return null; } } /** * removes an Player from all groups with the passed prefix. * This only works if Vault is active. */ public static void removePlayer(RaCPlayer racPlayer, String prefix) { if(!isVaultActive()) return; Player player = racPlayer.getPlayer(); Permission vaultPermissions = checkVault(); if(vaultPermissions != null){ String[] groupNames = vaultPermissions.getPlayerGroups(player); if(groupNames == null) return; //nothing to do for(String groupName : groupNames){ if(groupName.startsWith(permissionSpecificPrefix + prefix + "-")){ vaultPermissions.playerRemoveGroup(player, permissionSpecificPrefix + groupName); } } } } /** * removes an Player from the group. * This only works if Vault is active. */ public static void addPlayer(RaCPlayer player, String groupName) { RacesAndClasses.getPlugin().getPermissionManager() .addSubgroup(PlayerUtils.getOfflinePlayer(player.getName()), permissionSpecificPrefix + groupName); } }