content: package com.alecgorge.minecraft.permissions;
  
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  import java.util.logging.Logger;
  
  import net.milkbowl.vault.permission.Permission;
  
  import org.bukkit.OfflinePlayer;
  import org.bukkit.Server;
  import org.bukkit.entity.Player;
  import org.bukkit.permissions.PermissionAttachment;
  import org.bukkit.permissions.PermissionAttachmentInfo;
  import org.bukkit.plugin.RegisteredServiceProvider;
  import org.json.simpleForBukkit.JSONObject;
  
  import com.alecgorge.minecraft.jsonapi.JSONAPI;
  
  public class PermissionWrapper {
  	Server server;
  	boolean active = false;
  
  	Permission perms;
  
  	public PermissionWrapper(Server s) {
  		if (s.getPluginManager().getPlugin("Vault") == null) {
  			Logger.getLogger("Minecraft").info("[JSONAPI] You don't have Vault installed, you cannot use permission methods!");
  		} else {
  			active = true;
  			server = s;
  			RegisteredServiceProvider<Permission> rsp = (RegisteredServiceProvider<Permission>)server.getServicesManager().getRegistration(Permission.class);
  			perms = rsp.getProvider();
  		}
  	}
  
  	private Player getPlayerExact(String playerName) {
  		Player player = server.getPlayerExact(playerName);
  		if (player == null) {
  			player = JSONAPI.loadOfflinePlayer(playerName);
  		}
  
  		return player;
  	}
  
  	public List<String> getGroups(String playerName) {
  		if (active) {
  			try {
  				return Arrays.asList(perms.getPlayerGroups(getPlayerExact(playerName)));
  			} catch (Exception e) {
  				return new ArrayList<String>();
  			}
  		}
  
  		return new ArrayList<String>();
  	}
  	
  	public List<String> getPlayersInGroup(String group) {
  		List<String> players = new ArrayList<String>();
  		if(active) {
  			for (Player p : server.getOnlinePlayers()) {
  				if(Arrays.asList(perms.getPlayerGroups(p)).indexOf(group) > -1) {
  					players.add(p.getName());
  				}
  			}
  			for (OfflinePlayer p : server.getOfflinePlayers()) {
  				Player pp = JSONAPI.loadOfflinePlayer(p.getName());
  				if(Arrays.asList(perms.getPlayerGroups(pp)).indexOf(group) > -1) {
  					players.add(pp.getName());
  				}
  			}
  		}
  		return players;
  	}
  
  	public List<String> getAllGroups() {
  		if (active) {
  			return Arrays.asList(perms.getGroups());
  		}
  
  		return new ArrayList<String>();
  	}
  
  	public boolean addGroup(String player, String group) {
  		Player p = getPlayerExact(player);
  		boolean r = active ? perms.playerAddGroup(p, group) : false;
  		p.saveData();
  		return r;
  	}
  
  	public boolean removeGroup(String player, String group) {
  		Player p = getPlayerExact(player);
  		boolean r = active ? perms.playerRemoveGroup(p, group) : false;
  		p.saveData();
  		return r;
  	}
  
  	public boolean addPermission(String playername, String key, Boolean value) {
  		try {
  			Player p = getPlayerExact(playername);
  			p.addAttachment(JSONAPI.instance, key, value);
  			p.saveData();
  			return true;
  		} catch (Exception e) {
  			return false;
  		}
  	}
  
  	public boolean removePermission(String playername, String key) {
  		try {
  			Player player = server.getPlayerExact(playername);
  			Set<PermissionAttachmentInfo> eps = player.getEffectivePermissions();
  
  			PermissionAttachment a = null;
  			for (PermissionAttachmentInfo o : eps) {
  				if (o.getPermission().equals(key)) {
  					a = o.getAttachment();
  					break;
  				}
  			}
  			if (a != null) {
  				player.removeAttachment(a);
  				player.recalculatePermissions();
  			}
  
  			player.saveData();
  
  			return true;
  		} catch (Exception e) {
  			return false;
  		}
  	}
  
  	public List<JSONObject> getPermissions(String playername) {
  		List<JSONObject> perms = new ArrayList<JSONObject>();
  		try {
  			Player player = server.getPlayerExact(playername);
  			Set<PermissionAttachmentInfo> eps = player.getEffectivePermissions();
  
  			for (PermissionAttachmentInfo o : eps) {
  				JSONObject oo = new JSONObject();
  
  				oo.put("key", o.getPermission());
  				oo.put("value", o.getValue());
  
  				perms.add(oo);
  			}
  
  			return perms;
  		} catch (Exception e) {
  			if(JSONAPI.shouldDebug) e.printStackTrace();
  			return perms;
  		}
  	}
  
  	public Map<String, List<JSONObject>> getAllPermissions() {
  		Map<String, List<JSONObject>> l = new HashMap<String, List<JSONObject>>();
  		try {
  			for (Player p : server.getOnlinePlayers()) {
  				l.put(p.getName(), getPermissions(p.getName()));
  			}
  		} catch (Exception e) {
  		}
  		return l;
  	}
  }
  