diff --git a/pom.xml b/pom.xml index 26a6b21..31b8eef 100644 --- a/pom.xml +++ b/pom.xml @@ -6,11 +6,11 @@ tsp.headdb HeadDB - 1.3 + 2.0 jar HeadDB - Thousands of heads in a GUI + Database with thousands of heads @@ -23,9 +23,15 @@ mojang-repo https://libraries.minecraft.net/ + + + jitpack.io + https://jitpack.io + + com.destroystokyo.paper paper-api @@ -45,10 +51,17 @@ 1.5.21 provided + + + com.github.simplix-softworks + simplixstorage + 3.2.0 + + org.apache.maven.plugins maven-compiler-plugin @@ -57,6 +70,28 @@ 8 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + tsp.headdb.HeadDB + + + + + + diff --git a/src/main/java/tsp/headdb/HeadDB.java b/src/main/java/tsp/headdb/HeadDB.java index 3e65a91..00722cd 100644 --- a/src/main/java/tsp/headdb/HeadDB.java +++ b/src/main/java/tsp/headdb/HeadDB.java @@ -1,12 +1,15 @@ package tsp.headdb; +import de.leonhard.storage.Config; +import de.leonhard.storage.Json; +import de.leonhard.storage.LightningBuilder; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; +import tsp.headdb.api.HeadAPI; import tsp.headdb.command.Command_headdb; -import tsp.headdb.database.HeadDatabase; import tsp.headdb.listener.JoinListener; import tsp.headdb.listener.PagedPaneListener; import tsp.headdb.listener.MenuListener; -import tsp.headdb.util.Config; import tsp.headdb.util.Log; import tsp.headdb.util.Metrics; import tsp.headdb.util.Utils; @@ -15,16 +18,15 @@ public class HeadDB extends JavaPlugin { private static HeadDB instance; private static Config config; - private static Config playerdata; + private static Json playerdata; @Override public void onEnable() { instance = this; Log.info("Loading HeadDB - " + getDescription().getVersion()); saveDefaultConfig(); - config = new Config("plugins/HeadDB/config.yml"); - playerdata = new Config("plugins/HeadDB/playerdata.yml"); - playerdata.create(); + config = LightningBuilder.fromPath("config.yml", "plugins/HeadDB").createConfig().addDefaultsFromInputStream(); + playerdata = LightningBuilder.fromPath("playerdata.json", "plugins/HeadDB").createJson(); Log.debug("Starting metrics..."); new Metrics(this, Utils.METRICS_ID); @@ -37,8 +39,15 @@ public class HeadDB extends JavaPlugin { Log.debug("Registering commands..."); getCommand("headdb").setExecutor(new Command_headdb()); - Log.debug("Initializing Database..."); - HeadDatabase.update(); + if (config.getBoolean("fetchStartup")) { + if (config.getBoolean("asyncStartup")) { + Log.debug("Initializing Database... (ASYNC)"); + Bukkit.getScheduler().runTaskAsynchronously(this, task -> HeadAPI.getDatabase().update()); + }else { + Log.debug("Initializing Database... (SYNC)"); + Bukkit.getScheduler().runTask(this, task -> HeadAPI.getDatabase().update()); + } + } Log.info("Done!"); } @@ -47,7 +56,7 @@ public class HeadDB extends JavaPlugin { return config; } - public static Config getPlayerdata() { + public static Json getPlayerdata() { return playerdata; } diff --git a/src/main/java/tsp/headdb/api/Head.java b/src/main/java/tsp/headdb/api/Head.java index 6acc698..b6804b4 100644 --- a/src/main/java/tsp/headdb/api/Head.java +++ b/src/main/java/tsp/headdb/api/Head.java @@ -22,6 +22,12 @@ public class Head { private Category category; private int id; + public Head() {} + + public Head(int id) { + this.id = id; + } + public ItemStack getItemStack() { Validate.notNull(name, "name must not be null!"); Validate.notNull(uuid, "uuid must not be null!"); @@ -44,6 +50,7 @@ public class Head { } meta.setLore(Arrays.asList( Utils.colorize("&cID: " + id), + " ", Utils.colorize("&8Right-Click to add/remove from favorites.") )); item.setItemMeta(meta); @@ -55,85 +62,45 @@ public class Head { return name; } - public void setName(String name) { - this.name = name; - } - public UUID getUUID() { return uuid; } - public void setUUID(UUID uuid) { - this.uuid = uuid; - } - public String getValue() { return value; } - public void setValue(String value) { - this.value = value; - } - public Category getCategory() { return category; } - public void setCategory(Category category) { - this.category = category; - } - public int getId() { return id; } - public void setId(int id) { - this.id = id; + public Head withName(String name) { + this.name = name; + return this; } - public static class Builder { + public Head withUUID(UUID uuid) { + this.uuid = uuid; + return this; + } - private String name; - private UUID uuid; - private String value; - private Category category; - private int id; + public Head withValue(String value) { + this.value = value; + return this; + } - public Builder withName(String name) { - this.name = name; - return this; - } - - public Builder withUUID(UUID uuid) { - this.uuid = uuid; - return this; - } - - public Builder withValue(String value) { - this.value = value; - return this; - } - - public Builder withCategory(Category category) { - this.category = category; - return this; - } - - public Builder withId(int id) { - this.id = id; - return this; - } - - public Head build() { - Head head = new Head(); - head.setName(name); - head.setUUID(uuid); - head.setValue(value); - head.setCategory(category); - head.setId(id); - return head; - } + public Head withCategory(Category category) { + this.category = category; + return this; + } + public Head withId(int id) { + this.id = id; + return this; } } diff --git a/src/main/java/tsp/headdb/api/HeadAPI.java b/src/main/java/tsp/headdb/api/HeadAPI.java index 4be3612..d750535 100644 --- a/src/main/java/tsp/headdb/api/HeadAPI.java +++ b/src/main/java/tsp/headdb/api/HeadAPI.java @@ -8,6 +8,7 @@ import tsp.headdb.database.Category; import tsp.headdb.database.HeadDatabase; import tsp.headdb.inventory.InventoryUtils; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -20,6 +21,17 @@ import java.util.UUID; */ public class HeadAPI { + private static final HeadDatabase database = new HeadDatabase(); + + /** + * Retrieves the main {@link HeadDatabase} + * + * @return Head Database + */ + public static HeadDatabase getDatabase() { + return database; + } + /** * Opens the database for a player * @@ -55,8 +67,9 @@ public class HeadAPI { * @param id The ID of the head * @return The head */ + @Nullable public static Head getHeadByID(int id) { - return HeadDatabase.getHeadByID(id); + return database.getHeadByID(id); } /** @@ -65,8 +78,9 @@ public class HeadAPI { * @param uuid The UUID of the head * @return The head */ + @Nullable public static Head getHeadByUUID(UUID uuid) { - return HeadDatabase.getHeadByUUID(uuid); + return database.getHeadByUUID(uuid); } /** @@ -76,7 +90,7 @@ public class HeadAPI { * @return List of heads */ public static List getHeadsByName(String name) { - return HeadDatabase.getHeadsByName(name); + return database.getHeadsByName(name); } /** @@ -87,7 +101,7 @@ public class HeadAPI { * @return List of heads */ public static List getHeadsByName(Category category, String name) { - return HeadDatabase.getHeadsByName(category, name); + return database.getHeadsByName(category, name); } /** @@ -96,8 +110,9 @@ public class HeadAPI { * @param value The texture value * @return The head */ + @Nullable public static Head getHeadByValue(String value) { - return HeadDatabase.getHeadByValue(value); + return database.getHeadByValue(value); } /** @@ -107,7 +122,7 @@ public class HeadAPI { * @return List of heads */ public static List getHeads(Category category) { - return HeadDatabase.getHeads(category); + return database.getHeads(category); } /** @@ -116,7 +131,7 @@ public class HeadAPI { * @return List of all heads */ public static List getHeads() { - return HeadDatabase.getHeads(); + return database.getHeads(); } /** @@ -126,12 +141,11 @@ public class HeadAPI { * @param id The ID of the head */ public static void addFavoriteHead(UUID uuid, int id) { - List favs = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + List favs = HeadDB.getPlayerdata().getIntegerList(uuid.toString() + ".favorites"); if (!favs.contains(id)) { favs.add(id); } HeadDB.getPlayerdata().set(uuid.toString() + ".favorites", favs); - HeadDB.getPlayerdata().save(); } /** @@ -141,7 +155,7 @@ public class HeadAPI { * @param id The ID of the head */ public static void removeFavoriteHead(UUID uuid, int id) { - List favs = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + List favs = HeadDB.getPlayerdata().getIntegerList(uuid.toString() + ".favorites"); for (int i = 0; i < favs.size(); i++) { if (favs.get(i) == id) { favs.remove(i); @@ -149,7 +163,6 @@ public class HeadAPI { } } HeadDB.getPlayerdata().set(uuid.toString() + ".favorites", favs); - HeadDB.getPlayerdata().save(); } /** @@ -160,7 +173,7 @@ public class HeadAPI { */ public static List getFavoriteHeads(UUID uuid) { List heads = new ArrayList<>(); - List ids = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + List ids = HeadDB.getPlayerdata().getIntegerList(uuid.toString() + ".favorites"); for (int id : ids) { Head head = getHeadByID(id); heads.add(head); @@ -177,12 +190,10 @@ public class HeadAPI { */ public static List getLocalHeads() { List heads = new ArrayList<>(); - for (String key : HeadDB.getPlayerdata().getKeys(false)) { + for (String key : HeadDB.getPlayerdata().keySet()) { OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(key)); - heads.add(new LocalHead.Builder() - .withUUID(player.getUniqueId()) - .withName(player.getName()) - .build()); + heads.add(new LocalHead(player.getUniqueId()) + .withName(player.getName())); } return heads; @@ -192,7 +203,7 @@ public class HeadAPI { * Update the Head Database */ public static void updateDatabase() { - HeadDatabase.update(); + database.update(); } } diff --git a/src/main/java/tsp/headdb/api/LocalHead.java b/src/main/java/tsp/headdb/api/LocalHead.java index eda807b..f5f558d 100644 --- a/src/main/java/tsp/headdb/api/LocalHead.java +++ b/src/main/java/tsp/headdb/api/LocalHead.java @@ -39,39 +39,18 @@ public class LocalHead { return uuid; } - public void setUuid(UUID uuid) { - this.uuid = uuid; - } - public String getName() { return name; } - public void setName(String name) { - this.name = name; + public LocalHead withUUID(UUID uuid) { + this.uuid = uuid; + return this; } - public static class Builder { - - private UUID uuid; - private String name; - - public Builder withUUID(UUID uuid) { - this.uuid = uuid; - return this; - } - - public Builder withName(String name) { - this.name = name; - return this; - } - - public LocalHead build() { - LocalHead head = new LocalHead(uuid); - head.setName(name); - return head; - } - + 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 93d243f..e1cad59 100644 --- a/src/main/java/tsp/headdb/command/Command_headdb.java +++ b/src/main/java/tsp/headdb/command/Command_headdb.java @@ -36,6 +36,7 @@ public class Command_headdb implements CommandExecutor { if (sub.equalsIgnoreCase("info") || sub.equalsIgnoreCase("i")) { Utils.sendMessage(sender, "Running &cHeadDB v" + HeadDB.getInstance().getDescription().getVersion()); Utils.sendMessage(sender, "Created by &c" + HeadDB.getInstance().getDescription().getAuthors()); + Utils.sendMessage(sender, "There are currently &c" + HeadAPI.getHeads().size() + " &7heads in the database."); return true; } @@ -56,7 +57,10 @@ public class Command_headdb implements CommandExecutor { StringBuilder builder = new StringBuilder(); for (int i = 1; i < args.length; i++) { - builder.append(args[i]).append(" "); + builder.append(args[i]); + if (i != args.length - 1) { + builder.append(" "); + } } String name = builder.toString(); Utils.sendMessage(sender, "Searching for &e" + name); diff --git a/src/main/java/tsp/headdb/database/HeadDatabase.java b/src/main/java/tsp/headdb/database/HeadDatabase.java index 8b57f9e..1b75f49 100644 --- a/src/main/java/tsp/headdb/database/HeadDatabase.java +++ b/src/main/java/tsp/headdb/database/HeadDatabase.java @@ -1,5 +1,6 @@ package tsp.headdb.database; +import org.bukkit.ChatColor; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -23,11 +24,13 @@ import java.util.concurrent.TimeUnit; */ public class HeadDatabase { - private static final Map> HEADS = new HashMap<>(); - private static final String URL = "https://minecraft-heads.com/scripts/api.php?cat="; - private static long updated; + private final Map> HEADS = new HashMap<>(); + private final String URL = "https://minecraft-heads.com/scripts/api.php?cat="; + private long updated; + + public HeadDatabase() {} - public static Head getHeadByValue(String value) { + public Head getHeadByValue(String value) { List heads = getHeads(); for (Head head : heads) { if (head.getValue().equals(value)) { @@ -38,7 +41,7 @@ public class HeadDatabase { return null; } - public static Head getHeadByID(int id) { + public Head getHeadByID(int id) { List heads = getHeads(); for (Head head : heads) { if (head.getId() == id) { @@ -49,7 +52,7 @@ public class HeadDatabase { return null; } - public static Head getHeadByUUID(UUID uuid) { + public Head getHeadByUUID(UUID uuid) { List heads = getHeads(); for (Head head : heads) { if (head.getUUID().equals(uuid)) { @@ -60,11 +63,12 @@ public class HeadDatabase { return null; } - public static List getHeadsByName(Category category, String name) { + public List getHeadsByName(Category category, String name) { List result = new ArrayList<>(); List heads = getHeads(category); for (Head head : heads) { - if (head.getName().toLowerCase().contains(name.toLowerCase())) { + String hName = ChatColor.stripColor(head.getName().toLowerCase(Locale.ROOT)); + if (hName.contains(ChatColor.stripColor(name.toLowerCase(Locale.ROOT)))) { result.add(head); } } @@ -72,23 +76,20 @@ public class HeadDatabase { return result; } - public static List getHeadsByName(String name) { + public List getHeadsByName(String name) { List result = new ArrayList<>(); - List heads = getHeads(); - for (Head head : heads) { - if (head.getName().toLowerCase().contains(name.toLowerCase())) { - result.add(head); - } + for (Category category : Category.values()) { + result.addAll(getHeadsByName(category, name)); } return result; } - public static List getHeads(Category category) { + public List getHeads(Category category) { return HEADS.get(category); } - public static List getHeads() { + public List getHeads() { if (!HEADS.isEmpty() && !isLastUpdateOld()) { List heads = new ArrayList<>(); for (Category category : HEADS.keySet()) { @@ -101,7 +102,7 @@ public class HeadDatabase { return getHeads(); } - public static Map> getHeadsNoCache() { + public Map> getHeadsNoCache() { Map> result = new HashMap<>(); List categories = Category.getCategories(); @@ -116,9 +117,7 @@ public class HeadDatabase { URLConnection connection = new URL(URL + category.getName()).openConnection(); connection.setConnectTimeout(5000); connection.setRequestProperty("User-Agent", "HeadDB"); - try (BufferedReader in = new BufferedReader( - new InputStreamReader( - connection.getInputStream()))) { + try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { while ((line = in.readLine()) != null) { response.append(line); } @@ -127,13 +126,11 @@ public class HeadDatabase { JSONArray array = (JSONArray) parser.parse(response.toString()); for (Object o : array) { JSONObject obj = (JSONObject) o; - Head head = new Head.Builder() + Head head = new Head(id) .withName(obj.get("name").toString()) .withUUID(UUID.fromString(obj.get("uuid").toString())) .withValue(obj.get("value").toString()) - .withCategory(category) - .withId(id) - .build(); + .withCategory(category); id++; heads.add(head); @@ -150,7 +147,7 @@ public class HeadDatabase { return result; } - public static void update() { + public void update() { Map> heads = getHeadsNoCache(); HEADS.clear(); for (Map.Entry> entry : heads.entrySet()) { @@ -158,13 +155,13 @@ public class HeadDatabase { } } - public static long getLastUpdate() { + public long getLastUpdate() { long now = System.nanoTime(); long elapsed = now - updated; return TimeUnit.NANOSECONDS.toSeconds(elapsed); } - public static boolean isLastUpdateOld() { + public boolean isLastUpdateOld() { if (HeadDB.getCfg() == null && getLastUpdate() >= 3600) return true; return getLastUpdate() >= HeadDB.getCfg().getLong("refresh"); } diff --git a/src/main/java/tsp/headdb/listener/JoinListener.java b/src/main/java/tsp/headdb/listener/JoinListener.java index e3eaab6..4b2f007 100644 --- a/src/main/java/tsp/headdb/listener/JoinListener.java +++ b/src/main/java/tsp/headdb/listener/JoinListener.java @@ -14,7 +14,6 @@ public class JoinListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent e) { HeadDB.getPlayerdata().set(e.getPlayer().getUniqueId().toString() + ".username", e.getPlayer().getName()); - HeadDB.getPlayerdata().save(); } } diff --git a/src/main/java/tsp/headdb/util/Config.java b/src/main/java/tsp/headdb/util/Config.java deleted file mode 100644 index 625dc4e..0000000 --- a/src/main/java/tsp/headdb/util/Config.java +++ /dev/null @@ -1,119 +0,0 @@ -package tsp.headdb.util; - -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Set; - -/** - * @author TheSilentPro - */ -public class Config { - - private final File file; - private FileConfiguration config; - - public Config(File file) { - this.file = file; - this.config = YamlConfiguration.loadConfiguration(file); - } - - public Config(String path) { - this.file = new File(path); - this.config = YamlConfiguration.loadConfiguration(file); - } - - public Config(Config config) { - this.file = config.getFile(); - this.config = config.getConfig(); - } - - public String getString(String path) { - return Utils.colorize(config.getString(path)); - } - - public boolean getBoolean(String path) { - return config.getBoolean(path); - } - - public List getStringList(String path) { - return config.getStringList(path); - } - - public int getInt(String path) { - return config.getInt(path); - } - - public List getIntList(String path) { - return config.getIntegerList(path); - } - - public long getLong(String path) { - return config.getLong(path); - } - - public Set getKeys(boolean deep) { - return config.getKeys(deep); - } - - public ConfigurationSection getConfigurationSection(String path) { - return config.getConfigurationSection(path); - } - - public Set getKeys(ConfigurationSection configurationSection, boolean b) { - return configurationSection.getKeys(b); - } - - public void set(String path, Object value) { - config.set(path, value); - } - - public Object get(String path) { - return config.get(path); - } - - public FileConfiguration getConfig() { - return config; - } - - public File getFile() { - return file; - } - - public boolean exists() { - return file.exists(); - } - - public void reload() { - this.config = YamlConfiguration.loadConfiguration(file); - } - - public boolean create() { - if (!file.exists()) { - try { - return file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return false; - } - - public boolean save() { - try { - config.save(file); - return true; - } catch (IOException e) { - Log.error("Failed to save " + file.getName() + " | Stack Trace:"); - e.printStackTrace(); - } - - return false; - } - -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 81f0e9b..9b5f3d5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,3 +1,9 @@ +# When enabled heads will be fetched from startup, otherwise when the /hdb command is ran +fetchStartup: true + +# When enabled, heads will be fetched async (Startup Only) +asyncStartup: false + # If the cached heads are older than these amount of seconds, the plugin will refresh the database refresh: 3600 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4953194..15450ce 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,8 @@ name: HeadDB -description: Adds a menu with thousands of heads +description: Database with thousands of heads main: tsp.headdb.HeadDB -version: 1.3 +version: 2.0 api-version: 1.16 author: Silent