package me.asofold.bpl.simplyvanish.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import me.asofold.bpl.simplyvanish.SimplyVanish;
import me.asofold.bpl.simplyvanish.config.compatlayer.CompatConfig;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.Configuration;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
/**
* Some static methods for more generic purpose.
* @author mc_dev
*
*/
public class Utils {
/**
* Check, message on failure.
* @param sender
* @param perm
* @return
*/
public static boolean checkPerm(CommandSender sender, String perm){
if ( !SimplyVanish.hasPermission(sender, perm)){
noPerm(sender);
return false;
}
return true;
}
/**
* Intended as direct return value for onCommand.
* @param sender
* @return
*/
public static boolean noPerm(CommandSender sender) {
sender.sendMessage(ChatColor.DARK_RED+"[SimplyVanish] No permission.");
return true;
}
/**
* Check if is a player, message if not.
* @param sender
* @return
*/
public static boolean checkPlayer(CommandSender sender){
if ( sender instanceof Player) return true;
sender.sendMessage("[SimplyVanish] This is only available for players!");
return false;
}
public static boolean forceDefaults(Configuration defaults, CompatConfig config){
Map<String ,Object> all = defaults.getValues(true);
boolean changed = false;
for ( String path : all.keySet()){
if ( !config.hasEntry(path)){
config.setProperty(path, defaults.get(path));
changed = true;
}
}
return changed;
}
/**
* Compatibility method.
* @param input
* @return
*/
public static String withChatColors(String input) {
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length - 1; i++) {
if ((chars[i] == '&' || chars[i]=='�') && ("0123456789AaBbCcDdEeFfKkLlMmNnOoRr".indexOf(chars[i+1]) >= 0)) {
chars[i] = ChatColor.COLOR_CHAR;
chars[i+1] = Character.toLowerCase(chars[i+1]);
}
}
return new String(chars);
}
public static final boolean checkOnline(final Player player){
return checkOnline( player.getName());
}
public static final boolean checkOnline(final String name){
final Player player = Bukkit.getServer().getPlayerExact(name);
return player != null;
}
/**
* Check and log warning message.
* @param player
* @param tag
* @return
*/
public static final boolean checkOnline(final Player player, final String tag){
final boolean res = checkOnline(player);
if ( !res) warn("["+tag+"] Inconsistent online state (flag="+player.isOnline()+") Server returns null for: "+player.getName());
return res;
}
public static final void warn(final String msg){
Bukkit.getServer().getLogger().warning("[SimplyVanish] "+msg);
}
public static final void severe(final String msg){
Bukkit.getServer().getLogger().severe("[SimplyVanish] "+msg);
}
public static final void severe(final String msg, final Throwable t){
severe(msg);
severe(t);
}
public final static void severe(final Throwable t) {
severe(toString(t));
}
public static final void warn(final String msg, final Throwable t){
warn(msg);
warn(t);
}
public final static void warn(final Throwable t) {
warn(toString(t));
}
public static final String toString(final Throwable t) {
final Writer buf = new StringWriter(500);
final PrintWriter writer = new PrintWriter(buf);
t.printStackTrace(writer);
// TODO: maybe make lines and log one by one.
return buf.toString();
}
public static void sendToTargets(String msg,
String targetSpec) {
// check targets:
List<Player> players = new LinkedList<Player>();
Player[] online = Bukkit.getServer().getOnlinePlayers();
for ( String x : targetSpec.split(",")){
String targets = x.trim();
if ( targets.equalsIgnoreCase("ops") || targets.equalsIgnoreCase("operators")){
for (Player player : online){
if (player.isOp()) players.add(player);
}
}
else if (targets.equalsIgnoreCase("all") || targets.equalsIgnoreCase("everyone") || (targets.equalsIgnoreCase("everybody"))){
for (Player player : online){
players.add(player);
}
}
else if (targets.toLowerCase().startsWith("permission:") && targets.length()>11){
String perm = targets.substring(11).trim();
for (Player player : online){
if (SimplyVanish.hasPermission(player, perm)) players.add(player);
}
}
}
for ( Player player : players){
player.sendMessage(msg);
}
}
public static void dropItemInHand(Player player) {
ItemStack stack = player.getItemInHand();
if ( stack == null) return;
if(stack.getType() == Material.AIR) return;
ItemStack newStack = stack.clone();
Item item = player.getWorld().dropItem(player.getLocation().add(new Vector(0.0, 1.0, 0.0)), newStack);
if ( item != null && !item.isDead()){
item.setVelocity(player.getLocation().getDirection().normalize().multiply(0.05));
player.setItemInHand(null);
}
}
public static void send(CommandSender sender, String message) {
if (sender instanceof Player) sender.sendMessage(message);
else sender.sendMessage(ChatColor.stripColor(message));
}
/**
*
* @param parts
* @param link can be null
* @return
*/
public static final String join(Collection<String> parts, String link){
StringBuilder builder = new StringBuilder();
int i = 0;
int max = parts.size();
for ( String part : parts){
builder.append(part);
i++;
if ( i<max && link!=null ) builder.append(link);
}
return builder.toString();
}
public static final void sendBlock(final Player player, final Block block) {
if (block == null) return;
player.sendBlockChange(block.getLocation(), block.getType(), block.getData());
}
public static void tryMessage(String name, String msg) {
Player player = Bukkit.getPlayerExact(name);
if (player == null) return;
else player.sendMessage(msg);
}
/**
* Get an entity if the shooter is an entity, otherwise return null.
* @param projectile
* @return
*/
public static Entity getShooterEntity(Projectile projectile) {
return getEntity(projectile, "getShooter");
}
/**
* Get an entity by reflection from a method without arguments (fail-safe).
* @param projectile
* @return
*/
public static Entity getEntity(Object object, String methodName) {
Object entity = null;
try {
entity = object.getClass().getMethod("getShooter").invoke(object);
} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) {
}
if (entity instanceof Entity) {
return (Entity) entity;
} else {
return null;
}
}
}