From bd8c6f414c1e16a4794c7af642746c7ade8b79ff Mon Sep 17 00:00:00 2001 From: Stijn Date: Wed, 11 May 2022 22:01:22 +0200 Subject: [PATCH] Started work on using data-lock for database queries --- .../java/com/alttd/GUI/windows/SellGUI.java | 8 ++- src/main/java/com/alttd/VillagerUI.java | 2 + src/main/java/com/alttd/database/Queries.java | 2 +- .../java/com/alttd/events/LoginEvent.java | 1 + .../alttd/events/PluginMessageListener.java | 22 ++++++++ .../java/com/alttd/events/VillagerEvents.java | 17 ++++-- src/main/java/com/alttd/objects/EconUser.java | 54 +++++++++++++++---- src/main/java/com/alttd/util/Utilities.java | 6 +++ 8 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/alttd/events/PluginMessageListener.java diff --git a/src/main/java/com/alttd/GUI/windows/SellGUI.java b/src/main/java/com/alttd/GUI/windows/SellGUI.java index 6ba07f6..3711075 100644 --- a/src/main/java/com/alttd/GUI/windows/SellGUI.java +++ b/src/main/java/com/alttd/GUI/windows/SellGUI.java @@ -63,15 +63,19 @@ public class SellGUI extends GUIMerchant { } private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) { - PlayerInventory inventory = player.getInventory(); + EconUser econUser = EconUser.getUser(player.getUniqueId()); + if (econUser == null) { + Utilities.econSyncingMessage(player); + return; + } + PlayerInventory inventory = player.getInventory(); if (bulk) amount = Arrays.stream(inventory.getContents()) .filter(Objects::nonNull) .filter(itemStack -> itemStack.getType().equals(material)) .mapToInt(ItemStack::getAmount).sum(); - EconUser econUser = EconUser.getUser(player.getUniqueId()); int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0); int itemPts = price.getPoints(); int transPts = (itemPts * amount) * -1; diff --git a/src/main/java/com/alttd/VillagerUI.java b/src/main/java/com/alttd/VillagerUI.java index aacff8a..7b83b03 100644 --- a/src/main/java/com/alttd/VillagerUI.java +++ b/src/main/java/com/alttd/VillagerUI.java @@ -44,6 +44,8 @@ public class VillagerUI extends JavaPlugin { return; Database.getDatabase().init(); scheduleTasks(); + getServer().getMessenger().registerOutgoingPluginChannel(this, "VillagerUI:player-data"); + getServer().getMessenger().registerIncomingPluginChannel(this, "VillagerUI:player-data", new PluginMessageListener()); Logger.info("--------------------------------------------------"); Logger.info("Villager UI started"); Logger.info("--------------------------------------------------"); diff --git a/src/main/java/com/alttd/database/Queries.java b/src/main/java/com/alttd/database/Queries.java index 55f0635..e484365 100644 --- a/src/main/java/com/alttd/database/Queries.java +++ b/src/main/java/com/alttd/database/Queries.java @@ -74,7 +74,7 @@ public class Queries { } catch (SQLException e) { e.printStackTrace(); } - return (null); + return (new EconUser(uuid, new Object2ObjectArrayMap<>())); } /** diff --git a/src/main/java/com/alttd/events/LoginEvent.java b/src/main/java/com/alttd/events/LoginEvent.java index 4db8204..90d79f0 100644 --- a/src/main/java/com/alttd/events/LoginEvent.java +++ b/src/main/java/com/alttd/events/LoginEvent.java @@ -17,6 +17,7 @@ public class LoginEvent implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { final Player player = event.getPlayer(); + //TODO lock user new BukkitRunnable() { @Override public void run() { diff --git a/src/main/java/com/alttd/events/PluginMessageListener.java b/src/main/java/com/alttd/events/PluginMessageListener.java new file mode 100644 index 0000000..5579313 --- /dev/null +++ b/src/main/java/com/alttd/events/PluginMessageListener.java @@ -0,0 +1,22 @@ +package com.alttd.events; + +import com.alttd.util.Logger; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener { + + @Override + public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) { + if (!channel.equals("VillagerUI:player-data")) { + Logger.warning("Received plugin message on invalid channel"); + return; + } + ByteArrayDataInput in = ByteStreams.newDataInput(bytes); + switch (in.readUTF()) { + + } + } +} diff --git a/src/main/java/com/alttd/events/VillagerEvents.java b/src/main/java/com/alttd/events/VillagerEvents.java index 61fd700..1d43695 100644 --- a/src/main/java/com/alttd/events/VillagerEvents.java +++ b/src/main/java/com/alttd/events/VillagerEvents.java @@ -7,7 +7,10 @@ import com.alttd.config.VillagerConfig; import com.alttd.objects.EconUser; import com.alttd.objects.LoadedVillagers; import com.alttd.objects.VillagerType; +import com.alttd.util.Utilities; +import jdk.jshell.execution.Util; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -31,19 +34,25 @@ public class VillagerEvents implements Listener { if (loadedVillager == null) return; + Player player = event.getPlayer(); event.setCancelled(true); - if (!event.getPlayer().hasPermission(loadedVillager.getPermission())) { - event.getPlayer().sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message? + if (!player.hasPermission(loadedVillager.getPermission())) { + player.sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message? + return; + } + EconUser user = EconUser.getUser(player.getUniqueId()); + if (user == null) { + Utilities.econSyncingMessage(player); return; } new BukkitRunnable() { @Override public void run() { - OpenGUI openGUI = new OpenGUI(loadedVillager, EconUser.getUser(event.getPlayer().getUniqueId())); + OpenGUI openGUI = new OpenGUI(loadedVillager, user); new BukkitRunnable() { @Override public void run() { - openGUI.open(event.getPlayer()); + openGUI.open(player); } }.runTask(VillagerUI.getInstance()); } diff --git a/src/main/java/com/alttd/objects/EconUser.java b/src/main/java/com/alttd/objects/EconUser.java index 3bd416d..74273f9 100644 --- a/src/main/java/com/alttd/objects/EconUser.java +++ b/src/main/java/com/alttd/objects/EconUser.java @@ -4,13 +4,16 @@ import com.alttd.VillagerUI; import com.alttd.config.Config; import com.alttd.database.Queries; import com.alttd.util.Logger; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.Unmodifiable; -import java.util.Collections; -import java.util.List; -import java.util.UUID; +import java.io.ByteArrayOutputStream; +import java.util.*; public class EconUser { @@ -96,13 +99,46 @@ public class EconUser { }); } + //Can return null public static EconUser getUser(UUID uuid) { - EconUser user = users.get(uuid); - if (user == null) { - user = Queries.getEconUser(uuid); - EconUser.users.put(uuid, user); - } - return (user); + return (users.get(uuid)); + } + + private static HashSet queriedUsers = new HashSet<>(); + public static void tryLoadUser(UUID uuid) { + if (queriedUsers.contains(uuid) && !users.containsKey(uuid)) + return; + queriedUsers.add(uuid); + new BukkitRunnable() { + @Override + public void run() { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("try-lock"); + out.writeUTF(uuid.toString()); + Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(), + "VillagerUI:player-data", + out.toByteArray()); + } + }.runTaskAsynchronously(VillagerUI.getInstance()); + } + + //Might need to be locked down better? + public static void loadUser(UUID uuid) { + new BukkitRunnable() { + @Override + public void run() { + EconUser user = Queries.getEconUser(uuid); + + int minutes = Queries.getMinutesSinceUpdated(uuid); + user.removePoints(minutes * 2); + if (Config.DEBUG) + Logger.info("Loaded EconUser for % and removed % points", + uuid.toString(), String.valueOf(minutes * 2)); + + EconUser.users.put(uuid, user); + queriedUsers.remove(uuid); + } + }.runTaskAsynchronously(VillagerUI.getInstance()); } public static void removeUser(UUID uuid) { diff --git a/src/main/java/com/alttd/util/Utilities.java b/src/main/java/com/alttd/util/Utilities.java index c060449..6bae718 100644 --- a/src/main/java/com/alttd/util/Utilities.java +++ b/src/main/java/com/alttd/util/Utilities.java @@ -4,6 +4,7 @@ import com.alttd.objects.Price; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.inventory.*; import java.util.List; @@ -137,4 +138,9 @@ public class Utilities { } return (price); } + + public static void econSyncingMessage(Player player) + { + player.sendMiniMessage("Syncing econ data...", null); + } }