Skip to content

Commit a28c846

Browse files
committed
Stop inspect offline UUID fallback and centralize kit caching
- Add `cacheKit` helper in `KitManager` and route cache writes through it - Remove deterministic offline-mode UUID fallback in inspect resolution - Update inspect tests to expect `null` when all UUID lookups miss
1 parent b8ad55e commit a28c846

3 files changed

Lines changed: 30 additions & 24 deletions

File tree

src/main/java/dev/noah/perplayerkit/KitManager.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ public ItemStack[] getItemStackArrayById(String id) {
5959
return kitByKitIDMap.get(id);
6060
}
6161

62+
private void cacheKit(String id, ItemStack[] kit) {
63+
if (kit == null) {
64+
kitByKitIDMap.remove(id);
65+
return;
66+
}
67+
68+
kitByKitIDMap.put(id, kit);
69+
}
70+
6271
public List<PublicKit> getPublicKitList() {
6372
return publicKitList;
6473
}
@@ -105,7 +114,7 @@ public boolean savekit(UUID uuid, int slot, ItemStack[] kit) {
105114
}
106115
}
107116

108-
kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), kit);
117+
cacheKit(IDUtil.getPlayerKitId(uuid, slot), kit);
109118
player.sendMessage(ChatColor.GREEN + "Kit " + slot + " saved!");
110119

111120
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePlayerKitToDB(uuid, slot));
@@ -150,7 +159,7 @@ public boolean savePublicKit(Player player, String publickit, ItemStack[] kit) {
150159
}
151160
}
152161

153-
kitByKitIDMap.put(IDUtil.getPublicKitId(publickit), kit);
162+
cacheKit(IDUtil.getPublicKitId(publickit), kit);
154163
player.sendMessage(ChatColor.GREEN + "Public Kit " + publickit + " saved!");
155164

156165
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePublicKitToDB(publickit));
@@ -193,7 +202,7 @@ public boolean savePublicKit(String id, ItemStack[] kit) {
193202
}
194203
}
195204

196-
kitByKitIDMap.put(IDUtil.getPublicKitId(id), kit);
205+
cacheKit(IDUtil.getPublicKitId(id), kit);
197206
return true;
198207
}
199208
return false;
@@ -213,7 +222,7 @@ public boolean saveEC(UUID uuid, int slot, ItemStack[] kit) {
213222
}
214223

215224
if (notEmpty) {
216-
kitByKitIDMap.put(IDUtil.getECId(uuid, slot), kit);
225+
cacheKit(IDUtil.getECId(uuid, slot), kit);
217226
player.sendMessage(ChatColor.GREEN + "Enderchest " + slot + " saved!");
218227
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> saveEnderchestToDB(uuid, slot));
219228
return true;
@@ -238,7 +247,7 @@ public boolean saveECSilent(UUID uuid, int slot, ItemStack[] kit) {
238247
return false;
239248
}
240249

241-
kitByKitIDMap.put(IDUtil.getECId(uuid, slot), kit);
250+
cacheKit(IDUtil.getECId(uuid, slot), kit);
242251
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> saveEnderchestToDB(uuid, slot));
243252
return true;
244253
}
@@ -270,7 +279,7 @@ public boolean savekit(UUID uuid, int slot, ItemStack[] kit, boolean silent) {
270279
kit[39] = null;
271280
}
272281

