mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-19 02:33:04 +02:00
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: e25c6a75 PR-638: Add CreativeCategory API for Materials CraftBukkit Changes: 86292d3e0 PR-876: Add CreativeCategory API for Materials
186 lines
8.2 KiB
Diff
186 lines
8.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Zach Brown <zach@zachbr.io>
|
|
Date: Mon, 27 May 2019 01:10:06 -0500
|
|
Subject: [PATCH] Version Command 2.0
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c716339346
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java
|
|
@@ -0,0 +1,45 @@
|
|
+package com.destroystokyo.paper.util;
|
|
+
|
|
+import net.kyori.adventure.text.Component;
|
|
+import net.kyori.adventure.text.format.NamedTextColor;
|
|
+import org.bukkit.Bukkit;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+
|
|
+public interface VersionFetcher {
|
|
+ /**
|
|
+ * Amount of time to cache results for in milliseconds
|
|
+ * <p>
|
|
+ * Negative values will never cache.
|
|
+ *
|
|
+ * @return cache time
|
|
+ */
|
|
+ long getCacheTime();
|
|
+
|
|
+ /**
|
|
+ * Gets the version message to cache and show to command senders.
|
|
+ *
|
|
+ * <p>NOTE: This is run in a new thread separate from that of the command processing thread</p>
|
|
+ *
|
|
+ * @param serverVersion the current version of the server (will match {@link Bukkit#getVersion()})
|
|
+ * @return the message to show when requesting a version
|
|
+ */
|
|
+ @NotNull
|
|
+ Component getVersionMessage(@NotNull String serverVersion);
|
|
+
|
|
+ class DummyVersionFetcher implements VersionFetcher {
|
|
+
|
|
+ @Override
|
|
+ public long getCacheTime() {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public Component getVersionMessage(@NotNull String serverVersion) {
|
|
+ Bukkit.getLogger().warning("Version provider has not been set, cannot check for updates!");
|
|
+ Bukkit.getLogger().info("Override the default implementation of org.bukkit.UnsafeValues#getVersionFetcher()");
|
|
+ new Throwable().printStackTrace();
|
|
+ return Component.text("Unable to check for updates. No version provider set.", NamedTextColor.RED);
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
|
|
index ce5794d684a1126ec9acbf4af17f5d6fa783f551..5ba6c7a69937badd64256248560268fb695d5f74 100644
|
|
--- a/src/main/java/org/bukkit/UnsafeValues.java
|
|
+++ b/src/main/java/org/bukkit/UnsafeValues.java
|
|
@@ -94,5 +94,12 @@ public interface UnsafeValues {
|
|
* @return name
|
|
*/
|
|
String getTimingsServerName();
|
|
+
|
|
+ /**
|
|
+ * 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
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
|
|
index 2305eb40832a82159cd89162934870cf57e1aa0e..4c2ddc722a9dc4011906ad9530b13fa9be1d3ff9 100644
|
|
--- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java
|
|
+++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
|
|
@@ -1,5 +1,6 @@
|
|
package org.bukkit.command.defaults;
|
|
|
|
+import com.destroystokyo.paper.util.VersionFetcher; // Paper - version supplier
|
|
import com.google.common.base.Charsets;
|
|
import com.google.common.collect.ImmutableList;
|
|
import com.google.common.io.Resources;
|
|
@@ -16,6 +17,7 @@ import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
+import net.kyori.adventure.text.Component; // Paper
|
|
import org.apache.commons.lang.Validate;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
@@ -26,6 +28,15 @@ import org.bukkit.util.StringUtil;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
public class VersionCommand extends BukkitCommand {
|
|
+ private VersionFetcher versionFetcher;
|
|
+ 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);
|
|
|
|
@@ -40,7 +51,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();
|
|
@@ -146,14 +157,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 {
|
|
@@ -168,7 +179,7 @@ public class VersionCommand extends BukkitCommand {
|
|
return;
|
|
}
|
|
versionWaiters.add(sender);
|
|
- sender.sendMessage("Checking version, please wait...");
|
|
+ sender.sendMessage(Component.text("Checking version, please wait...", net.kyori.adventure.text.format.NamedTextColor.WHITE, net.kyori.adventure.text.format.TextDecoration.ITALIC)); // Paper
|
|
if (!versionTaskStarted) {
|
|
versionTaskStarted = true;
|
|
new Thread(new Runnable() {
|
|
@@ -186,6 +197,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?", net.kyori.adventure.text.format.NamedTextColor.YELLOW));
|
|
+ return;
|
|
+ }
|
|
+ setVersionMessage(getVersionFetcher().getVersionMessage(version));
|
|
+ /*
|
|
if (version == null) version = "Custom";
|
|
String[] parts = version.substring(0, version.indexOf(' ')).split("-");
|
|
if (parts.length == 4) {
|
|
@@ -215,11 +233,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 = net.kyori.adventure.text.TextComponent.ofChildren(
|
|
+ Component.text("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")", net.kyori.adventure.text.format.NamedTextColor.WHITE),
|
|
+ Component.newline(),
|
|
+ msg
|
|
+ );
|
|
+ this.versionMessage = Component.text()
|
|
+ .append(message)
|
|
+ .hoverEvent(Component.text("Click to copy to clipboard", net.kyori.adventure.text.format.NamedTextColor.WHITE))
|
|
+ .clickEvent(net.kyori.adventure.text.event.ClickEvent.copyToClipboard(net.kyori.adventure.text.serializer.plain.PlainComponentSerializer.plain().serialize(message)))
|
|
+ .build();
|
|
+ // Paper end
|
|
versionLock.lock();
|
|
try {
|
|
hasVersion = true;
|