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;
}
}