Started work on using data-lock for database queries

This commit is contained in:
Stijn 2022-05-11 22:01:22 +02:00
parent 82fbe5370c
commit bd8c6f414c
8 changed files with 96 additions and 16 deletions

View File

@ -63,15 +63,19 @@ public class SellGUI extends GUIMerchant {
} }
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) { 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) if (bulk)
amount = Arrays.stream(inventory.getContents()) amount = Arrays.stream(inventory.getContents())
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(itemStack -> itemStack.getType().equals(material)) .filter(itemStack -> itemStack.getType().equals(material))
.mapToInt(ItemStack::getAmount).sum(); .mapToInt(ItemStack::getAmount).sum();
EconUser econUser = EconUser.getUser(player.getUniqueId());
int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0); int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0);
int itemPts = price.getPoints(); int itemPts = price.getPoints();
int transPts = (itemPts * amount) * -1; int transPts = (itemPts * amount) * -1;

View File

@ -44,6 +44,8 @@ public class VillagerUI extends JavaPlugin {
return; return;
Database.getDatabase().init(); Database.getDatabase().init();
scheduleTasks(); scheduleTasks();
getServer().getMessenger().registerOutgoingPluginChannel(this, "VillagerUI:player-data");
getServer().getMessenger().registerIncomingPluginChannel(this, "VillagerUI:player-data", new PluginMessageListener());
Logger.info("--------------------------------------------------"); Logger.info("--------------------------------------------------");
Logger.info("Villager UI started"); Logger.info("Villager UI started");
Logger.info("--------------------------------------------------"); Logger.info("--------------------------------------------------");

View File

@ -74,7 +74,7 @@ public class Queries {
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
return (null); return (new EconUser(uuid, new Object2ObjectArrayMap<>()));
} }
/** /**

View File

@ -17,6 +17,7 @@ public class LoginEvent implements Listener {
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
//TODO lock user
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {

View File

@ -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()) {
}
}
}

View File

@ -7,7 +7,10 @@ import com.alttd.config.VillagerConfig;
import com.alttd.objects.EconUser; import com.alttd.objects.EconUser;
import com.alttd.objects.LoadedVillagers; import com.alttd.objects.LoadedVillagers;
import com.alttd.objects.VillagerType; import com.alttd.objects.VillagerType;
import com.alttd.util.Utilities;
import jdk.jshell.execution.Util;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -31,19 +34,25 @@ public class VillagerEvents implements Listener {
if (loadedVillager == null) if (loadedVillager == null)
return; return;
Player player = event.getPlayer();
event.setCancelled(true); event.setCancelled(true);
if (!event.getPlayer().hasPermission(loadedVillager.getPermission())) { if (!player.hasPermission(loadedVillager.getPermission())) {
event.getPlayer().sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message? player.sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message?
return;
}
EconUser user = EconUser.getUser(player.getUniqueId());
if (user == null) {
Utilities.econSyncingMessage(player);
return; return;
} }
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
OpenGUI openGUI = new OpenGUI(loadedVillager, EconUser.getUser(event.getPlayer().getUniqueId())); OpenGUI openGUI = new OpenGUI(loadedVillager, user);
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
openGUI.open(event.getPlayer()); openGUI.open(player);
} }
}.runTask(VillagerUI.getInstance()); }.runTask(VillagerUI.getInstance());
} }

View File

@ -4,13 +4,16 @@ import com.alttd.VillagerUI;
import com.alttd.config.Config; import com.alttd.config.Config;
import com.alttd.database.Queries; import com.alttd.database.Queries;
import com.alttd.util.Logger; 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 it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.Unmodifiable; import org.jetbrains.annotations.Unmodifiable;
import java.util.Collections; import java.io.ByteArrayOutputStream;
import java.util.List; import java.util.*;
import java.util.UUID;
public class EconUser { public class EconUser {
@ -96,13 +99,46 @@ public class EconUser {
}); });
} }
//Can return null
public static EconUser getUser(UUID uuid) { public static EconUser getUser(UUID uuid) {
EconUser user = users.get(uuid); return (users.get(uuid));
if (user == null) { }
user = Queries.getEconUser(uuid);
EconUser.users.put(uuid, user); private static HashSet<UUID> queriedUsers = new HashSet<>();
} public static void tryLoadUser(UUID uuid) {
return (user); 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) { public static void removeUser(UUID uuid) {

View File

@ -4,6 +4,7 @@ import com.alttd.objects.Price;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.*; import org.bukkit.inventory.*;
import java.util.List; import java.util.List;
@ -137,4 +138,9 @@ public class Utilities {
} }
return (price); return (price);
} }
public static void econSyncingMessage(Player player)
{
player.sendMiniMessage("<red>Syncing econ data...</red>", null);
}
} }