package net.sacredlabyrinth.phaed.simpleclans.managers;
import in.mDev.MiracleM4n.mChatSuite.api.API;
import in.mDev.MiracleM4n.mChatSuite.mChatSuite;
import net.milkbowl.vault.chat.Chat;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.permission.Permission;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import java.util.HashMap;
import java.util.List;
/**
* @author phaed
*/
public final class PermissionsManager
{
/**
*
*/
private SimpleClans plugin;
public static Permission permission = null;
public static Economy economy = null;
public static Chat chat = null;
private mChatSuite mchat = null;
private HashMap<String, List<String>> permissions = new HashMap<String, List<String>>();
private HashMap<Player, PermissionAttachment> permAttaches = new HashMap<Player, PermissionAttachment>();
/**
*
*/
public PermissionsManager()
{
plugin = SimpleClans.getInstance();
detectMChat();
try
{
Class.forName("net.milkbowl.vault.permission.Permission");
setupChat();
setupEconomy();
setupPermissions();
}
catch (ClassNotFoundException e)
{
//SimpleClans.log("[PreciousStones] Vault.jar not found. No economy support.");
//no need to spam everyone who doesnt use vault
}
}
public mChatSuite getMChat()
{
return mchat;
}
/**
* Whether exonomy plugin exists and is enabled
*
* @return
*/
public boolean hasEconomy()
{
if (economy != null && economy.isEnabled())
{
return true;
}
return false;
}
/**
* Loads the permissions for each clan from the config
*
*/
public void loadPermissions() {
SimpleClans.getInstance().getSettingsManager().load();
permissions.clear();
for (Clan clan : plugin.getClanManager().getClans()) {
permissions.put(clan.getTag(), SimpleClans.getInstance().getConfig().getStringList("permissions." + clan.getTag()));
}
}
/**
* Saves the permissions for earch clan from the config
*
*/
public void savePermissions() {
for (Clan clan : plugin.getClanManager().getClans()) {
if (permissions.containsKey(clan.getTag())) {
SimpleClans.getInstance().getSettingsManager().getConfig().set("permissions." + clan.getTag(), getPermissions(clan));
}
}
SimpleClans.getInstance().getSettingsManager().save();
}
/**
* Adds all pemrissions for a clan
* @param clan
*/
public void updateClanPermissions(Clan clan) {
for (ClanPlayer cp : clan.getMembers()) {
addPlayerPermissions(cp);
}
}
/**
* Adds permissions for a player
* @param cp
*/
public void addPlayerPermissions(ClanPlayer cp) {
if (cp != null && cp.toPlayer() != null) {
Player player = cp.toPlayer();
if (permissions.containsKey(cp.getClan().getTag())) {
if (!permAttaches.containsKey(cp.toPlayer())) {
permAttaches.put(cp.toPlayer(), cp.toPlayer().addAttachment(SimpleClans.getInstance()));
}
//Adds all permisisons from his clan
for (String perm : getPermissions(cp.getClan())) {
permAttaches.get(cp.toPlayer()).setPermission(perm, true);
}
if (plugin.getSettingsManager().isAutoGroupGroupName()) {
permAttaches.get(cp.toPlayer()).setPermission("group." + cp.getClan().getTag(), true);
}
player.recalculatePermissions();
}
}
}
/**
* Removes permissions for a clan (when it gets disbanded for example)
* @param clan
*/
public void removeClanPermissions(Clan clan) {
for (ClanPlayer cp : clan.getMembers()) {
removeClanPlayerPermissions(cp);
}
}
/**
* Removes permissions for a player (when he gets kicked for example)
* @param cp
*/
public void removeClanPlayerPermissions(ClanPlayer cp) {
if (cp != null) {
if (cp.getClan() != null) {
if (cp.toPlayer() != null){
Player player = cp.toPlayer();
if (player.isOnline()) {
if (permissions.containsKey(cp.getClan().getTag())) {
if(permAttaches.containsKey(player)) {
permAttaches.get(player).remove();
permAttaches.remove(player);
}
}
}
}
}
}
}
/**
* @return the permissions for a clan
* @param clan
*/
public List<String> getPermissions(Clan clan) {
return permissions.get(clan.getTag());
}
/**
* @return the PermissionsAttachments for every player
*/
public HashMap<Player, PermissionAttachment> getPermAttaches() {
return permAttaches;
}
/**
* Charge a player some money
*
* @param player
* @param money
* @return
*/
public boolean playerChargeMoney(Player player, double money)
{
return economy.withdrawPlayer(player.getName(), money).transactionSuccess();
}
/**
* Grants a player some money
*
* @param player
* @param money
* @return
*/
public boolean playerGrantMoney(Player player, double money)
{
return economy.depositPlayer(player.getName(), money).transactionSuccess();
}
/**
* Grants a player some money
*
* @param player
* @param money
* @return
*/
public boolean playerGrantMoney(String player, double money)
{
return economy.depositPlayer(player, money).transactionSuccess();
}
/**
* Check if a user has the money
*
* @param player
* @param money
* @return whether he has the money
*/
public boolean playerHasMoney(Player player, double money)
{
return economy.has(player.getName(), money);
}
/**
* Returns the players money
*
* @param player
* @return the players money
*/
public double playerGetMoney(Player player)
{
return economy.getBalance(player.getName());
}
/**
* Check if a player has permissions
*
* @param player the player
* @param perm the permission
* @return whether he has the permission
*/
public boolean has(Player player, String perm)
{
if (player == null)
{
return false;
}
if (permission != null)
{
return permission.has(player, perm);
}
else
{
return player.hasPermission(perm);
}
}
/**
* Sets the mChat clan tag
*
* @param player
* @param value
*/
public void addSetMChatClanTag(Player player, String value)
{
if(mchat != null)
{
API api = mchat.getAPI();
api.addPlayerVar(player.getName(), "clan", value);
}
}
/**
* Clears the mChat clan tag
*
* @param player
*/
public void clearSetMChatClanTag(Player player)
{
if(mchat != null)
{
API api = mchat.getAPI();
api.addPlayerVar(player.getName(), "clan", "");
}
}
/**
* Gives the player permissions linked to a clan
*
* @param cp
*/
public void addClanPermissions(ClanPlayer cp)
{
if (!plugin.getSettingsManager().isEnableAutoGroups())
{
return;
}
if (permission != null)
{
if (cp != null && cp.toPlayer() != null)
{
if (cp.getClan() != null)
{
if (!permission.playerInGroup(cp.toPlayer(), "Clan" + cp.getTag()))
{
permission.playerAddGroup(cp.toPlayer(), "Clan" + cp.getTag());
}
if (cp.isLeader())
{
if (!permission.playerInGroup(cp.toPlayer(), "SCLeader"))
{
permission.playerAddGroup(cp.toPlayer(), "SCLeader");
}
permission.playerRemoveGroup(cp.toPlayer(), "SCUntrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCTrusted");
return;
}
if (cp.isTrusted())
{
if (!permission.playerInGroup(cp.toPlayer(), "SCTrusted"))
{
permission.playerAddGroup(cp.toPlayer(), "SCTrusted");
}
permission.playerRemoveGroup(cp.toPlayer(), "SCUntrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCLeader");
return;
}
if (!cp.isTrusted() && !cp.isLeader())
{
if (!permission.playerInGroup(cp.toPlayer(), "SCUntrusted"))
{
permission.playerAddGroup(cp.toPlayer(), "SCUntrusted");
}
permission.playerRemoveGroup(cp.toPlayer(), "SCTrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCLeader");
}
}
else
{
permission.playerRemoveGroup(cp.toPlayer(), "SCUntrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCTrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCLeader");
}
}
}
}
/**
* Removes permissions linked to a clan from the player
*
* @param cp
*/
public void removeClanPermissions(ClanPlayer cp)
{
if (!plugin.getSettingsManager().isEnableAutoGroups())
{
return;
}
if (permission != null)
{
if (cp.toPlayer() != null)
{
permission.playerRemoveGroup(cp.toPlayer(), "Clan" + cp.getTag());
permission.playerRemoveGroup(cp.toPlayer(), "SCUntrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCTrusted");
permission.playerRemoveGroup(cp.toPlayer(), "SCLeader");
}
}
}
private void detectMChat()
{
Plugin test = plugin.getServer().getPluginManager().getPlugin("mChatSuite");
if (test != null)
{
mchat = (mChatSuite) test;
}
}
private Boolean setupPermissions()
{
RegisteredServiceProvider<Permission> permissionProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class);
if (permissionProvider != null)
{
permission = permissionProvider.getProvider();
}
return (permission != null);
}
private Boolean setupChat()
{
RegisteredServiceProvider<Chat> chatProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.chat.Chat.class);
if (chatProvider != null)
{
chat = chatProvider.getProvider();
}
return (chat != null);
}
private Boolean setupEconomy()
{
RegisteredServiceProvider<Economy> economyProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
if (economyProvider != null)
{
economy = economyProvider.getProvider();
}
return (economy != null);
}
/**
* @param p
* @return
*/
@SuppressWarnings({"deprecation", "deprecation"})
public String getPrefix(Player p)
{
String out = "";
try
{
if (chat != null)
{
out = chat.getPlayerPrefix(p);
}
}
catch (Exception ex)
{
// yea vault kinda sucks like that
}
if (permission != null && chat != null)
{
try
{
String world = p.getWorld().getName();
String name = p.getName();
String prefix = chat.getPlayerPrefix(name, world);
if (prefix == null || prefix.isEmpty())
{
String group = permission.getPrimaryGroup(world, name);
prefix = chat.getGroupPrefix(world, group);
if (prefix == null)
{
prefix = "";
}
}
out = prefix.replace("&", "\u00a7").replace(String.valueOf((char) 194), "");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
// add in colorMe color
/*
Plugin colorMe = plugin.getServer().getPluginManager().getPlugin("ColorMe");
if (colorMe != null)
{
out += ((ColorMe) colorMe).getColor(p.getName());
}
*/
return out;
}
/**
* @param p
* @return
*/
@SuppressWarnings({"deprecation", "deprecation"})
public String getSuffix(Player p)
{
try
{
if (chat != null)
{
return chat.getPlayerSuffix(p);
}
}
catch (Exception ex)
{
// yea vault kinda sucks like that
}
if (permission != null && chat != null)
{
try
{
String world = p.getWorld().getName();
String name = p.getName();
String suffix = chat.getPlayerSuffix(world, name);
if (suffix == null || suffix.isEmpty())
{
String group = permission.getPrimaryGroup(world, name);
suffix = chat.getPlayerSuffix(world, group);
if (suffix == null)
{
suffix = "";
}
}
return suffix.replace("&", "\u00a7").replace(String.valueOf((char) 194), "");
}
catch (Exception e)
{
System.out.println(e.getMessage());
return "";
}
}
return "";
}
}