From 7bc452e203071fac82cc87c0df0e457715d07e1b Mon Sep 17 00:00:00 2001 From: Andrzej Pomirski Date: Sun, 5 Jul 2015 21:56:42 +0200 Subject: [PATCH] Switch to thread-safe DTOs --- .../Listeners/Player/PlayerConnect.java | 9 +++- .../Acrobot/ChestShop/UUIDs/NameManager.java | 9 +++- .../Acrobot/ChestShop/UUIDs/PlayerDTO.java | 42 +++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/Acrobot/ChestShop/UUIDs/PlayerDTO.java diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java index 8e7c9df..931494a 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java @@ -2,8 +2,10 @@ package com.Acrobot.ChestShop.Listeners.Player; import com.Acrobot.ChestShop.ChestShop; import com.Acrobot.ChestShop.UUIDs.NameManager; +import com.Acrobot.ChestShop.UUIDs.PlayerDTO; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; @@ -11,12 +13,15 @@ import org.bukkit.event.player.PlayerJoinEvent; * @author Acrobot */ public class PlayerConnect implements Listener { - @EventHandler + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public static void onPlayerConnect(final PlayerJoinEvent event) { + final PlayerDTO playerDTO = new PlayerDTO(event.getPlayer()); + Bukkit.getScheduler().runTaskAsynchronously(ChestShop.getPlugin(), new Runnable() { @Override public void run() { - NameManager.storeUsername(event.getPlayer()); + NameManager.storeUsername(playerDTO); } }); } diff --git a/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java b/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java index be3cdd6..ce6eabd 100644 --- a/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java +++ b/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java @@ -160,7 +160,7 @@ public class NameManager { return name; } - public static void storeUsername(final Player player) { + public static void storeUsername(final PlayerDTO player) { final UUID uuid = player.getUniqueId(); Account account = null; @@ -173,6 +173,13 @@ public class NameManager { } if (account != null) { + if (account.getName() != null && account.getShortName() == null) { + String shortenedName = NameUtil.stripUsername(account.getName()); + + account.setShortName(shortenedName); + } + + account.setUuid(uuid); //HOW IS IT EVEN POSSIBLE THAT UUID IS NOT SET EVEN IF WE HAVE FOUND THE PLAYER?! account.setLastSeenName(player.getName()); try { diff --git a/src/main/java/com/Acrobot/ChestShop/UUIDs/PlayerDTO.java b/src/main/java/com/Acrobot/ChestShop/UUIDs/PlayerDTO.java new file mode 100644 index 0000000..60ced8f --- /dev/null +++ b/src/main/java/com/Acrobot/ChestShop/UUIDs/PlayerDTO.java @@ -0,0 +1,42 @@ +package com.Acrobot.ChestShop.UUIDs; + +import org.bukkit.entity.Player; + +import java.util.UUID; + +/** + * Data Transfer Object for Player objects + * + * Since Bukkit API is not thread-safe, this should work + * @author Andrzej Pomirski + */ +public class PlayerDTO { + private UUID uniqueId; + private String name; + + public PlayerDTO(UUID uuid, String name) { + this.uniqueId = uuid; + this.name = name; + } + + public PlayerDTO(Player player) { + this.uniqueId = player.getUniqueId(); + this.name = player.getName(); + } + + public UUID getUniqueId() { + return uniqueId; + } + + public void setUniqueId(UUID uniqueId) { + this.uniqueId = uniqueId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +}