diff --git a/pom.xml b/pom.xml
index 44c792c..3f4aa9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
tsp.headdb
HeadDB
- 2.4.1
+ 2.4.2
jar
HeadDB
diff --git a/src/main/java/tsp/headdb/api/Head.java b/src/main/java/tsp/headdb/api/Head.java
index 12d4ac5..13a188f 100644
--- a/src/main/java/tsp/headdb/api/Head.java
+++ b/src/main/java/tsp/headdb/api/Head.java
@@ -46,10 +46,11 @@ public class Head {
profileField = meta.getClass().getDeclaredField("profile");
profileField.setAccessible(true);
profileField.set(meta, profile);
- } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) {
+ } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException ex) {
Log.error("Could not set skull owner for " + uuid.toString() + " | Stack Trace:");
- e1.printStackTrace();
+ ex.printStackTrace();
}
+
meta.setLore(Arrays.asList(
Utils.colorize("&cID: " + id),
Utils.colorize("&e" + buildTagLore(tags)),
diff --git a/src/main/java/tsp/headdb/api/LocalHead.java b/src/main/java/tsp/headdb/api/LocalHead.java
index 2b0928e..111a7be 100644
--- a/src/main/java/tsp/headdb/api/LocalHead.java
+++ b/src/main/java/tsp/headdb/api/LocalHead.java
@@ -21,6 +21,7 @@ public class LocalHead extends Head {
this.uuid = uuid;
}
+ @Override
public ItemStack getItemStack() {
Validate.notNull(uuid, "uuid must not be null!");
@@ -36,10 +37,12 @@ public class LocalHead extends Head {
return item;
}
+ @Override
public UUID getUniqueId() {
return uuid;
}
+ @Override
public String getName() {
return name;
}
@@ -64,11 +67,13 @@ public class LocalHead extends Head {
return null;
}
+ @Override
public LocalHead withUniqueId(UUID uuid) {
this.uuid = uuid;
return this;
}
+ @Override
public LocalHead withName(String name) {
this.name = name;
return this;
diff --git a/src/main/java/tsp/headdb/command/Command_headdb.java b/src/main/java/tsp/headdb/command/Command_headdb.java
index 90c266f..5246b31 100644
--- a/src/main/java/tsp/headdb/command/Command_headdb.java
+++ b/src/main/java/tsp/headdb/command/Command_headdb.java
@@ -9,9 +9,10 @@ import org.bukkit.inventory.ItemStack;
import tsp.headdb.HeadDB;
import tsp.headdb.api.Head;
import tsp.headdb.api.HeadAPI;
-import tsp.headdb.inventory.InventoryUtils;
import tsp.headdb.util.Utils;
+import java.util.concurrent.TimeUnit;
+
public class Command_headdb implements CommandExecutor {
@Override
@@ -127,6 +128,33 @@ public class Command_headdb implements CommandExecutor {
}
}
+ if (sub.equalsIgnoreCase("update") || sub.equalsIgnoreCase("u")) {
+ if (!sender.hasPermission("headdb.update")) {
+ Utils.sendMessage(sender, "&cNo permission!");
+ return true;
+ }
+
+ Utils.sendMessage(sender, "Updating...");
+ long start = System.currentTimeMillis();
+ boolean result = HeadAPI.getDatabase().update();
+ if (result) {
+ Utils.sendMessage(sender, "&aDone! Took: " + TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start) + " seconds");
+ } else {
+ Utils.sendMessage(sender, "&cFailed! Check console for errors.");
+ }
+ return true;
+ }
+
+ if (sub.equalsIgnoreCase("updateasync") || sub.equalsIgnoreCase("ua")) {
+ if (!sender.hasPermission("headdb.update")) {
+ Utils.sendMessage(sender, "&cNo permission!");
+ return true;
+ }
+
+ Utils.sendMessage(sender, "Updating...");
+ Bukkit.getScheduler().runTaskAsynchronously(HeadDB.getInstance(), () -> HeadAPI.getDatabase().update());
+ }
+
Utils.sendMessage(sender, " ");
Utils.sendMessage(sender, "&c&lHeadDB &c- &5Commands");
Utils.sendMessage(sender, "&7&oParameters:&c command &9(aliases)&c arguments... &7- Description");
@@ -134,6 +162,8 @@ public class Command_headdb implements CommandExecutor {
Utils.sendMessage(sender, " > &c/hdb info &9(i) &7- Plugin Information");
Utils.sendMessage(sender, " > &c/hdb search &9(s) &c &7- Search for heads matching a name");
Utils.sendMessage(sender, " > &c/hdb tagsearch &9(ts) &c &7- Search for heads matching a tag");
+ Utils.sendMessage(sender, " > &c/hdb update &9(u) &7- Forcefully update the database");
+ Utils.sendMessage(sender, " > &c/hdb updateasync &9(ua) &7- Forcefully update the database ASYNCHRONOUSLY");
Utils.sendMessage(sender, " > &c/hdb give &9(g) &c &6[amount] &7- Give player a head");
Utils.sendMessage(sender, " ");
return true;
diff --git a/src/main/java/tsp/headdb/database/Category.java b/src/main/java/tsp/headdb/database/Category.java
index 344df19..6214ad2 100644
--- a/src/main/java/tsp/headdb/database/Category.java
+++ b/src/main/java/tsp/headdb/database/Category.java
@@ -5,12 +5,11 @@ import org.bukkit.inventory.ItemStack;
import tsp.headdb.api.Head;
import tsp.headdb.api.HeadAPI;
-import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
public enum Category {
+
ALPHABET("alphabet", ChatColor.YELLOW, 20),
ANIMALS("animals", ChatColor.DARK_AQUA, 21),
BLOCKS("blocks", ChatColor.DARK_GRAY, 22),
@@ -26,6 +25,7 @@ public enum Category {
private final ChatColor color;
private final int location;
private final Map item = new HashMap<>();
+ private static final Category[] values = values();
Category(String name, ChatColor color, int location) {
this.name = name;
@@ -55,8 +55,8 @@ public enum Category {
}
public static Category getByName(String name) {
- for (Category category : Category.values()) {
- if (category.getName().equals(name)) {
+ for (Category category : values) {
+ if (category.getName().equalsIgnoreCase(name)) {
return category;
}
}
@@ -64,8 +64,8 @@ public enum Category {
return null;
}
- public static List getCategories() {
- return Arrays.asList(Category.values());
+ public static Category[] getValues() {
+ return values;
}
}
diff --git a/src/main/java/tsp/headdb/database/HeadDatabase.java b/src/main/java/tsp/headdb/database/HeadDatabase.java
index e37dadd..25e42a9 100644
--- a/src/main/java/tsp/headdb/database/HeadDatabase.java
+++ b/src/main/java/tsp/headdb/database/HeadDatabase.java
@@ -8,14 +8,18 @@ import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import tsp.headdb.api.Head;
import tsp.headdb.util.Log;
-import tsp.headdb.util.Utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
@@ -139,7 +143,7 @@ public class HeadDatabase {
@Nullable
public Map> getHeadsNoCache() {
Map> result = new HashMap<>();
- List categories = Category.getCategories();
+ Category[] categories = Category.getValues();
int id = 1;
for (Category category : categories) {
@@ -162,12 +166,14 @@ public class HeadDatabase {
JSONArray array = (JSONArray) parser.parse(response.toString());
for (Object o : array) {
JSONObject obj = (JSONObject) o;
- String uuid = obj.get("uuid").toString();
- Log.debug(!Utils.isValid(uuid) + "Invalid UUID: " + uuid);
+ UUID uuid = UUID.fromString(obj.get("uuid").toString());
+ if (uuid.toString().length() != 36) {
+ uuid = UUID.randomUUID();
+ }
Head head = new Head(id)
.withName(obj.get("name").toString())
- .withUniqueId(Utils.isValid(uuid) ? UUID.fromString(uuid) : UUID.randomUUID())
+ .withUniqueId(uuid)
.withValue(obj.get("value").toString())
.withTags(obj.get("tags") != null ? obj.get("tags").toString() : "None")
.withCategory(category);
@@ -204,9 +210,7 @@ public class HeadDatabase {
}
HEADS.clear();
- for (Map.Entry> entry : heads.entrySet()) {
- HEADS.put(entry.getKey(), entry.getValue());
- }
+ HEADS.putAll(heads);
return true;
}
diff --git a/src/main/java/tsp/headdb/event/PlayerHeadPurchaseEvent.java b/src/main/java/tsp/headdb/event/PlayerHeadPurchaseEvent.java
index 12f8141..2372e7c 100644
--- a/src/main/java/tsp/headdb/event/PlayerHeadPurchaseEvent.java
+++ b/src/main/java/tsp/headdb/event/PlayerHeadPurchaseEvent.java
@@ -7,7 +7,12 @@ import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import tsp.headdb.api.Head;
-
+/**
+ * This event is called when a player purchases a {@link Head}
+ *
+ * @author TheSilentPro
+ * @see tsp.headdb.inventory.InventoryUtils#purchaseHead(Player, Head, int, String, String)
+ */
public class PlayerHeadPurchaseEvent extends Event implements Cancellable {
private final HandlerList handlerList = new HandlerList();
diff --git a/src/main/java/tsp/headdb/inventory/InventoryUtils.java b/src/main/java/tsp/headdb/inventory/InventoryUtils.java
index 81ac7da..0a93179 100644
--- a/src/main/java/tsp/headdb/inventory/InventoryUtils.java
+++ b/src/main/java/tsp/headdb/inventory/InventoryUtils.java
@@ -195,7 +195,7 @@ public class InventoryUtils {
public static void openDatabase(Player player) {
Inventory inventory = Bukkit.createInventory(null, 54, Utils.colorize("&c&lHeadDB &8(" + HeadAPI.getHeads().size() + ")"));
- for (Category category : Category.getCategories()) {
+ for (Category category : Category.getValues()) {
ItemStack item = getUIItem(category.getName(), category.getItem());
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(Utils.colorize(category.getColor() + "&l" + category.getName().toUpperCase()));
@@ -304,14 +304,6 @@ public class InventoryUtils {
return true;
}
- @Deprecated
- public static void purchaseItem(Player player, ItemStack item, int amount, String category, String description) {
- if (!processPayment(player, amount, category, description)) return;
-
- item.setAmount(amount);
- player.getInventory().addItem(item);
- }
-
public static void purchaseHead(Player player, Head head, int amount, String category, String description) {
if (!processPayment(player, amount, category, description)) return;
PlayerHeadPurchaseEvent event = new PlayerHeadPurchaseEvent(player, head, getCategoryCost(player, category));
diff --git a/src/main/java/tsp/headdb/listener/MenuListener.java b/src/main/java/tsp/headdb/listener/MenuListener.java
index e8a6367..09ae243 100644
--- a/src/main/java/tsp/headdb/listener/MenuListener.java
+++ b/src/main/java/tsp/headdb/listener/MenuListener.java
@@ -14,7 +14,6 @@ import tsp.headdb.HeadDB;
import tsp.headdb.api.HeadAPI;
import tsp.headdb.database.Category;
import tsp.headdb.inventory.InventoryUtils;
-import tsp.headdb.util.Log;
import tsp.headdb.util.Utils;
public class MenuListener implements Listener {
diff --git a/src/main/java/tsp/headdb/util/Utils.java b/src/main/java/tsp/headdb/util/Utils.java
index b49d990..2c38532 100644
--- a/src/main/java/tsp/headdb/util/Utils.java
+++ b/src/main/java/tsp/headdb/util/Utils.java
@@ -3,18 +3,8 @@ package tsp.headdb.util;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
public class Utils {
- public static final Pattern UUID_PATTERN = Pattern.compile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
-
- public static boolean isValid(String uuid) {
- Matcher matcher = UUID_PATTERN.matcher(uuid);
- return matcher.find();
- }
-
public static void sendMessage(CommandSender sender, String message) {
sender.sendMessage(colorize(message));
}