273-
kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(kit));
282+
cacheKit(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(kit));
274283
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePlayerKitToDB(uuid, slot));
275284
return true;
276285
} else {
@@ -437,7 +446,8 @@ public void loadPlayerDataFromDB(UUID uuid) {
437446
if (!data.equalsIgnoreCase("error")) {
438447
try {
439448
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
440-
kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
449+
cacheKit(IDUtil.getPlayerKitId(uuid, slot),
450+
ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
441451
} catch (IOException ignored) {
442452
}
443453
}
@@ -447,7 +457,8 @@ public void loadPlayerDataFromDB(UUID uuid) {
447457
if (!data.equalsIgnoreCase("error")) {
448458
try {
449459
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
450-
kitByKitIDMap.put(IDUtil.getECId(uuid, slot), ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
460+
cacheKit(IDUtil.getECId(uuid, slot),
461+
ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
451462
} catch (IOException ignored) {
452463
}
453464
}
@@ -487,7 +498,7 @@ public void loadPublicKitFromDB(String id) {
487498
if (!data.equalsIgnoreCase("error")) {
488499
try {
489500
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
490-
kitByKitIDMap.put(IDUtil.getPublicKitId(id), ItemFilter.get().filterItemStack(kit));
501+
cacheKit(IDUtil.getPublicKitId(id), ItemFilter.get().filterItemStack(kit));
491502
} catch (IOException ignored) {
492503
plugin.getLogger().info("Error loading public kit " + id);
493504
}

src/main/java/dev/noah/perplayerkit/commands/inspect/InspectCommandUtil.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import java.io.IOException;
3434
import java.lang.reflect.Method;
35-
import java.nio.charset.StandardCharsets;
3635
import java.util.UUID;
3736
import java.util.concurrent.CompletableFuture;
3837
import java.util.function.Supplier;
@@ -50,13 +49,13 @@ private InspectCommandUtil() {
5049
/**
5150
* Attempts to resolve a player identifier (name or UUID) to a UUID asynchronously.
5251
* This method first tries to parse as UUID, then checks online players synchronously,
53-
* and finally searches cached offline players and Mojang asynchronously before
54-
* falling back to the deterministic offline-mode UUID.
52+
* and finally searches cached offline players and Mojang asynchronously.
5553
*
5654
* @param identifier Player name or UUID string
57-
* @return CompletableFuture containing the resolved UUID
55+
* @return CompletableFuture containing the resolved UUID, or null when the player
56+
* could not be identified from local cache or Mojang
5857
*/
59-
public static CompletableFuture<UUID> resolvePlayerIdentifierAsync(String identifier) {
58+
public static CompletableFuture<@Nullable UUID> resolvePlayerIdentifierAsync(String identifier) {
6059
// First try to parse as UUID
6160
try {
6261
UUID uuid = UUID.fromString(identifier);
@@ -160,8 +159,8 @@ public static void showUsage(@NotNull Player player, @NotNull String commandName
160159
}
161160
}
162161

163-
static @NotNull UUID selectResolvedUuid(@NotNull String identifier, @Nullable UUID cachedOfflinePlayer,
164-
@NotNull Supplier<UUID> mojangLookup) {
162+
static @Nullable UUID selectResolvedUuid(@NotNull String identifier, @Nullable UUID cachedOfflinePlayer,
163+
@NotNull Supplier<UUID> mojangLookup) {
165164
if (cachedOfflinePlayer != null) {
166165
return cachedOfflinePlayer;
167166
}
@@ -171,6 +170,6 @@ public static void showUsage(@NotNull Player player, @NotNull String commandName
171170
return mojangUuid;
172171
}
173172

174-
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + identifier).getBytes(StandardCharsets.UTF_8));
173+
return null;
175174
}
176175
}

src/test/java/dev/noah/perplayerkit/commands/inspect/InspectCommandUtilTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.mockito.MockedStatic;
77

88
import java.lang.reflect.Method;
9-
import java.nio.charset.StandardCharsets;
109
import java.util.UUID;
1110

1211
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -39,13 +38,10 @@ void selectResolvedUuidUsesMojangResultWhenCacheMisses() {
3938
}
4039

4140
@Test
42-
void selectResolvedUuidUsesOfflineFallbackWhenMojangLookupMisses() {
43-
String identifier = "TargetPlayer";
41+
void selectResolvedUuidReturnsNullWhenAllLookupsMiss() {
42+
UUID resolvedUuid = InspectCommandUtil.selectResolvedUuid("TargetPlayer", null, () -> null);
4443

45-
UUID resolvedUuid = InspectCommandUtil.selectResolvedUuid(identifier, null, () -> null);
46-
47-
assertEquals(UUID.nameUUIDFromBytes(("OfflinePlayer:" + identifier).getBytes(StandardCharsets.UTF_8)),
48-
resolvedUuid);
44+
assertNull(resolvedUuid);
4945
}
5046

5147
@Test

0 commit comments

Comments
 (0)