Mirror von
https://github.com/TheSilentPro/HeadDB.git
synchronisiert 2024-12-27 11:20:05 +01:00
HeadDB 3.0
Dieser Commit ist enthalten in:
Ursprung
5b250a91af
Commit
b2796f59bd
16
pom.xml
16
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>tsp.headdb</groupId>
|
||||
<artifactId>HeadDB</artifactId>
|
||||
<version>2.4.5</version>
|
||||
<version>3.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>HeadDB</name>
|
||||
@ -43,12 +43,6 @@
|
||||
<version>1.18-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- json-simple -->
|
||||
<dependency>
|
||||
<groupId>com.googlecode.json-simple</groupId>
|
||||
<artifactId>json-simple</artifactId>
|
||||
<version>1.1.1</version>
|
||||
</dependency>
|
||||
<!-- Mojang Auth Lib -->
|
||||
<dependency>
|
||||
<groupId>com.mojang</groupId>
|
||||
@ -56,12 +50,6 @@
|
||||
<version>1.5.21</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- Storage Lib -->
|
||||
<dependency>
|
||||
<groupId>com.github.simplix-softworks</groupId>
|
||||
<artifactId>simplixstorage</artifactId>
|
||||
<version>3.2.0</version>
|
||||
</dependency>
|
||||
<!-- AnvilGUI -->
|
||||
<dependency>
|
||||
<groupId>net.wesjd</groupId>
|
||||
@ -111,7 +99,7 @@
|
||||
<configuration>
|
||||
<transformers>
|
||||
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
|
||||
<mainClass>tsp.headdb.HeadDB</mainClass>
|
||||
<mainClass>tsp.headdb.legacy.HeadDBLegacy</mainClass>
|
||||
</transformer>
|
||||
</transformers>
|
||||
</configuration>
|
||||
|
@ -1,32 +1,34 @@
|
||||
package tsp.headdb;
|
||||
|
||||
import de.leonhard.storage.Config;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import tsp.headdb.api.HeadAPI;
|
||||
import tsp.headdb.command.Command_headdb;
|
||||
import tsp.headdb.command.CommandHeadDB;
|
||||
import tsp.headdb.listener.JoinListener;
|
||||
import tsp.headdb.listener.PagedPaneListener;
|
||||
import tsp.headdb.listener.MenuListener;
|
||||
import tsp.headdb.listener.PagedPaneListener;
|
||||
import tsp.headdb.storage.PlayerDataFile;
|
||||
import tsp.headdb.util.Log;
|
||||
import tsp.headdb.util.Metrics;
|
||||
import tsp.headdb.util.Storage;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
|
||||
public class HeadDB extends JavaPlugin {
|
||||
|
||||
private static HeadDB instance;
|
||||
private Storage storage;
|
||||
private Economy economy = null;
|
||||
private Economy economy;
|
||||
private PlayerDataFile playerData;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
Log.info("Loading HeadDB - " + getDescription().getVersion());
|
||||
saveDefaultConfig();
|
||||
storage = new Storage().init(this);
|
||||
|
||||
if (storage.getConfig().getBoolean("economy.enable")) {
|
||||
this.playerData = new PlayerDataFile("player_data.json");
|
||||
this.playerData.load();
|
||||
|
||||
if (getConfig().getBoolean("economy.enable")) {
|
||||
Log.debug("Starting economy...");
|
||||
this.economy = this.setupEconomy();
|
||||
if (this.economy == null) {
|
||||
@ -36,29 +38,28 @@ public class HeadDB extends JavaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
if (storage.getConfig().getBoolean("fetchStartup")) {
|
||||
if (storage.getConfig().getBoolean("asyncStartup")) {
|
||||
Log.debug("Initializing Database... (ASYNC)");
|
||||
HeadAPI.getDatabase().updateAsync();
|
||||
} else {
|
||||
Log.debug("Initializing Database... (SYNC)");
|
||||
HeadAPI.updateDatabase();
|
||||
}
|
||||
}
|
||||
long refresh = getConfig().getLong("refresh") * 20;
|
||||
HeadAPI.getDatabase().setRefresh(refresh);
|
||||
Bukkit.getScheduler().runTaskTimerAsynchronously(this, task ->
|
||||
HeadAPI.getDatabase().updateAsync(heads -> Log.info("Fetched " + HeadAPI.getHeads().size() + " heads!")),
|
||||
0L, refresh);
|
||||
|
||||
Log.debug("Registering listeners...");
|
||||
new PagedPaneListener(this);
|
||||
new MenuListener(this);
|
||||
new JoinListener(this);
|
||||
new MenuListener(this);
|
||||
new PagedPaneListener(this);
|
||||
|
||||
Log.debug("Registering commands...");
|
||||
getCommand("headdb").setExecutor(new Command_headdb());
|
||||
getCommand("headdb").setExecutor(new CommandHeadDB());
|
||||
|
||||
Log.debug("Starting metrics...");
|
||||
new Metrics(this, 9152);
|
||||
Log.info("Done!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
this.playerData.save();
|
||||
}
|
||||
|
||||
private Economy setupEconomy() {
|
||||
if (!this.getServer().getPluginManager().isPluginEnabled("Vault")) return null;
|
||||
|
||||
@ -68,16 +69,12 @@ public class HeadDB extends JavaPlugin {
|
||||
return this.economy = economyProvider.getProvider();
|
||||
}
|
||||
|
||||
public Config getConfiguration() {
|
||||
return storage.getConfig();
|
||||
}
|
||||
|
||||
public Storage getStorage() {
|
||||
return storage;
|
||||
}
|
||||
|
||||
public Economy getEconomy() {
|
||||
return this.economy;
|
||||
return economy;
|
||||
}
|
||||
|
||||
public PlayerDataFile getPlayerData() {
|
||||
return playerData;
|
||||
}
|
||||
|
||||
public static HeadDB getInstance() {
|
||||
|
@ -23,6 +23,7 @@ public class Head {
|
||||
private Category category;
|
||||
private int id;
|
||||
private List<String> tags;
|
||||
private ItemStack itemStack;
|
||||
|
||||
public Head() {}
|
||||
|
||||
@ -31,6 +32,7 @@ public class Head {
|
||||
}
|
||||
|
||||
public ItemStack getItemStack() {
|
||||
if (itemStack == null) {
|
||||
Validate.notNull(name, "name must not be null!");
|
||||
Validate.notNull(uuid, "uuid must not be null!");
|
||||
Validate.notNull(value, "value must not be null!");
|
||||
@ -57,9 +59,12 @@ public class Head {
|
||||
"",
|
||||
Utils.colorize("&8Right-Click to add/remove from favorites.")
|
||||
));
|
||||
item.setItemMeta(meta);
|
||||
|
||||
return item;
|
||||
item.setItemMeta(meta);
|
||||
itemStack = item;
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@ -86,32 +91,32 @@ public class Head {
|
||||
return tags;
|
||||
}
|
||||
|
||||
public Head withName(String name) {
|
||||
public Head name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Head withUniqueId(UUID uuid) {
|
||||
public Head uniqueId(UUID uuid) {
|
||||
this.uuid = uuid;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Head withValue(String value) {
|
||||
public Head value(String value) {
|
||||
this.value = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Head withCategory(Category category) {
|
||||
public Head category(Category category) {
|
||||
this.category = category;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Head withId(int id) {
|
||||
public Head id(int id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Head withTags(String tags) {
|
||||
public Head tags(String tags) {
|
||||
this.tags = Arrays.asList(tags.split(","));
|
||||
return this;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import tsp.headdb.HeadDB;
|
||||
import tsp.headdb.database.Category;
|
||||
import tsp.headdb.database.HeadDatabase;
|
||||
import tsp.headdb.inventory.InventoryUtils;
|
||||
import tsp.headdb.storage.PlayerDataFile;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
@ -144,76 +145,33 @@ public final class HeadAPI {
|
||||
return database.getHeads();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a {@link Head} to a players favorites
|
||||
*
|
||||
* @param uuid The UUID of the player
|
||||
* @param id The ID of the head
|
||||
*/
|
||||
public static void addFavoriteHead(UUID uuid, int id) {
|
||||
List<Integer> favs = HeadDB.getInstance().getConfiguration().getIntegerList(uuid.toString() + ".favorites");
|
||||
if (!favs.contains(id)) {
|
||||
favs.add(id);
|
||||
}
|
||||
HeadDB.getInstance().getStorage().getPlayerData().set(uuid.toString() + ".favorites", favs);
|
||||
public static void addFavoriteHead(UUID uuid, String textureValue) {
|
||||
HeadDB.getInstance().getPlayerData().modifyFavorite(uuid, textureValue, PlayerDataFile.ModificationType.SET);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a {@link Head} from a players favorites
|
||||
*
|
||||
* @param uuid The UUID of the player
|
||||
* @param id The ID of the head
|
||||
*/
|
||||
public static void removeFavoriteHead(UUID uuid, int id) {
|
||||
List<Integer> favs = HeadDB.getInstance().getStorage().getPlayerData().getIntegerList(uuid.toString() + ".favorites");
|
||||
for (int i = 0; i < favs.size(); i++) {
|
||||
if (favs.get(i) == id) {
|
||||
favs.remove(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
HeadDB.getInstance().getStorage().getPlayerData().set(uuid.toString() + ".favorites", favs);
|
||||
public static void removeFavoriteHead(UUID uuid, String textureValue) {
|
||||
HeadDB.getInstance().getPlayerData().modifyFavorite(uuid, textureValue, PlayerDataFile.ModificationType.REMOVE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a {@link List} of favorite {@link Head} for a player
|
||||
*
|
||||
* @param uuid The UUID of the player
|
||||
* @return List of favorite heads
|
||||
*/
|
||||
public static List<Head> getFavoriteHeads(UUID uuid) {
|
||||
List<Head> heads = new ArrayList<>();
|
||||
List<Integer> ids = HeadDB.getInstance().getStorage().getPlayerData().getIntegerList(uuid.toString() + ".favorites");
|
||||
for (int id : ids) {
|
||||
Head head = getHeadByID(id);
|
||||
heads.add(head);
|
||||
List<Head> result = new ArrayList<>();
|
||||
|
||||
List<String> textures = HeadDB.getInstance().getPlayerData().getFavoriteHeadsByTexture(uuid);
|
||||
for (String texture : textures) {
|
||||
result.add(HeadAPI.getHeadByValue(texture));
|
||||
}
|
||||
|
||||
return heads;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a {@link List} of local heads.
|
||||
* These heads are from players that have joined the server at least once.
|
||||
*
|
||||
* @return List of {@link LocalHead}'s
|
||||
*/
|
||||
public static List<LocalHead> getLocalHeads() {
|
||||
List<LocalHead> heads = new ArrayList<>();
|
||||
for (String key : HeadDB.getInstance().getStorage().getPlayerData().singleLayerKeySet()) {
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(key));
|
||||
heads.add(new LocalHead(player.getUniqueId())
|
||||
.withName(player.getName()));
|
||||
List<LocalHead> result = new ArrayList<>();
|
||||
for (String entry : HeadDB.getInstance().getPlayerData().getEntries()) {
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(entry));
|
||||
result.add(new LocalHead(player.getUniqueId()).name(player.getName()));
|
||||
}
|
||||
|
||||
return heads;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the Head Database
|
||||
*/
|
||||
public static boolean updateDatabase() {
|
||||
return database.update();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -68,13 +68,13 @@ public class LocalHead extends Head {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalHead withUniqueId(UUID uuid) {
|
||||
public LocalHead uniqueId(UUID uuid) {
|
||||
this.uuid = uuid;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalHead withName(String name) {
|
||||
public LocalHead name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
@ -13,7 +13,8 @@ import tsp.headdb.util.Utils;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class Command_headdb implements CommandExecutor {
|
||||
// TODO: Cleaner way to handle this command
|
||||
public class CommandHeadDB implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
|
||||
@ -28,16 +29,16 @@ public class Command_headdb implements CommandExecutor {
|
||||
}
|
||||
Player player = (Player) sender;
|
||||
|
||||
Utils.sendMessage(player, "Opening &cHead Database");
|
||||
Utils.sendMessage(player, "&7Opening &cHead Database");
|
||||
HeadAPI.openDatabase(player);
|
||||
return true;
|
||||
}
|
||||
String sub = args[0];
|
||||
|
||||
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.");
|
||||
Utils.sendMessage(sender, "&7Running &cHeadDB - " + HeadDB.getInstance().getDescription().getVersion());
|
||||
Utils.sendMessage(sender, "&7Created by &c" + HeadDB.getInstance().getDescription().getAuthors());
|
||||
Utils.sendMessage(sender, "&7There are currently &c" + HeadAPI.getHeads().size() + " &7heads in the database.");
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -64,7 +65,7 @@ public class Command_headdb implements CommandExecutor {
|
||||
}
|
||||
}
|
||||
String name = builder.toString();
|
||||
Utils.sendMessage(sender, "Searching for &e" + name);
|
||||
Utils.sendMessage(sender, "&7Searching for &e" + name);
|
||||
HeadAPI.openSearchDatabase(player, name);
|
||||
return true;
|
||||
}
|
||||
@ -85,7 +86,7 @@ public class Command_headdb implements CommandExecutor {
|
||||
Player player = (Player) sender;
|
||||
|
||||
String tag = args[1];
|
||||
Utils.sendMessage(sender, "Searching for heads with tag &e" + tag);
|
||||
Utils.sendMessage(sender, "&7Searching for heads with tag &e" + tag);
|
||||
HeadAPI.openTagSearchDatabase(player, tag);
|
||||
return true;
|
||||
}
|
||||
@ -136,36 +137,22 @@ public class Command_headdb implements CommandExecutor {
|
||||
|
||||
Utils.sendMessage(sender, "Updating...");
|
||||
long start = System.currentTimeMillis();
|
||||
boolean result = HeadAPI.updateDatabase();
|
||||
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...");
|
||||
HeadAPI.getDatabase().updateAsync();
|
||||
HeadAPI.getDatabase().updateAsync(heads -> {
|
||||
Utils.sendMessage(sender, "&7Done! Took: &a" + TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start) + " &7seconds");
|
||||
Utils.sendMessage(sender, "&7There are &a" + HeadAPI.getHeads() + " &7heads in the database!");
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
Utils.sendMessage(sender, " ");
|
||||
Utils.sendMessage(sender, "&c&lHeadDB &c- &5Commands");
|
||||
Utils.sendMessage(sender, "&7&oParameters:&c command &9(aliases)&c arguments... &7- Description");
|
||||
Utils.sendMessage(sender, " > &c/hdb &7- Opens the database");
|
||||
Utils.sendMessage(sender, " > &c/hdb info &9(i) &7- Plugin Information");
|
||||
Utils.sendMessage(sender, " > &c/hdb search &9(s) &c<name> &7- Search for heads matching a name");
|
||||
Utils.sendMessage(sender, " > &c/hdb tagsearch &9(ts) &c<tag> &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<id> <player> &6[amount] &7- Give player a head");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb &7- Opens the database");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb info &9(i) &7- Plugin Information");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb search &9(s) &c<name> &7- Search for heads matching a name");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb tagsearch &9(ts) &c<tag> &7- Search for heads matching a tag");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb update &9(u) &7- Forcefully update the database");
|
||||
Utils.sendMessage(sender, "&7 > &c/hdb give &9(g) &c<id> <player> &6[amount] &7- Give player a head");
|
||||
Utils.sendMessage(sender, " ");
|
||||
return true;
|
||||
}
|
@ -25,7 +25,7 @@ public enum Category {
|
||||
private final ChatColor color;
|
||||
private final int location;
|
||||
private final Map<Category, Head> item = new HashMap<>();
|
||||
private static final Category[] values = values();
|
||||
public static final Category[] cache = values();
|
||||
|
||||
Category(String name, ChatColor color, int location) {
|
||||
this.name = name;
|
||||
@ -55,7 +55,7 @@ public enum Category {
|
||||
}
|
||||
|
||||
public static Category getByName(String name) {
|
||||
for (Category category : values) {
|
||||
for (Category category : cache) {
|
||||
if (category.getName().equalsIgnoreCase(name)) {
|
||||
return category;
|
||||
}
|
||||
@ -64,8 +64,4 @@ public enum Category {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Category[] getValues() {
|
||||
return values;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,8 +23,8 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* This is the Database that holds all heads
|
||||
@ -127,7 +127,14 @@ public class HeadDatabase {
|
||||
@Nonnull
|
||||
public List<Head> getHeads() {
|
||||
if (HEADS.isEmpty() || isLastUpdateOld()) {
|
||||
update();
|
||||
// Technically this should never be reached due to the update task in the main class.
|
||||
updateAsync(result -> {
|
||||
if (result != null) {
|
||||
for (Category category : result.keySet()) {
|
||||
HEADS.put(category, result.get(category));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
List<Head> heads = new ArrayList<>();
|
||||
@ -137,15 +144,11 @@ public class HeadDatabase {
|
||||
return heads;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all heads from the api provider
|
||||
*
|
||||
* @return Map containing each head in its category. Returns null if the fetching failed.
|
||||
*/
|
||||
@Nullable
|
||||
public Map<Category, List<Head>> getHeadsNoCache() {
|
||||
public void getHeadsNoCacheAsync(Consumer<Map<Category, List<Head>>> resultSet) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, task -> {
|
||||
Log.debug("[" + plugin.getName() + "] Updating database... ");
|
||||
Map<Category, List<Head>> result = new HashMap<>();
|
||||
Category[] categories = Category.getValues();
|
||||
Category[] categories = Category.cache;
|
||||
|
||||
int id = 1;
|
||||
for (Category category : categories) {
|
||||
@ -174,16 +177,15 @@ public class HeadDatabase {
|
||||
if (Utils.validateUniqueId(rawUUID)) {
|
||||
uuid = UUID.fromString(rawUUID);
|
||||
} else {
|
||||
Log.debug("UUID " + rawUUID + " is invalid. Using random one for head id: " + id);
|
||||
uuid = UUID.randomUUID();
|
||||
}
|
||||
|
||||
Head head = new Head(id)
|
||||
.withName(obj.get("name").toString())
|
||||
.withUniqueId(uuid)
|
||||
.withValue(obj.get("value").toString())
|
||||
.withTags(obj.get("tags") != null ? obj.get("tags").toString() : "None")
|
||||
.withCategory(category);
|
||||
.name(obj.get("name").toString())
|
||||
.uniqueId(uuid)
|
||||
.value(obj.get("value").toString())
|
||||
.tags(obj.get("tags") != null ? obj.get("tags").toString() : "None")
|
||||
.category(category);
|
||||
|
||||
id++;
|
||||
heads.add(head);
|
||||
@ -192,37 +194,30 @@ public class HeadDatabase {
|
||||
long elapsed = (System.currentTimeMillis() - start);
|
||||
Log.debug(category.getName() + " -> Done! Time: " + elapsed + "ms (" + TimeUnit.MILLISECONDS.toSeconds(elapsed) + "s)");
|
||||
} catch (ParseException | IOException e) {
|
||||
Log.error("Failed to fetch heads (no-cache) | Stack Trace:");
|
||||
Log.error("[" + plugin.getName() + "] Failed to fetch heads (no-cache) | Stack Trace:");
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
updated = System.nanoTime();
|
||||
result.put(category, heads);
|
||||
}
|
||||
|
||||
return result;
|
||||
resultSet.accept(result);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the cached heads
|
||||
*
|
||||
* @return Returns true if the update was successful.
|
||||
*/
|
||||
public boolean update() {
|
||||
Map<Category, List<Head>> heads = getHeadsNoCache();
|
||||
public void updateAsync(Consumer<Map<Category, List<Head>>> result) {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, task -> getHeadsNoCacheAsync(heads -> {
|
||||
if (heads == null) {
|
||||
Log.error("Failed to update database! Check above for any errors.");
|
||||
return false;
|
||||
Log.error("[" + plugin.getName() + "] Failed to update database! Check above for any errors.");
|
||||
result.accept(null);
|
||||
return;
|
||||
}
|
||||
|
||||
HEADS.clear();
|
||||
HEADS.putAll(heads);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateAsync() {
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, this::update);
|
||||
result.accept(heads);
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -4,7 +4,6 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import tsp.headdb.api.Head;
|
||||
|
||||
/**
|
||||
@ -62,7 +61,7 @@ public class PlayerHeadPurchaseEvent extends Event implements Cancellable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull HandlerList getHandlers() {
|
||||
public HandlerList getHandlers() {
|
||||
return handlerList;
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,8 @@ public class InventoryUtils {
|
||||
if (uiLocation.containsKey(category)) return uiLocation.get(category);
|
||||
|
||||
// Try to get the value from the config file.
|
||||
if (HeadDB.getInstance().getConfiguration().contains("ui.category." + category + ".location")) {
|
||||
uiLocation.put(category, HeadDB.getInstance().getConfiguration().getInt("ui.category." + category + ".location"));
|
||||
if (HeadDB.getInstance().getConfig().contains("ui.category." + category + ".location")) {
|
||||
uiLocation.put(category, HeadDB.getInstance().getConfig().getInt("ui.category." + category + ".location"));
|
||||
return uiLocation.get(category);
|
||||
}
|
||||
|
||||
@ -48,8 +48,8 @@ public class InventoryUtils {
|
||||
if (uiItem.containsKey(category)) return uiItem.get(category);
|
||||
|
||||
// Try to get a head from the config file.
|
||||
if (HeadDB.getInstance().getConfiguration().contains("ui.category." + category + ".head")) {
|
||||
int id = HeadDB.getInstance().getConfiguration().getInt("ui.category." + category + ".head");
|
||||
if (HeadDB.getInstance().getConfig().contains("ui.category." + category + ".head")) {
|
||||
int id = HeadDB.getInstance().getConfig().getInt("ui.category." + category + ".head");
|
||||
Head head = HeadAPI.getHeadByID(id);
|
||||
if (head != null) {
|
||||
uiItem.put(category, head.getItemStack());
|
||||
@ -58,8 +58,8 @@ public class InventoryUtils {
|
||||
}
|
||||
|
||||
// Try to get an item from the config file.
|
||||
if (HeadDB.getInstance().getConfiguration().contains("ui.category." + category + ".item")) {
|
||||
String cfg = HeadDB.getInstance().getConfiguration().getString("ui.category." + category + ".item");
|
||||
if (HeadDB.getInstance().getConfig().contains("ui.category." + category + ".item")) {
|
||||
String cfg = HeadDB.getInstance().getConfig().getString("ui.category." + category + ".item");
|
||||
Material mat = Material.matchMaterial(cfg);
|
||||
|
||||
// AIR is allowed as the fill material for the menu, but not as a category item.
|
||||
@ -112,9 +112,9 @@ public class InventoryUtils {
|
||||
purchaseHead(player, head, 1, head.getCategory().getName(), head.getName());
|
||||
}
|
||||
if (e.getClick() == ClickType.RIGHT) {
|
||||
HeadAPI.removeFavoriteHead(player.getUniqueId(), head.getId());
|
||||
HeadAPI.removeFavoriteHead(player.getUniqueId(), head.getValue());
|
||||
openFavoritesMenu(player);
|
||||
Utils.sendMessage(player, "Removed &e" + head.getName() + " &7from favorites.");
|
||||
Utils.sendMessage(player, "&7Removed &e" + head.getName() + " &7from favorites.");
|
||||
}
|
||||
}));
|
||||
}
|
||||
@ -136,8 +136,8 @@ public class InventoryUtils {
|
||||
purchaseHead(player, head, 1, head.getCategory().getName(), head.getName());
|
||||
}
|
||||
if (e.getClick() == ClickType.RIGHT) {
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getId());
|
||||
Utils.sendMessage(player, "Added &e" + head.getName() + " &7to favorites.");
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue());
|
||||
Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites.");
|
||||
}
|
||||
}));
|
||||
}
|
||||
@ -160,8 +160,8 @@ public class InventoryUtils {
|
||||
purchaseHead(player, head, 1, head.getCategory().getName(), head.getName());
|
||||
}
|
||||
if (e.getClick() == ClickType.RIGHT) {
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getId());
|
||||
Utils.sendMessage(player, "Added &e" + head.getName() + " &7to favorites.");
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue());
|
||||
Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites.");
|
||||
}
|
||||
}));
|
||||
}
|
||||
@ -183,8 +183,8 @@ public class InventoryUtils {
|
||||
purchaseHead(player, head, 1, head.getCategory().getName(), head.getName());
|
||||
}
|
||||
if (e.getClick() == ClickType.RIGHT) {
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getId());
|
||||
Utils.sendMessage(player, "Added &e" + head.getName() + " &8to favorites.");
|
||||
HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue());
|
||||
Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites.");
|
||||
}
|
||||
}));
|
||||
}
|
||||
@ -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.getValues()) {
|
||||
for (Category category : Category.cache) {
|
||||
ItemStack item = getUIItem(category.getName(), category.getItem());
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.setDisplayName(Utils.colorize(category.getColor() + "&l" + category.getName().toUpperCase()));
|
||||
@ -273,7 +273,7 @@ public class InventoryUtils {
|
||||
if (player.hasPermission("headdb.economy.free") || player.hasPermission("headdb.economy." + category + ".free")) return 0;
|
||||
|
||||
// Otherwise, get the price for this category from the config file.
|
||||
return HeadDB.getInstance().getConfiguration().getDouble("economy.cost." + category);
|
||||
return HeadDB.getInstance().getConfig().getDouble("economy.cost." + category);
|
||||
}
|
||||
|
||||
public static boolean processPayment(Player player, int amount, String category, String description) {
|
||||
@ -282,7 +282,7 @@ public class InventoryUtils {
|
||||
// If economy is disabled or no plugin is present, the item is free.
|
||||
// Don't mention receiving it for free in this case, since it is always free.
|
||||
if (economy == null) {
|
||||
player.sendMessage(String.format("You received %d x %s!", amount, description));
|
||||
Utils.sendMessage(player, String.format("&7You received &e%d &7x &e%s!", amount, description));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -292,15 +292,15 @@ public class InventoryUtils {
|
||||
if (cost > 0) {
|
||||
if (economy.has(player, cost)) {
|
||||
economy.withdrawPlayer(player, cost);
|
||||
player.sendMessage(String.format("You purchased %d x %s for %.2f %s!", amount, description, cost, economy.currencyNamePlural()));
|
||||
player.sendMessage(String.format("&7You purchased &e%d &7x &e%s &7for &e%.2f %s!", amount, description, cost, economy.currencyNamePlural()));
|
||||
return true;
|
||||
}
|
||||
player.sendMessage(String.format("You do not have enough %s to purchase %d x %s.", economy.currencyNamePlural(), amount, description));
|
||||
Utils.sendMessage(player, String.format("&7You do not have enough &e%s &cto purchase &e%d &cx &e%s.", economy.currencyNamePlural(), amount, description));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Otherwise, the item is free.
|
||||
player.sendMessage(String.format("You received %d x %s for free!", amount, description));
|
||||
Utils.sendMessage(player, String.format("&7You received &e%d &7x &e%s &7for &efree&7!", amount, description));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -4,19 +4,21 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import tsp.headdb.HeadDB;
|
||||
import tsp.headdb.storage.PlayerDataFile;
|
||||
|
||||
public class JoinListener implements Listener {
|
||||
|
||||
public JoinListener(HeadDB plugin) {
|
||||
// If local heads are disabled, there is no need for this listener.
|
||||
if (HeadDB.getInstance().getConfiguration().getBoolean("localHeads")) {
|
||||
if (HeadDB.getInstance().getConfig().getBoolean("localHeads")) {
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent e) {
|
||||
HeadDB.getInstance().getStorage().getPlayerData().set(e.getPlayer().getUniqueId().toString() + ".username", e.getPlayer().getName());
|
||||
HeadDB.getInstance().getPlayerData().modifyUsername(e.getPlayer().getUniqueId(), e.getPlayer().getName(), PlayerDataFile.ModificationType.SET);
|
||||
HeadDB.getInstance().getPlayerData().save();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ public class MenuListener implements Listener {
|
||||
player.closeInventory();
|
||||
return;
|
||||
}
|
||||
player.sendMessage("Clicked on favorites!");
|
||||
InventoryUtils.openFavoritesMenu(player);
|
||||
return;
|
||||
}
|
||||
|
149
src/main/java/tsp/headdb/storage/PlayerDataFile.java
Normale Datei
149
src/main/java/tsp/headdb/storage/PlayerDataFile.java
Normale Datei
@ -0,0 +1,149 @@
|
||||
package tsp.headdb.storage;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import tsp.headdb.HeadDB;
|
||||
import tsp.headdb.util.Log;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerDataFile {
|
||||
|
||||
private final File file;
|
||||
private JsonObject main;
|
||||
|
||||
public PlayerDataFile(String name) {
|
||||
HeadDB plugin = HeadDB.getInstance();
|
||||
// This check avoids warning in console
|
||||
if (plugin.getResource(name) != null && !new File(plugin.getDataFolder() + "/" + name).exists()) {
|
||||
plugin.saveResource(name, false);
|
||||
}
|
||||
|
||||
this.file = new File(plugin.getDataFolder() + "/" + name);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public List<String> getFavoriteHeadsByTexture(UUID uuid) {
|
||||
List<String> result = new ArrayList<>();
|
||||
|
||||
if (main.has(uuid.toString()) && main.get(uuid.toString()).getAsJsonObject().has("favorites")) {
|
||||
JsonArray favorites = main.get(uuid.toString()).getAsJsonObject().get("favorites").getAsJsonArray();
|
||||
for (int i = 0; i < favorites.size(); i++) {
|
||||
String str = favorites.get(i).toString();
|
||||
Log.debug("str: " + str.substring(1, str.length() - 1));
|
||||
result.add(str.substring(1, str.length() - 1));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void modifyFavorite(UUID uuid, String textureValue, ModificationType modificationType) {
|
||||
JsonObject userObject;
|
||||
if (main.has(uuid.toString())) {
|
||||
userObject = main.get(uuid.toString()).getAsJsonObject();
|
||||
} else {
|
||||
userObject = new JsonObject();
|
||||
}
|
||||
|
||||
JsonArray favorites;
|
||||
if (userObject.has("favorites")) {
|
||||
favorites = userObject.get("favorites").getAsJsonArray();
|
||||
} else {
|
||||
favorites = new JsonArray();
|
||||
}
|
||||
|
||||
JsonPrimitive value = new JsonPrimitive(textureValue);
|
||||
if (modificationType == ModificationType.SET) {
|
||||
if (favorites.contains(value)) {
|
||||
// Head is already in the list, no need to modify it
|
||||
return;
|
||||
}
|
||||
|
||||
favorites.add(value);
|
||||
} else if (modificationType == ModificationType.REMOVE) {
|
||||
if (!favorites.contains(value)) {
|
||||
// Head is not in the list, no need to modify it
|
||||
return;
|
||||
}
|
||||
|
||||
favorites.remove(value);
|
||||
}
|
||||
|
||||
userObject.add("favorites", favorites);
|
||||
main.add(uuid.toString(), userObject);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getUsername(UUID uuid) {
|
||||
return main.get(uuid.toString()).getAsJsonObject().get("username").toString();
|
||||
}
|
||||
|
||||
public Set<String> getEntries() {
|
||||
return main.keySet();
|
||||
}
|
||||
|
||||
public void modifyUsername(UUID uuid, String username, ModificationType modificationType) {
|
||||
JsonObject userObject;
|
||||
if (main.has(uuid.toString())) {
|
||||
userObject = main.get(uuid.toString()).getAsJsonObject();
|
||||
} else {
|
||||
userObject = new JsonObject();
|
||||
}
|
||||
|
||||
if (modificationType == ModificationType.SET) {
|
||||
userObject.addProperty("username", username);
|
||||
} else {
|
||||
userObject.remove("username");
|
||||
}
|
||||
main.add(uuid.toString(), userObject);
|
||||
}
|
||||
|
||||
public void load() {
|
||||
try {
|
||||
main = new JsonParser().parse(new FileReader(file)).getAsJsonObject();
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void save() {
|
||||
FileWriter writer;
|
||||
try {
|
||||
writer = new FileWriter(file);
|
||||
writer.write(main.toString());
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
Log.error("Failed to save player_data.json contents!");
|
||||
Log.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
return file;
|
||||
}
|
||||
|
||||
public void validateFile() {
|
||||
if (!file.exists()) {
|
||||
HeadDB.getInstance().saveResource(file.getName(), false);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ModificationType {
|
||||
SET,
|
||||
REMOVE;
|
||||
}
|
||||
|
||||
}
|
@ -35,7 +35,7 @@ public class Log {
|
||||
}
|
||||
|
||||
public static void log(LogLevel level, String message) {
|
||||
if (level == LogLevel.DEBUG && !HeadDB.getInstance().getStorage().getConfig().getBoolean("debug")) {
|
||||
if (level == LogLevel.DEBUG && !HeadDB.getInstance().getConfig().getBoolean("debug")) {
|
||||
return;
|
||||
}
|
||||
Bukkit.getConsoleSender().sendMessage(Utils.colorize("&7[&9&l" + name + "&7] " + level.getColor() + "[" + level.name() + "]: " + message));
|
||||
|
@ -1,27 +0,0 @@
|
||||
package tsp.headdb.util;
|
||||
|
||||
import de.leonhard.storage.Config;
|
||||
import de.leonhard.storage.Json;
|
||||
import de.leonhard.storage.LightningBuilder;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class Storage {
|
||||
|
||||
private Config config;
|
||||
private Json playerdata;
|
||||
|
||||
public Storage init(JavaPlugin plugin) {
|
||||
config = LightningBuilder.fromPath("config.yml", plugin.getDataFolder().getAbsolutePath()).createConfig().addDefaultsFromInputStream();
|
||||
playerdata = LightningBuilder.fromPath("playerdata.json", plugin.getDataFolder().getAbsolutePath()).createJson();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Config getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public Json getPlayerData() {
|
||||
return playerdata;
|
||||
}
|
||||
|
||||
}
|
@ -24,7 +24,7 @@ public class Utils {
|
||||
}
|
||||
|
||||
public static String colorize(String string) {
|
||||
return ChatColor.translateAlternateColorCodes('&', ChatColor.GRAY + string);
|
||||
return ChatColor.translateAlternateColorCodes('&', string);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,13 +1,7 @@
|
||||
# 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: true
|
||||
|
||||
# If the cached heads are older than these amount of seconds, the plugin will refresh the database
|
||||
# How often the database should be updated in seconds.
|
||||
refresh: 3600
|
||||
|
||||
# If local heads should be enabled. Only keeps track of joined players when enabled!
|
||||
# If local heads should be enabled. Only starts keeping track of joined players when enabled!
|
||||
localHeads: true
|
||||
|
||||
# Economy options
|
||||
|
1
src/main/resources/player_data.json
Normale Datei
1
src/main/resources/player_data.json
Normale Datei
@ -0,0 +1 @@
|
||||
{}
|
@ -11,7 +11,7 @@ commands:
|
||||
headdb:
|
||||
usage: /headdb <arguments>
|
||||
description: Open the database
|
||||
aliases: [hdb, headdatabase]
|
||||
aliases: [hdb, headdatabase, headmenu]
|
||||
|
||||
permissions:
|
||||
headdb.admin:
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren