package com.graywolf336.jail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; import org.bukkit.util.io.BukkitObjectInputStream; import org.bukkit.util.io.BukkitObjectOutputStream; import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; public class Util { private final static Pattern DURATION_PATTERN = Pattern.compile("^(\\d+)\\s*(m(?:inute)?s?|h(?:ours?)?|d(?:ays?)?|s(?:econd)?s?)?$", Pattern.CASE_INSENSITIVE); /** Checks if the first {@link Vector} is inside the other two. */ public static boolean isInsideAB(Vector point, Vector first, Vector second) { boolean x = isInside(point.getBlockX(), first.getBlockX(), second.getBlockX()); boolean y = isInside(point.getBlockY(), first.getBlockY(), second.getBlockY()); boolean z = isInside(point.getBlockZ(), first.getBlockZ(), second.getBlockZ()); return x && y && z; } /** * Checks if two numbers are inside a point, or something. *

* * @param loc The location. * @param first The first point * @param second The second point * @return True if they are inside, false if not. */ private static boolean isInside(int loc, int first, int second) { int point1 = 0; int point2 = 0; if (first < second) { point1 = first; point2 = second; } else { point2 = first; point1 = second; } return (point1 <= loc) && (loc <= point2); } /** Returns a colorful message from the color codes. */ public static String getColorfulMessage(String message) { return message.replaceAll("(?i)&([0-9abcdefklmnor])", "\u00A7$1"); } public static ItemStack getWand() { ItemStack wand = new ItemStack(Material.WOOD_SWORD); ItemMeta meta = wand.getItemMeta(); meta.setDisplayName(ChatColor.AQUA + "Jail Wand"); LinkedList lore = new LinkedList(); lore.add(ChatColor.BLUE + "The wand for creating"); lore.add(ChatColor.BLUE + "a jail or cell."); meta.setLore(lore); wand.setItemMeta(meta); return wand; } /** * Converts a string like '20minutes' into the appropriate amount of milliseconds. * * @param time The string to convert. * @return The time in milliseconds that is converted. * @throws Exception if there are no matches */ public static Long getTime(String time) throws Exception { Long t = 10L; Matcher match = DURATION_PATTERN.matcher(time); if (match.matches()) { String units = match.group(2); if ("seconds".equals(units) || "second".equals(units) || "s".equals(units)) t = TimeUnit.MILLISECONDS.convert(Long.valueOf(match.group(1)), TimeUnit.SECONDS); else if ("minutes".equals(units) || "minute".equals(units) || "mins".equals(units) || "min".equals(units) || "m".equals(units)) t = TimeUnit.MILLISECONDS.convert(Long.valueOf(match.group(1)), TimeUnit.MINUTES); else if ("hours".equals(units) || "hour".equals(units) || "h".equals(units)) t = TimeUnit.MILLISECONDS.convert(Long.valueOf(match.group(1)), TimeUnit.HOURS); else if ("days".equals(units) || "day".equals(units) || "d".equals(units)) t = TimeUnit.MILLISECONDS.convert(Long.valueOf(match.group(1)), TimeUnit.DAYS); else { try { t = TimeUnit.MILLISECONDS.convert(Long.parseLong(time), TimeUnit.MINUTES); }catch(NumberFormatException e) { throw new Exception("Invalid format."); } } }else { throw new Exception("Invalid format."); } return Long.valueOf(t); } /** * A method to serialize an inventory to Base64 string. * *

* * Special thanks to Comphenix in the Bukkit forums or also known * as aadnk on GitHub. * * Original Source * * @param inventory to serialize * @return Base64 string of the provided inventory * @throws IllegalStateException */ public static String toBase64(Inventory inventory) throws IllegalStateException { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); // Write the size of the inventory dataOutput.writeInt(inventory.getSize()); // Save every element in the list for (int i = 0; i < inventory.getSize(); i++) { dataOutput.writeObject(inventory.getItem(i)); } // Serialize that array dataOutput.close(); return Base64Coder.encodeLines(outputStream.toByteArray()); } catch (Exception e) { throw new IllegalStateException("Unable to save item stacks.", e); } } /** * * A method to get an {@link Inventory} from an encoded, Base64, string. * *

* * Special thanks to Comphenix in the Bukkit forums or also known * as aadnk on GitHub. * * Original Source * * @param data Base64 string of data containing an inventory. * @return Inventory created from the Base64 string. * @throws IOException */ public static Inventory fromBase64(String data) throws IOException { try { ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); Inventory inventory = Bukkit.getServer().createInventory(null, dataInput.readInt()); // Read the serialized inventory for (int i = 0; i < inventory.getSize(); i++) { inventory.setItem(i, (ItemStack) dataInput.readObject()); } dataInput.close(); return inventory; } catch (ClassNotFoundException e) { throw new IOException("Unable to decode class type.", e); } } }