Skip to content

Commit 208c143

Browse files
PlayerFinder: Force cached all offline players when its amount > 2k
1 parent 64b18c7 commit 208c143

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

src/main/java/org/maxgamer/quickshop/QuickShop.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,11 @@ public void run() {
11441144
if (getConfig().getBoolean("purge.at-server-startup")) {
11451145
shopPurger.purge();
11461146
}
1147+
//Detect and do offline player name to uuid caching
1148+
OfflinePlayer[] offlinePlayers = getServer().getOfflinePlayers();
1149+
if (offlinePlayers.length > 2000) {
1150+
getServer().getScheduler().runTaskAsynchronously(this, () -> PlayerFinder.doLargeOfflineCachingWork(this, offlinePlayers));
1151+
}
11471152
Util.debugLog("Now using display-type: " + AbstractDisplayItem.getNowUsing().name());
11481153
getLogger().info("QuickShop Loaded! " + enableTimer.stopAndGetTimePassed() + " ms.");
11491154
}

src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.maxgamer.quickshop.util.InteractUtil;
5656
import org.maxgamer.quickshop.util.MsgUtil;
5757
import org.maxgamer.quickshop.util.PermissionChecker;
58+
import org.maxgamer.quickshop.util.PlayerFinder;
5859
import org.maxgamer.quickshop.util.Util;
5960
import org.maxgamer.quickshop.util.reload.ReloadResult;
6061
import org.maxgamer.quickshop.util.reload.ReloadStatus;
@@ -389,6 +390,7 @@ public void onInventoryClose(InventoryCloseEvent e) {
389390
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
390391
public void onJoin(PlayerJoinEvent e) {
391392
Util.debugLog("Player " + e.getPlayer().getName() + " using locale " + e.getPlayer().getLocale() + ": " + plugin.text().of(e.getPlayer(), "file-test").forLocale());
393+
PlayerFinder.updateStashIfNeeded(e.getPlayer());
392394
// Notify the player any messages they were sent
393395
if (plugin.getConfig().getBoolean("shop.auto-fetch-shop-messages")) {
394396
//Run Task later to make sure locale is correct

src/main/java/org/maxgamer/quickshop/util/PlayerFinder.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@
2424
import org.bukkit.Bukkit;
2525
import org.bukkit.OfflinePlayer;
2626
import org.bukkit.Server;
27+
import org.bukkit.entity.Player;
2728
import org.jetbrains.annotations.Nullable;
29+
import org.maxgamer.quickshop.QuickShop;
2830

2931
import java.util.Arrays;
3032
import java.util.Locale;
33+
import java.util.Map;
34+
import java.util.Set;
3135
import java.util.UUID;
3236
import java.util.concurrent.TimeUnit;
37+
import java.util.logging.Level;
3338

3439
/**
3540
* A player finder for finding player by name
@@ -39,8 +44,12 @@
3944
*/
4045
public final class PlayerFinder {
4146

47+
//Hold store for large server
48+
private static final Map<String, UUID> string2UUIDStash = new java.util.concurrent.ConcurrentHashMap<>();
4249
private static final Cache<String, UUID> string2UUIDCache = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.MINUTES).build();
4350

51+
private static volatile boolean isStashNeeded;
52+
4453
private PlayerFinder() {
4554
}
4655

@@ -49,37 +58,54 @@ public static UUID findUUIDByName(String name) {
4958
}
5059

5160
@Nullable
52-
private static OfflinePlayer findPlayerByName(String name, java.util.Collection<? extends org.bukkit.OfflinePlayer> players) {
53-
//Cache all players when offline player is too many
54-
boolean cacheAllPlayers = players.size() > 5000;
55-
OfflinePlayer result = null;
61+
private static OfflinePlayer findPlayerByName(String name, java.util.Collection<? extends org.bukkit.OfflinePlayer> players, boolean isOfflinePlayer) {
5662
for (OfflinePlayer player : players) {
5763
String playerName = player.getName();
5864
if (playerName != null) {
5965
if (playerName.equalsIgnoreCase(name)) {
60-
result = player;
61-
if (!cacheAllPlayers) {
62-
return result;
63-
}
64-
}
65-
if (cacheAllPlayers) {
66-
string2UUIDCache.put(playerName.toLowerCase(Locale.ROOT), player.getUniqueId());
66+
return player;
6767
}
6868
}
6969
}
70-
return result;
70+
return null;
71+
}
72+
73+
public static Set<String> getCachedOfflinePlayerNames() {
74+
return string2UUIDStash.keySet();
75+
}
76+
77+
public static void updateStashIfNeeded(Player player) {
78+
if (isStashNeeded) {
79+
string2UUIDStash.put(player.getName().toLowerCase(Locale.ROOT), player.getUniqueId());
80+
}
81+
}
82+
83+
public static void doLargeOfflineCachingWork(QuickShop quickShop, OfflinePlayer[] offlinePlayers) {
84+
quickShop.getLogger().log(Level.INFO, "Large server detected (offline player > 2000), start offline player caching...");
85+
isStashNeeded = true;
86+
for (OfflinePlayer offlinePlayer : quickShop.getServer().getOfflinePlayers()) {
87+
string2UUIDStash.put(offlinePlayer.getName(), offlinePlayer.getUniqueId());
88+
}
89+
quickShop.getLogger().log(Level.INFO, "Done! cached " + offlinePlayers.length + " players.");
7190
}
7291

7392
public static OfflinePlayer findOfflinePlayerByName(String name) {
7493
OfflinePlayer result;
75-
UUID uuid = string2UUIDCache.getIfPresent(name.toLowerCase(Locale.ROOT));
94+
UUID uuid;
95+
96+
uuid = string2UUIDCache.getIfPresent(name.toLowerCase(Locale.ROOT));
97+
98+
if (uuid == null && !string2UUIDStash.isEmpty()) {
99+
uuid = string2UUIDStash.get(name.toLowerCase(Locale.ROOT));
100+
}
101+
76102
if (uuid != null) {
77103
return Bukkit.getOfflinePlayer(uuid);
78104
} else {
79105
Server server = Bukkit.getServer();
80-
result = findPlayerByName(name, server.getOnlinePlayers());
106+
result = findPlayerByName(name, server.getOnlinePlayers(), false);
81107
if (result == null) {
82-
result = findPlayerByName(name, Arrays.asList(server.getOfflinePlayers()));
108+
result = findPlayerByName(name, Arrays.asList(server.getOfflinePlayers()), true);
83109
}
84110
if (result == null) {
85111
result = Bukkit.getServer().getOfflinePlayer(name);

src/main/java/org/maxgamer/quickshop/util/Util.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1429,7 +1429,12 @@ public static File getCacheFolder() {
14291429
public static List<String> getPlayerList() {
14301430
List<String> tabList = plugin.getServer().getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList());
14311431
if (plugin.getConfig().getBoolean("include-offlineplayer-list")) {
1432-
tabList.addAll(Arrays.stream(plugin.getServer().getOfflinePlayers()).map(OfflinePlayer::getName).filter(Objects::nonNull).collect(Collectors.toList()));
1432+
Set<String> names = PlayerFinder.getCachedOfflinePlayerNames();
1433+
if (!names.isEmpty()) {
1434+
tabList.addAll(names);
1435+
} else {
1436+
tabList.addAll(Arrays.stream(plugin.getServer().getOfflinePlayers()).map(OfflinePlayer::getName).filter(Objects::nonNull).collect(Collectors.toList()));
1437+
}
14331438
}
14341439
return tabList;
14351440
}

0 commit comments

Comments
 (0)