From dd4177e7cb50396c006530d39099ca38993b6a13 Mon Sep 17 00:00:00 2001 From: Phoenix616 Date: Wed, 29 Aug 2018 21:29:27 +0100 Subject: [PATCH] Query server's player cache for missing players This uses a cache for players that we haven't found before so to not check the cache too often and also checks if the online mode of the queried OfflinePlayer matches the server's mode (gotten from the first logged-in player in order to be compatible with BungeeCord requiring the server to be in offline-mode. --- .../Breeze/Collection/SimpleCache.java | 2 +- .../Listeners/Player/PlayerConnect.java | 4 ++ .../Acrobot/ChestShop/UUIDs/NameManager.java | 59 +++++++++++++------ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/Acrobot/Breeze/Collection/SimpleCache.java b/src/main/java/com/Acrobot/Breeze/Collection/SimpleCache.java index aad76d96..cb9b5838 100644 --- a/src/main/java/com/Acrobot/Breeze/Collection/SimpleCache.java +++ b/src/main/java/com/Acrobot/Breeze/Collection/SimpleCache.java @@ -40,7 +40,7 @@ public class SimpleCache { } } - private boolean contains(K key) { + public boolean contains(K key) { return map.containsKey(key); } } 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 643be6c2..a69b70a0 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerConnect.java @@ -17,6 +17,10 @@ public class PlayerConnect implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public static void onPlayerConnect(final PlayerJoinEvent event) { + if (NameManager.getUuidVersion() < 0) { + NameManager.setUuidVersion(event.getPlayer().getUniqueId().version()); + } + final PlayerDTO playerDTO = new PlayerDTO(event.getPlayer()); Bukkit.getScheduler().runTaskAsynchronously(ChestShop.getPlugin(), new Runnable() { diff --git a/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java b/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java index 4f6ef53a..d4b2ea1f 100644 --- a/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java +++ b/src/main/java/com/Acrobot/ChestShop/UUIDs/NameManager.java @@ -34,9 +34,11 @@ public class NameManager { private static SimpleCache usernameToAccount = new SimpleCache<>(Properties.CACHE_SIZE); private static SimpleCache uuidToAccount = new SimpleCache<>(Properties.CACHE_SIZE); private static SimpleCache shortToAccount = new SimpleCache<>(Properties.CACHE_SIZE); + private static SimpleCache invalidPlayers = new SimpleCache<>(Properties.CACHE_SIZE); private static Account adminAccount; private static Account serverEconomyAccount; + private static int uuidVersion = -1; /** * Get account info from a UUID @@ -102,26 +104,38 @@ public class NameManager { */ public static Account getAccountFromShortName(String shortName) { Validate.notEmpty(shortName, "shortName cannot be null or empty!"); + Account account = null; + if (shortName.length() > 15) { - return getAccount(shortName); + account = getAccount(shortName); + } else { + try { + account = shortToAccount.get(shortName, () -> { + try { + Account a = accounts.queryBuilder().where().eq("shortName", shortName).queryForFirst(); + if (a != null) { + a.setShortName(shortName); // HOW IS IT EVEN POSSIBLE THAT THE NAME IS NOT SET EVEN IF WE HAVE FOUND THE PLAYER?! + return a; + } + } catch (SQLException e) { + ChestShop.getBukkitLogger().log(Level.WARNING, "Error while getting account for " + shortName + ":", e); + } + throw new Exception("Could not find account for " + shortName); + }); + } catch (ExecutionException ignored) {} } - try { - return shortToAccount.get(shortName, () -> { - try { - Account account = accounts.queryBuilder().where().eq("shortName", shortName).queryForFirst(); - if (account != null) { - account.setShortName(shortName); // HOW IS IT EVEN POSSIBLE THAT THE NAME IS NOT SET EVEN IF WE HAVE FOUND THE PLAYER?! - return account; - } - } catch (SQLException e) { - ChestShop.getBukkitLogger().log(Level.WARNING, "Error while getting account for " + shortName + ":", e); - } - throw new Exception("Could not find account for " + shortName); - }); - } catch (ExecutionException ignored) { - return null; + if (account == null && !invalidPlayers.contains(shortName.toLowerCase())) { + // no account with that shortname was found, try to get an offline player with that name + OfflinePlayer offlinePlayer = ChestShop.getBukkitServer().getOfflinePlayer(shortName); + if (offlinePlayer != null && offlinePlayer.getName() != null && offlinePlayer.getUniqueId() != null + && offlinePlayer.getUniqueId().version() == uuidVersion) { + account = storeUsername(new PlayerDTO(offlinePlayer.getUniqueId(), offlinePlayer.getName())); + } else { + invalidPlayers.put(shortName.toLowerCase(), true); + } } + return account; } /** @@ -222,8 +236,9 @@ public class NameManager { * Store the username of a player into the database and the username-uuid cache * * @param player The data transfer object of the player to store + * @return The stored/updated account. null if there was an error updating it */ - public static void storeUsername(final PlayerDTO player) { + public static Account storeUsername(final PlayerDTO player) { final UUID uuid = player.getUniqueId(); Account latestAccount = null; @@ -243,11 +258,14 @@ public class NameManager { accounts.createOrUpdate(latestAccount); } catch (SQLException e) { ChestShop.getBukkitLogger().log(Level.WARNING, "Error while updating account " + latestAccount + ":", e); + return null; } usernameToAccount.put(latestAccount.getName(), latestAccount); uuidToAccount.put(uuid, latestAccount); shortToAccount.put(latestAccount.getShortName(), latestAccount); + + return latestAccount; } /** @@ -317,4 +335,11 @@ public class NameManager { return serverEconomyAccount; } + public static void setUuidVersion(int uuidVersion) { + NameManager.uuidVersion = uuidVersion; + } + + public static int getUuidVersion() { + return uuidVersion; + } }