From e28d6c4e34f2a9bcab563c39373c2a347f6b9c1e Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 15 May 2022 22:39:08 +0200 Subject: [PATCH] Started using data lock --- .../java/com/alttd/GUI/windows/BuyGUI.java | 4 ++ .../java/com/alttd/GUI/windows/SellGUI.java | 2 +- src/main/java/com/alttd/VillagerUI.java | 9 +++- .../commands/subcommands/CommandBuy.java | 6 ++- .../commands/subcommands/CommandPoints.java | 8 ++- .../commands/subcommands/CommandSell.java | 6 ++- src/main/java/com/alttd/config/Config.java | 2 + .../java/com/alttd/events/LoginEvent.java | 24 +-------- .../java/com/alttd/events/LogoutEvent.java | 18 ++++++- .../alttd/events/PluginMessageListener.java | 53 ++++++++++++++++++- .../java/com/alttd/events/VillagerEvents.java | 2 +- src/main/java/com/alttd/objects/EconUser.java | 29 ++++------ src/main/java/com/alttd/util/Utilities.java | 5 -- 13 files changed, 109 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/alttd/GUI/windows/BuyGUI.java b/src/main/java/com/alttd/GUI/windows/BuyGUI.java index 43e487f..1da1650 100644 --- a/src/main/java/com/alttd/GUI/windows/BuyGUI.java +++ b/src/main/java/com/alttd/GUI/windows/BuyGUI.java @@ -64,6 +64,10 @@ public class BuyGUI extends GUIMerchant { int itemPts = price.getPoints(); int transPts = itemPts * amount; EconUser econUser = EconUser.getUser(player.getUniqueId()); + if (econUser == null) { + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); + return; + } int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0); double cost = price.calculatePriceThing(oldPoints, transPts, true, itemPts); diff --git a/src/main/java/com/alttd/GUI/windows/SellGUI.java b/src/main/java/com/alttd/GUI/windows/SellGUI.java index 3711075..1583e94 100644 --- a/src/main/java/com/alttd/GUI/windows/SellGUI.java +++ b/src/main/java/com/alttd/GUI/windows/SellGUI.java @@ -65,7 +65,7 @@ public class SellGUI extends GUIMerchant { private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) { EconUser econUser = EconUser.getUser(player.getUniqueId()); if (econUser == null) { - Utilities.econSyncingMessage(player); + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); return; } diff --git a/src/main/java/com/alttd/VillagerUI.java b/src/main/java/com/alttd/VillagerUI.java index 7b83b03..5c0592c 100644 --- a/src/main/java/com/alttd/VillagerUI.java +++ b/src/main/java/com/alttd/VillagerUI.java @@ -44,8 +44,13 @@ 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()); + getServer().getMessenger().registerOutgoingPluginChannel(this, "villagerui:player-data"); + getServer().getMessenger().registerIncomingPluginChannel(this, "villagerui:player-data", new PluginMessageListener()); + if (Config.DEBUG) { + Logger.info("Incoming: %\nOutgoing: %", + getServer().getMessenger().getIncomingChannels().toString(), + getServer().getMessenger().getOutgoingChannels().toString()); + } Logger.info("--------------------------------------------------"); Logger.info("Villager UI started"); Logger.info("--------------------------------------------------"); diff --git a/src/main/java/com/alttd/commands/subcommands/CommandBuy.java b/src/main/java/com/alttd/commands/subcommands/CommandBuy.java index a72ec6e..cd70ad9 100644 --- a/src/main/java/com/alttd/commands/subcommands/CommandBuy.java +++ b/src/main/java/com/alttd/commands/subcommands/CommandBuy.java @@ -37,6 +37,11 @@ public class CommandBuy extends SubCommand { player.sendMiniMessage(getHelpMessage(), null); return true; } + EconUser user = EconUser.getUser(player.getUniqueId()); + if (user == null) { + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); + return true; + } Material item = Material.valueOf(args[1].toUpperCase()); Optional optionalVillagerType = VillagerType.getVillagerTypes().stream() .filter(villagerType -> villagerType.getBuying().stream() @@ -53,7 +58,6 @@ public class CommandBuy extends SubCommand { Logger.warning("Price was null despite being impossible to be null"); return true; } - EconUser user = EconUser.getUser(player.getUniqueId()); Integer curPoints = user.getPointsMap().getOrDefault(villagerType.getName(), 0); double cost = price.calculatePriceThing(curPoints, price.getPoints(), true, price.getPoints()); player.sendMiniMessage(Config.BUY_ITEM_MESSAGE, TagResolver.resolver( diff --git a/src/main/java/com/alttd/commands/subcommands/CommandPoints.java b/src/main/java/com/alttd/commands/subcommands/CommandPoints.java index 1305c7d..5201936 100644 --- a/src/main/java/com/alttd/commands/subcommands/CommandPoints.java +++ b/src/main/java/com/alttd/commands/subcommands/CommandPoints.java @@ -29,9 +29,13 @@ public class CommandPoints extends SubCommand { return true; } EconUser user = EconUser.getUser(player.getUniqueId()); + if (user == null) { + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); + return true; + } var ref = new Object() { - Component message = miniMessage.deserialize(Config.POINTS_HEADER, TemplateResolver.resolving( - Template.template("player", player.getName()))); + Component message = miniMessage.deserialize(Config.POINTS_HEADER, TagResolver.resolver( + Placeholder.unparsed("player", player.getName()))); }; if (args.length == 1) { Object2ObjectArrayMap pointsMap = user.getPointsMap(); diff --git a/src/main/java/com/alttd/commands/subcommands/CommandSell.java b/src/main/java/com/alttd/commands/subcommands/CommandSell.java index abd0149..dc7d892 100644 --- a/src/main/java/com/alttd/commands/subcommands/CommandSell.java +++ b/src/main/java/com/alttd/commands/subcommands/CommandSell.java @@ -37,6 +37,11 @@ public class CommandSell extends SubCommand { player.sendMiniMessage(getHelpMessage(), null); return true; } + EconUser user = EconUser.getUser(player.getUniqueId()); + if (user == null) { + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); + return true; + } Material item = Material.valueOf(args[1].toUpperCase()); Optional optionalVillagerType = VillagerType.getVillagerTypes().stream() .filter(villagerType -> villagerType.getSelling().stream() @@ -53,7 +58,6 @@ public class CommandSell extends SubCommand { Logger.warning("Price was null despite being impossible to be null"); return true; } - EconUser user = EconUser.getUser(player.getUniqueId()); Integer curPoints = user.getPointsMap().getOrDefault(villagerType.getName(), 0); double cost = price.calculatePriceThing(curPoints, price.getPoints(), false, price.getPoints()); player.sendMiniMessage(Config.SELL_ITEM_MESSAGE, TagResolver.resolver( diff --git a/src/main/java/com/alttd/config/Config.java b/src/main/java/com/alttd/config/Config.java index 75ca9a0..f74a647 100644 --- a/src/main/java/com/alttd/config/Config.java +++ b/src/main/java/com/alttd/config/Config.java @@ -117,6 +117,7 @@ public final class Config extends AbstractConfig { "at your current amount of points ()."; public static String NO_SELL_AT_SPAWN = " can not be sold to spawn, try a player shop!"; public static String NOT_A_VILLAGER = " is not a valid villager type."; + public static String LOADING_ECON_DATA = "Loading your economy data, please wait..."; private static void loadMessages() { NOT_ENOUGH_MONEY = config.getString("messages.not-enough-money", NOT_ENOUGH_MONEY); @@ -132,6 +133,7 @@ public final class Config extends AbstractConfig { SELL_ITEM_MESSAGE = config.getString("messages.sell-item-message", SELL_ITEM_MESSAGE); NO_SELL_AT_SPAWN = config.getString("messages.no-sell-at-spawn", NO_SELL_AT_SPAWN); NOT_A_VILLAGER = config.getString("messages.not-a-villager", NOT_A_VILLAGER); + LOADING_ECON_DATA = config.getString("messages.loading-econ-data", LOADING_ECON_DATA); } public static boolean DEBUG = false; diff --git a/src/main/java/com/alttd/events/LoginEvent.java b/src/main/java/com/alttd/events/LoginEvent.java index 90d79f0..a67099d 100644 --- a/src/main/java/com/alttd/events/LoginEvent.java +++ b/src/main/java/com/alttd/events/LoginEvent.java @@ -1,35 +1,13 @@ package com.alttd.events; -import com.alttd.VillagerUI; -import com.alttd.config.Config; -import com.alttd.database.Queries; import com.alttd.objects.EconUser; -import com.alttd.util.Logger; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.UUID; 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() { - UUID uuid = player.getUniqueId(); - EconUser user = EconUser.getUser(uuid); - int minutes = Queries.getMinutesSinceUpdated(uuid); - - user.removePoints(minutes * 2); - if (Config.DEBUG) - Logger.info("Loaded EconUser for % and removed % points", - player.getName(), String.valueOf(minutes * 2)); - } - }.runTask(VillagerUI.getInstance()); + EconUser.tryLoadUser(event.getPlayer().getUniqueId()); } } diff --git a/src/main/java/com/alttd/events/LogoutEvent.java b/src/main/java/com/alttd/events/LogoutEvent.java index 221f6cc..996215c 100644 --- a/src/main/java/com/alttd/events/LogoutEvent.java +++ b/src/main/java/com/alttd/events/LogoutEvent.java @@ -1,12 +1,17 @@ package com.alttd.events; import com.alttd.GUI.GUI; +import com.alttd.VillagerUI; import com.alttd.config.Config; import com.alttd.objects.EconUser; import com.alttd.util.Logger; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; @@ -17,8 +22,17 @@ public class LogoutEvent implements Listener { if (Config.DEBUG) Logger.info("Syncing %", event.getPlayer().getName()); - EconUser.getUser(uuid).syncPoints(); - EconUser.removeUser(uuid); GUI.GUIByUUID.remove(uuid); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("try-unlock"); + out.writeUTF(uuid.toString()); + Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(), + "villagerui:player-data", + out.toByteArray()); + EconUser user = EconUser.getUser(uuid); + if (user == null) + return; + user.syncPoints(); + EconUser.removeUser(uuid); } } diff --git a/src/main/java/com/alttd/events/PluginMessageListener.java b/src/main/java/com/alttd/events/PluginMessageListener.java index 5579313..90cf988 100644 --- a/src/main/java/com/alttd/events/PluginMessageListener.java +++ b/src/main/java/com/alttd/events/PluginMessageListener.java @@ -1,22 +1,73 @@ package com.alttd.events; +import com.alttd.VillagerUI; +import com.alttd.config.Config; +import com.alttd.database.Queries; +import com.alttd.objects.EconUser; import com.alttd.util.Logger; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + 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")) { + if (!channel.equals("villagerui:player-data")) { Logger.warning("Received plugin message on invalid channel"); return; } ByteArrayDataInput in = ByteStreams.newDataInput(bytes); switch (in.readUTF()) { + case "try-lock-result" -> { + if (!in.readBoolean()) { + Logger.warning("Unable to lock row"); + return; //TODO handle + } + UUID uuid = UUID.fromString(in.readUTF()); + loadUser(uuid); + } + case "queue-lock-failed" -> Logger.warning("Encountered uuid that was locked and had a lock queued: %, lock is from %", in.readUTF(), in.readUTF()); + case "try-unlock-result" -> { + if (in.readBoolean()) { + // ignore? + return; + } + Logger.severe("Unable to unlock %.", in.readUTF()); + } + case "locked-queue-lock" -> { + if (!in.readBoolean()) { + Logger.warning("Got false back from locked queue lock"); + return; //TODO handle + } + UUID uuid = UUID.fromString(in.readUTF()); + loadUser(uuid); + } + case "check-lock-result" -> { + } } } + + private 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.addUser(uuid, user); + EconUser.removeQueriedUser(uuid); + } + }.runTaskAsynchronously(VillagerUI.getInstance()); + } } diff --git a/src/main/java/com/alttd/events/VillagerEvents.java b/src/main/java/com/alttd/events/VillagerEvents.java index 1d43695..3b6035d 100644 --- a/src/main/java/com/alttd/events/VillagerEvents.java +++ b/src/main/java/com/alttd/events/VillagerEvents.java @@ -42,7 +42,7 @@ public class VillagerEvents implements Listener { } EconUser user = EconUser.getUser(player.getUniqueId()); if (user == null) { - Utilities.econSyncingMessage(player); + player.sendMiniMessage(Config.LOADING_ECON_DATA, null); return; } new BukkitRunnable() { diff --git a/src/main/java/com/alttd/objects/EconUser.java b/src/main/java/com/alttd/objects/EconUser.java index 74273f9..bbf712c 100644 --- a/src/main/java/com/alttd/objects/EconUser.java +++ b/src/main/java/com/alttd/objects/EconUser.java @@ -30,6 +30,14 @@ public class EconUser { Logger.info("Created EconUser for: %", uuid.toString()); } + public static void addUser(UUID uuid, EconUser user) { + users.put(uuid, user); + } + + public static void removeQueriedUser(UUID uuid) { + queriedUsers.remove(uuid); + } + public UUID getUuid() { return uuid; } @@ -116,31 +124,12 @@ public class EconUser { out.writeUTF("try-lock"); out.writeUTF(uuid.toString()); Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(), - "VillagerUI:player-data", + "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) { users.remove(uuid); } diff --git a/src/main/java/com/alttd/util/Utilities.java b/src/main/java/com/alttd/util/Utilities.java index 6bae718..5e1618c 100644 --- a/src/main/java/com/alttd/util/Utilities.java +++ b/src/main/java/com/alttd/util/Utilities.java @@ -138,9 +138,4 @@ public class Utilities { } return (price); } - - public static void econSyncingMessage(Player player) - { - player.sendMiniMessage("Syncing econ data...", null); - } }