Expose server build information

Co-authored-by: Professor Bloodstone <git@bloodstone.dev>
Co-authored-by: Mark Vainomaa <mikroskeem@mikroskeem.eu>
Co-authored-by: masmc05 <masmc05@gmail.com>
Co-authored-by: Riley Park <rileysebastianpark@gmail.com>
This commit is contained in:
Zach Brown
2019-05-27 01:10:06 -05:00
parent 376251dab7
commit 05ec73f817
9 changed files with 369 additions and 9 deletions

View File

@@ -110,13 +110,26 @@ public final class Bukkit {
}
Bukkit.server = server;
server.getLogger().info("This server is running " + getName() + " version " + getVersion() + " (Implementing API version " + getBukkitVersion() + ")");
// Paper start - add git information
server.getLogger().info(getVersionMessage());
}
/**
* Gets message describing the version server is running.
*
* @return message describing the version server is running
*/
@NotNull
public static String getVersionMessage() {
final io.papermc.paper.ServerBuildInfo version = io.papermc.paper.ServerBuildInfo.buildInfo();
return "This server is running " + getName() + " version " + version.asString(io.papermc.paper.ServerBuildInfo.StringRepresentation.VERSION_FULL) + " (Implementing API version " + getBukkitVersion() + ")";
// Paper end
}
/**
* Gets the name of this server implementation.
*
* @return name of this server implementation
* @see io.papermc.paper.ServerBuildInfo#brandName()
*/
@NotNull
public static String getName() {
@@ -127,6 +140,7 @@ public final class Bukkit {
* Gets the version string of this server implementation.
*
* @return version of this server implementation
* @see io.papermc.paper.ServerBuildInfo
*/
@NotNull
public static String getVersion() {
@@ -143,6 +157,20 @@ public final class Bukkit {
return server.getBukkitVersion();
}
// Paper start - expose game version
/**
* Gets the version of game this server implements
*
* @return version of game
* @see io.papermc.paper.ServerBuildInfo#minecraftVersionId()
* @see io.papermc.paper.ServerBuildInfo#minecraftVersionName()
*/
@NotNull
public static String getMinecraftVersion() {
return server.getMinecraftVersion();
}
// Paper end
/**
* Gets a view of all currently logged in players. This {@linkplain
* Collections#unmodifiableCollection(Collection) view} is a reused

View File

@@ -120,6 +120,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public String getBukkitVersion();
// Paper start - expose game version
/**
* Gets the version of game this server implements
*
* @return version of game
*/
@NotNull
String getMinecraftVersion();
// Paper end
/**
* Gets a view of all currently logged in players. This {@linkplain
* Collections#unmodifiableCollection(Collection) view} is a reused

View File

@@ -156,4 +156,13 @@ public interface UnsafeValues {
return !Bukkit.getUnsafe().isSupportedApiVersion(plugin.getDescription().getAPIVersion());
}
// Paper end
// Paper start
/**
* Called once by the version command on first use, then cached.
*/
default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {
return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher();
}
// Paper end
}

View File

@@ -25,8 +25,25 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
// Paper start - version command 2.0
import com.destroystokyo.paper.util.VersionFetcher;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
// Paper end - version command 2.0
public class VersionCommand extends BukkitCommand {
private VersionFetcher versionFetcher; // Paper - version command 2.0
private VersionFetcher getVersionFetcher() { // lazy load because unsafe isn't available at command registration
if (versionFetcher == null) {
versionFetcher = Bukkit.getUnsafe().getVersionFetcher();
}
return versionFetcher;
}
public VersionCommand(@NotNull String name) {
super(name);
@@ -41,7 +58,7 @@ public class VersionCommand extends BukkitCommand {
if (!testPermission(sender)) return true;
if (args.length == 0) {
sender.sendMessage("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")");
//sender.sendMessage("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")"); // Paper - moved to setVersionMessage
sendVersion(sender);
} else {
StringBuilder name = new StringBuilder();
@@ -80,8 +97,17 @@ public class VersionCommand extends BukkitCommand {
private void describeToSender(@NotNull Plugin plugin, @NotNull CommandSender sender) {
PluginDescriptionFile desc = plugin.getDescription();
sender.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + desc.getVersion());
// Paper start - version command 2.0
sender.sendMessage(
Component.text()
.append(Component.text(desc.getName(), NamedTextColor.GREEN))
.append(Component.text(" version "))
.append(Component.text(desc.getVersion(), NamedTextColor.GREEN)
.hoverEvent(Component.text("Click to copy to clipboard", NamedTextColor.WHITE))
.clickEvent(ClickEvent.copyToClipboard(desc.getVersion()))
)
);
// Paper end - version command 2.0
if (desc.getDescription() != null) {
sender.sendMessage(desc.getDescription());
}
@@ -147,14 +173,14 @@ public class VersionCommand extends BukkitCommand {
private final ReentrantLock versionLock = new ReentrantLock();
private boolean hasVersion = false;
private String versionMessage = null;
private Component versionMessage = null; // Paper
private final Set<CommandSender> versionWaiters = new HashSet<CommandSender>();
private boolean versionTaskStarted = false;
private long lastCheck = 0;
private void sendVersion(@NotNull CommandSender sender) {
if (hasVersion) {
if (System.currentTimeMillis() - lastCheck > 21600000) {
if (System.currentTimeMillis() - lastCheck > getVersionFetcher().getCacheTime()) { // Paper - use version supplier
lastCheck = System.currentTimeMillis();
hasVersion = false;
} else {
@@ -169,7 +195,7 @@ public class VersionCommand extends BukkitCommand {
return;
}
versionWaiters.add(sender);
sender.sendMessage("Checking version, please wait...");
sender.sendMessage(Component.text("Checking version, please wait...", NamedTextColor.WHITE, TextDecoration.ITALIC)); // Paper
if (!versionTaskStarted) {
versionTaskStarted = true;
new Thread(new Runnable() {
@@ -187,6 +213,13 @@ public class VersionCommand extends BukkitCommand {
private void obtainVersion() {
String version = Bukkit.getVersion();
// Paper start
if (version.startsWith("null")) { // running from ide?
setVersionMessage(Component.text("Unknown version, custom build?", NamedTextColor.YELLOW));
return;
}
setVersionMessage(getVersionFetcher().getVersionMessage(version));
/*
if (version == null) version = "Custom";
String[] parts = version.substring(0, version.indexOf(' ')).split("-");
if (parts.length == 4) {
@@ -216,11 +249,24 @@ public class VersionCommand extends BukkitCommand {
} else {
setVersionMessage("Unknown version, custom build?");
}
*/
// Paper end
}
private void setVersionMessage(@NotNull String msg) {
// Paper start
private void setVersionMessage(final @NotNull Component msg) {
lastCheck = System.currentTimeMillis();
versionMessage = msg;
final Component message = Component.textOfChildren(
Component.text(Bukkit.getVersionMessage(), NamedTextColor.WHITE),
Component.newline(),
msg
);
this.versionMessage = Component.text()
.append(message)
.hoverEvent(Component.text("Click to copy to clipboard", NamedTextColor.WHITE))
.clickEvent(ClickEvent.copyToClipboard(PlainTextComponentSerializer.plainText().serialize(message)))
.build();
// Paper end
versionLock.lock();
try {
hasVersion = true;