package org.maxgamer.quickshop.Util; import java.io.File; import java.io.InputStream; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.Shop.Shop; @SuppressWarnings("deprecation") public class MsgUtil { private static QuickShop plugin; private static YamlConfiguration messages; private static HashMap> player_messages = new HashMap>(); static { plugin = QuickShop.instance; } /** * Loads all the messages from messages.yml */ public static void loadCfgMessages() { // Load messages.yml File messageFile = new File(plugin.getDataFolder(), "messages.yml"); if (!messageFile.exists()) { plugin.getLogger().info("Creating messages.yml"); plugin.saveResource("messages.yml", true); } // Store it messages = YamlConfiguration.loadConfiguration(messageFile); messages.options().copyDefaults(true); // Load default messages InputStream defMessageStream = plugin.getResource("messages.yml"); YamlConfiguration defMessages = YamlConfiguration.loadConfiguration(defMessageStream); messages.setDefaults(defMessages); // Parse colour codes Util.parseColours(messages); } /** * loads all player purchase messages from the database. */ public static void loadTransactionMessages() { //TODO Converted to UUID player_messages.clear(); // Delete old messages try { ResultSet rs = plugin.getDB().getConnection().prepareStatement("SELECT * FROM messages").executeQuery(); while (rs.next()) { UUID owner = UUID.fromString(rs.getString("owner")); String message = rs.getString("message"); LinkedList msgs = player_messages.get(owner); if (msgs == null) { msgs = new LinkedList(); player_messages.put(owner, msgs); } msgs.add(message); } } catch (SQLException e) { e.printStackTrace(); System.out.println("Could not load transaction messages from database. Skipping."); } } /** * @param player * The name of the player to message * @param message * The message to send them Sends the given player a message if * they're online. Else, if they're not online, queues it for * them in the database. */ public static void send(UUID player, String message) { //TODO Converted to UUID OfflinePlayer p = Bukkit.getOfflinePlayer(player); if (p == null || !p.isOnline()) { LinkedList msgs = player_messages.get(player); if (msgs == null) { msgs = new LinkedList(); player_messages.put(player, msgs); } msgs.add(message); String q = "INSERT INTO messages (owner, message, time) VALUES (?, ?, ?)"; plugin.getDB().execute(q, player.toString(), message, System.currentTimeMillis()); } else { p.getPlayer().sendMessage(message); } } /** * Deletes any messages that are older than a week in the database, to save * on space. */ public static void clean() { System.out.println("Cleaning purchase messages from database that are over a week old..."); // 604800,000 msec = 1 week. long weekAgo = System.currentTimeMillis() - 604800000; plugin.getDB().execute("DELETE FROM messages WHERE time < ?", weekAgo); } /** * Empties the queue of messages a player has and sends them to the player. * * @param p * The player to message * @return true if success, false if the player is offline or null */ public static boolean flush(OfflinePlayer p) { //TODO Changed to UUID if (p != null && p.isOnline()) { UUID pName = p.getUniqueId(); LinkedList msgs = player_messages.get(pName); if (msgs != null) { for (String msg : msgs) { p.getPlayer().sendMessage(msg); } plugin.getDB().execute("DELETE FROM messages WHERE owner = ?", pName.toString()); msgs.clear(); } return true; } return false; } public static void sendShopInfo(Player p, Shop shop) { sendShopInfo(p, shop, shop.getRemainingStock()); } public static void sendShopInfo(Player p, Shop shop, int stock) { // Potentially faster with an array? ItemStack items = shop.getItem(); p.sendMessage(""); p.sendMessage(""); p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.shop-information")); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.owner", Bukkit.getOfflinePlayer(shop.getOwner()).getName())); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.item", shop.getDataName())); if (Util.isTool(items.getType())) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.damage-percent-remaining", Util.getToolPercentage(items))); } if (shop.isSelling()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.stock", "" + stock)); } else { int space = shop.getRemainingSpace(); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.space", "" + space)); } p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.price-per", shop.getDataName(), Util.format(shop.getPrice()))); if (shop.isBuying()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.this-shop-is-buying")); } else { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.this-shop-is-selling")); } Map enchs = items.getItemMeta().getEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+--------------------" + MsgUtil.getMessage("menu.enchants") + "-----------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } try { Class.forName("org.bukkit.inventory.meta.EnchantmentStorageMeta"); if (items.getItemMeta() instanceof EnchantmentStorageMeta) { EnchantmentStorageMeta stor = (EnchantmentStorageMeta) items.getItemMeta(); stor.getStoredEnchants(); enchs = stor.getStoredEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+-----------------" + MsgUtil.getMessage("menu.stored-enchants") + "--------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } } } catch (ClassNotFoundException e) { // They don't have an up to date enough build of CB to do this. // TODO: Remove this when it becomes redundant } p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); } public static void sendPurchaseSuccess(Player p, Shop shop, int amount) { p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.successful-purchase")); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.item-name-and-price", "" + amount, shop.getDataName(), Util.format((amount * shop.getPrice())))); Map enchs = shop.getItem().getItemMeta().getEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+--------------------" + MsgUtil.getMessage("menu.enchants") + "-----------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } enchs = shop.getItem().getItemMeta().getEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+-----------------" + MsgUtil.getMessage("menu.stored-enchants") + "--------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } try { Class.forName("org.bukkit.inventory.meta.EnchantmentStorageMeta"); if (shop.getItem().getItemMeta() instanceof EnchantmentStorageMeta) { EnchantmentStorageMeta stor = (EnchantmentStorageMeta) shop.getItem().getItemMeta(); stor.getStoredEnchants(); enchs = stor.getStoredEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+-----------------" + MsgUtil.getMessage("menu.stored-enchants") + "--------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } } } catch (ClassNotFoundException e) { // They don't have an up to date enough build of CB to do this. // TODO: Remove this when it becomes redundant } p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); } public static void sendSellSuccess(Player p, Shop shop, int amount) { p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.successfully-sold")); p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.item-name-and-price", "" + amount, shop.getDataName(), Util.format((amount * shop.getPrice())))); if (plugin.getConfig().getBoolean("show-tax")) { double tax = plugin.getConfig().getDouble("tax"); double total = amount * shop.getPrice(); if (tax != 0) { if (!p.getUniqueId().equals(shop.getOwner())) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.sell-tax", "" + Util.format((tax * total)))); } else { p.sendMessage(ChatColor.DARK_PURPLE + "| " + MsgUtil.getMessage("menu.sell-tax-self")); } } } Map enchs = shop.getItem().getItemMeta().getEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+--------------------" + MsgUtil.getMessage("menu.enchants") + "-----------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } try { Class.forName("org.bukkit.inventory.meta.EnchantmentStorageMeta"); if (shop.getItem().getItemMeta() instanceof EnchantmentStorageMeta) { EnchantmentStorageMeta stor = (EnchantmentStorageMeta) shop.getItem().getItemMeta(); stor.getStoredEnchants(); enchs = stor.getStoredEnchants(); if (enchs != null && !enchs.isEmpty()) { p.sendMessage(ChatColor.DARK_PURPLE + "+--------------------" + MsgUtil.getMessage("menu.stored-enchants") + "-----------------------+"); for (Entry entries : enchs.entrySet()) { p.sendMessage(ChatColor.DARK_PURPLE + "| " + ChatColor.YELLOW + entries.getKey().getName() + " " + entries.getValue()); } } } } catch (ClassNotFoundException e) { // They don't have an up to date enough build of CB to do this. // TODO: Remove this when it becomes redundant } p.sendMessage(ChatColor.DARK_PURPLE + "+---------------------------------------------------+"); } public static String getMessage(String loc, String... args) { String raw = messages.getString(loc); if (raw == null || raw.isEmpty()) { return "Invalid message: " + loc; } if (args == null) { return raw; } for (int i = 0; i < args.length; i++) { raw = raw.replace("{" + i + "}", args[i]); //TODO Nullpointer? } return raw; } }