From ed4550de1483f5267669e53ae680b70f0135ca48 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 4 Jan 2021 14:21:37 +0100 Subject: [PATCH 1/3] Added OfflinePlayer getter with optional web request --- .../papermc/lib/environments/Environment.java | 14 +++++++++++++- .../lib/environments/PaperEnvironment.java | 5 +++++ .../offlineplayers/GetOfflinePlayer.java | 11 +++++++++++ .../GetOfflinePlayerCachedOption.java | 19 +++++++++++++++++++ .../GetOfflinePlayerNoCacheOption.java | 15 +++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java create mode 100644 src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java create mode 100644 src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java diff --git a/src/main/java/io/papermc/lib/environments/Environment.java b/src/main/java/io/papermc/lib/environments/Environment.java index dc586f9..9ba4c5d 100644 --- a/src/main/java/io/papermc/lib/environments/Environment.java +++ b/src/main/java/io/papermc/lib/environments/Environment.java @@ -13,21 +13,27 @@ import io.papermc.lib.features.chunkisgenerated.ChunkIsGenerated; import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedApiExists; import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedUnknown; +import io.papermc.lib.features.offlineplayers.GetOfflinePlayer; +import io.papermc.lib.features.offlineplayers.GetOfflinePlayerNoCacheOption; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import javax.annotation.Nonnull; import java.util.concurrent.CompletableFuture; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + @SuppressWarnings("WeakerAccess") public abstract class Environment { @@ -40,6 +46,7 @@ public abstract class Environment { protected ChunkIsGenerated isGeneratedHandler = new ChunkIsGeneratedUnknown(); protected BlockStateSnapshot blockStateSnapshotHandler; protected BedSpawnLocation bedSpawnLocationHandler = new BedSpawnLocationSync(); + protected GetOfflinePlayer getOfflinePlayerHandler = new GetOfflinePlayerNoCacheOption(); public Environment() { Pattern versionPattern = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?(\\d+?)?(?: Pre-Release )?(\\d)?\\)"); @@ -112,6 +119,11 @@ public BlockStateSnapshotResult getBlockState(Block block, boolean useSnapshot) public CompletableFuture getBedSpawnLocationAsync(Player player, boolean isUrgent) { return bedSpawnLocationHandler.getBedSpawnLocationAsync(player, isUrgent); } + + @Nullable + public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + return getOfflinePlayerHandler.getOfflinePlayer(name, makeWebRequest); + } public boolean isVersion(int minor) { return isVersion(minor, 0); diff --git a/src/main/java/io/papermc/lib/environments/PaperEnvironment.java b/src/main/java/io/papermc/lib/environments/PaperEnvironment.java index 04859a6..6f73345 100644 --- a/src/main/java/io/papermc/lib/environments/PaperEnvironment.java +++ b/src/main/java/io/papermc/lib/environments/PaperEnvironment.java @@ -8,6 +8,8 @@ import io.papermc.lib.features.bedspawnlocation.BedSpawnLocationPaper; import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotOptionalSnapshots; import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedApiExists; +import io.papermc.lib.features.offlineplayers.GetOfflinePlayerCachedOption; + import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.HumanEntity; @@ -38,6 +40,9 @@ public PaperEnvironment() { bedSpawnLocationHandler = new BedSpawnLocationPaper(); } catch (NoSuchMethodException ignored) {} } + if (isVersion(16, 4)) { + getOfflinePlayerHandler = new GetOfflinePlayerCachedOption(); + } } @Override diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java new file mode 100644 index 0000000..aa4536a --- /dev/null +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java @@ -0,0 +1,11 @@ +package io.papermc.lib.features.offlineplayers; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.bukkit.OfflinePlayer; + +public interface GetOfflinePlayer { + @Nullable + OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest); +} diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java new file mode 100644 index 0000000..306bbc9 --- /dev/null +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java @@ -0,0 +1,19 @@ +package io.papermc.lib.features.offlineplayers; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; + +public class GetOfflinePlayerCachedOption implements GetOfflinePlayer { + @Override + @Nullable + public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + if (makeWebRequest) { + return Bukkit.getOfflinePlayer(name); + } else { + return Bukkit.getOfflinePlayerIfCached(name); + } + } +} diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java new file mode 100644 index 0000000..41b70e2 --- /dev/null +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java @@ -0,0 +1,15 @@ +package io.papermc.lib.features.offlineplayers; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; + +public class GetOfflinePlayerNoCacheOption implements GetOfflinePlayer { + @Override + @Nullable + public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + return Bukkit.getOfflinePlayer(name); + } +} From f2fd3f340eccfaa915620833ae6b6aa232c3faa5 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 4 Jan 2021 15:56:13 +0100 Subject: [PATCH 2/3] Made requested changes * Added static helper method to PaperLib * Renamed implementation classes --- src/main/java/io/papermc/lib/PaperLib.java | 34 ++++++++++++++----- .../papermc/lib/environments/Environment.java | 4 +-- .../lib/environments/PaperEnvironment.java | 9 +++-- ...Option.java => GetOfflinePlayerPaper.java} | 2 +- ...ption.java => GetOfflinePlayerSpigot.java} | 2 +- 5 files changed, 36 insertions(+), 15 deletions(-) rename src/main/java/io/papermc/lib/features/offlineplayers/{GetOfflinePlayerCachedOption.java => GetOfflinePlayerPaper.java} (86%) rename src/main/java/io/papermc/lib/features/offlineplayers/{GetOfflinePlayerNoCacheOption.java => GetOfflinePlayerSpigot.java} (82%) diff --git a/src/main/java/io/papermc/lib/PaperLib.java b/src/main/java/io/papermc/lib/PaperLib.java index 768f1fc..bfcd1db 100644 --- a/src/main/java/io/papermc/lib/PaperLib.java +++ b/src/main/java/io/papermc/lib/PaperLib.java @@ -1,12 +1,15 @@ package io.papermc.lib; -import io.papermc.lib.environments.CraftBukkitEnvironment; -import io.papermc.lib.environments.Environment; -import io.papermc.lib.environments.PaperEnvironment; -import io.papermc.lib.environments.SpigotEnvironment; -import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult; +import java.util.concurrent.CompletableFuture; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -14,10 +17,11 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.plugin.Plugin; -import javax.annotation.Nonnull; -import java.util.concurrent.CompletableFuture; -import java.util.logging.Level; -import java.util.logging.Logger; +import io.papermc.lib.environments.CraftBukkitEnvironment; +import io.papermc.lib.environments.Environment; +import io.papermc.lib.environments.PaperEnvironment; +import io.papermc.lib.environments.SpigotEnvironment; +import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult; /** * Utility methods that assist plugin developers accessing Paper features. @@ -201,6 +205,18 @@ public static BlockStateSnapshotResult getBlockState(@Nonnull Block block, boole public static CompletableFuture getBedSpawnLocationAsync(@Nonnull Player player, boolean isUrgent) { return ENVIRONMENT.getBedSpawnLocationAsync(player, isUrgent); } + + /** + * Gets an OfflinePlayer by the given name. If the Player is not cached, an optional web request + * can be made to look up the UUID of that player. Web requests will block the current Thread though. + * @param name The name of this OfflinePlayer. + * @param makeWebRequest Whether or not a web request for UUID lookups should be made. + * @return OfflinePlayer by the given name or null if the player is not cached and no web request was made. + */ + @Nullable + public static OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + return ENVIRONMENT.getOfflinePlayer(name, makeWebRequest); + } /** * Detects if the current MC version is at least the following version. diff --git a/src/main/java/io/papermc/lib/environments/Environment.java b/src/main/java/io/papermc/lib/environments/Environment.java index 9ba4c5d..d2fe475 100644 --- a/src/main/java/io/papermc/lib/environments/Environment.java +++ b/src/main/java/io/papermc/lib/environments/Environment.java @@ -14,7 +14,7 @@ import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedApiExists; import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedUnknown; import io.papermc.lib.features.offlineplayers.GetOfflinePlayer; -import io.papermc.lib.features.offlineplayers.GetOfflinePlayerNoCacheOption; +import io.papermc.lib.features.offlineplayers.GetOfflinePlayerSpigot; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -46,7 +46,7 @@ public abstract class Environment { protected ChunkIsGenerated isGeneratedHandler = new ChunkIsGeneratedUnknown(); protected BlockStateSnapshot blockStateSnapshotHandler; protected BedSpawnLocation bedSpawnLocationHandler = new BedSpawnLocationSync(); - protected GetOfflinePlayer getOfflinePlayerHandler = new GetOfflinePlayerNoCacheOption(); + protected GetOfflinePlayer getOfflinePlayerHandler = new GetOfflinePlayerSpigot(); public Environment() { Pattern versionPattern = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?(\\d+?)?(?: Pre-Release )?(\\d)?\\)"); diff --git a/src/main/java/io/papermc/lib/environments/PaperEnvironment.java b/src/main/java/io/papermc/lib/environments/PaperEnvironment.java index 6f73345..89a1203 100644 --- a/src/main/java/io/papermc/lib/environments/PaperEnvironment.java +++ b/src/main/java/io/papermc/lib/environments/PaperEnvironment.java @@ -8,9 +8,10 @@ import io.papermc.lib.features.bedspawnlocation.BedSpawnLocationPaper; import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotOptionalSnapshots; import io.papermc.lib.features.chunkisgenerated.ChunkIsGeneratedApiExists; -import io.papermc.lib.features.offlineplayers.GetOfflinePlayerCachedOption; +import io.papermc.lib.features.offlineplayers.GetOfflinePlayerPaper; import org.bukkit.Location; +import org.bukkit.Server; import org.bukkit.World; import org.bukkit.entity.HumanEntity; @@ -41,7 +42,11 @@ public PaperEnvironment() { } catch (NoSuchMethodException ignored) {} } if (isVersion(16, 4)) { - getOfflinePlayerHandler = new GetOfflinePlayerCachedOption(); + try { + // Check for the new "getOfflinePlayerIfCached" method which was added in Paper API 1.16.4+ + Server.class.getDeclaredMethod("getOfflinePlayerIfCached", String.class); + getOfflinePlayerHandler = new GetOfflinePlayerPaper(); + } catch(NoSuchMethodException ignored) {} } } diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java similarity index 86% rename from src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java rename to src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java index 306bbc9..ae0125e 100644 --- a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerCachedOption.java +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java @@ -6,7 +6,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -public class GetOfflinePlayerCachedOption implements GetOfflinePlayer { +public class GetOfflinePlayerPaper implements GetOfflinePlayer { @Override @Nullable public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java similarity index 82% rename from src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java rename to src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java index 41b70e2..e1547b5 100644 --- a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerNoCacheOption.java +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java @@ -6,7 +6,7 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -public class GetOfflinePlayerNoCacheOption implements GetOfflinePlayer { +public class GetOfflinePlayerSpigot implements GetOfflinePlayer { @Override @Nullable public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { From b96d7189487b76f5db8bdd0b14e45f34a603f728 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 6 Jan 2021 13:53:34 +0100 Subject: [PATCH 3/3] Renamed to match Paper-API method --- src/main/java/io/papermc/lib/PaperLib.java | 4 ++-- src/main/java/io/papermc/lib/environments/Environment.java | 4 ++-- .../papermc/lib/features/offlineplayers/GetOfflinePlayer.java | 2 +- .../lib/features/offlineplayers/GetOfflinePlayerPaper.java | 2 +- .../lib/features/offlineplayers/GetOfflinePlayerSpigot.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/papermc/lib/PaperLib.java b/src/main/java/io/papermc/lib/PaperLib.java index bfcd1db..308dbc9 100644 --- a/src/main/java/io/papermc/lib/PaperLib.java +++ b/src/main/java/io/papermc/lib/PaperLib.java @@ -214,8 +214,8 @@ public static CompletableFuture getBedSpawnLocationAsync(@Nonnull Play * @return OfflinePlayer by the given name or null if the player is not cached and no web request was made. */ @Nullable - public static OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { - return ENVIRONMENT.getOfflinePlayer(name, makeWebRequest); + public static OfflinePlayer getOfflinePlayerIfCached(@Nonnull String name, boolean makeWebRequest) { + return ENVIRONMENT.getOfflinePlayerIfCached(name, makeWebRequest); } /** diff --git a/src/main/java/io/papermc/lib/environments/Environment.java b/src/main/java/io/papermc/lib/environments/Environment.java index d2fe475..7016a6b 100644 --- a/src/main/java/io/papermc/lib/environments/Environment.java +++ b/src/main/java/io/papermc/lib/environments/Environment.java @@ -121,8 +121,8 @@ public CompletableFuture getBedSpawnLocationAsync(Player player, boole } @Nullable - public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { - return getOfflinePlayerHandler.getOfflinePlayer(name, makeWebRequest); + public OfflinePlayer getOfflinePlayerIfCached(@Nonnull String name, boolean makeWebRequest) { + return getOfflinePlayerHandler.getOfflinePlayerIfCached(name, makeWebRequest); } public boolean isVersion(int minor) { diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java index aa4536a..fe5fc38 100644 --- a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayer.java @@ -7,5 +7,5 @@ public interface GetOfflinePlayer { @Nullable - OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest); + OfflinePlayer getOfflinePlayerIfCached(@Nonnull String name, boolean makeWebRequest); } diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java index ae0125e..44624a9 100644 --- a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerPaper.java @@ -9,7 +9,7 @@ public class GetOfflinePlayerPaper implements GetOfflinePlayer { @Override @Nullable - public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + public OfflinePlayer getOfflinePlayerIfCached(@Nonnull String name, boolean makeWebRequest) { if (makeWebRequest) { return Bukkit.getOfflinePlayer(name); } else { diff --git a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java index e1547b5..22a6b4d 100644 --- a/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java +++ b/src/main/java/io/papermc/lib/features/offlineplayers/GetOfflinePlayerSpigot.java @@ -9,7 +9,7 @@ public class GetOfflinePlayerSpigot implements GetOfflinePlayer { @Override @Nullable - public OfflinePlayer getOfflinePlayer(@Nonnull String name, boolean makeWebRequest) { + public OfflinePlayer getOfflinePlayerIfCached(@Nonnull String name, boolean makeWebRequest) { return Bukkit.getOfflinePlayer(name); } }