|
| 1 | +From e287143a0564758a618d88ef6647087d96d4b784 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Zach Brown < [email protected]> |
| 3 | +Date: Fri, 4 Nov 2022 16:56:56 +0100 |
| 4 | +Subject: [PATCH] Implement [Paper-0009] Version Command 2.0 by Zach Brown |
| 5 | + |
| 6 | + |
| 7 | +diff --git a/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java |
| 8 | +new file mode 100644 |
| 9 | +index 00000000..46af13c9 |
| 10 | +--- /dev/null |
| 11 | ++++ b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java |
| 12 | +@@ -0,0 +1,43 @@ |
| 13 | ++package com.destroystokyo.paper.util; |
| 14 | ++ |
| 15 | ++import org.bukkit.Bukkit; |
| 16 | ++import org.jetbrains.annotations.NotNull; |
| 17 | ++ |
| 18 | ++public interface VersionFetcher { |
| 19 | ++ /** |
| 20 | ++ * Amount of time to cache results for in milliseconds |
| 21 | ++ * <p> |
| 22 | ++ * Negative values will never cache. |
| 23 | ++ * |
| 24 | ++ * @return cache time |
| 25 | ++ */ |
| 26 | ++ long getCacheTime(); |
| 27 | ++ |
| 28 | ++ /** |
| 29 | ++ * Gets the version message to cache and show to command senders. |
| 30 | ++ * |
| 31 | ++ * <p>NOTE: This is run in a new thread separate from that of the command processing thread</p> |
| 32 | ++ * |
| 33 | ++ * @param serverVersion the current version of the server (will match {@link Bukkit#getVersion()}) |
| 34 | ++ * @return the message to show when requesting a version |
| 35 | ++ */ |
| 36 | ++ @NotNull |
| 37 | ++ String getVersionMessage(@NotNull String serverVersion); |
| 38 | ++ |
| 39 | ++ class DummyVersionFetcher implements VersionFetcher { |
| 40 | ++ |
| 41 | ++ @Override |
| 42 | ++ public long getCacheTime() { |
| 43 | ++ return -1; |
| 44 | ++ } |
| 45 | ++ |
| 46 | ++ @NotNull |
| 47 | ++ @Override |
| 48 | ++ public String getVersionMessage(@NotNull String serverVersion) { |
| 49 | ++ Bukkit.getLogger().warning("Version provider has not been set, cannot check for updates!"); |
| 50 | ++ Bukkit.getLogger().info("Override the default implementation of org.bukkit.UnsafeValues#getVersionFetcher()"); |
| 51 | ++ new Throwable().printStackTrace(); |
| 52 | ++ return "Unable to check for updates. No version provider set."; |
| 53 | ++ } |
| 54 | ++ } |
| 55 | ++} |
| 56 | +\ No newline at end of file |
| 57 | +diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java |
| 58 | +index 73dd599c..a7d571f7 100644 |
| 59 | +--- a/src/main/java/org/bukkit/UnsafeValues.java |
| 60 | ++++ b/src/main/java/org/bukkit/UnsafeValues.java |
| 61 | +@@ -36,4 +36,14 @@ public interface UnsafeValues { |
| 62 | + |
| 63 | + ItemStack deserializeItem(byte[] data); |
| 64 | + // PandaSpigot end |
| 65 | ++ |
| 66 | ++ // Paper start |
| 67 | ++ /** |
| 68 | ++ * Called once by the version command on first use, then cached. |
| 69 | ++ */ |
| 70 | ++ default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { |
| 71 | ++ return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher(); |
| 72 | ++ } |
| 73 | ++ // Paper end |
| 74 | ++ |
| 75 | + } |
| 76 | +diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java |
| 77 | +index d49d0ded..d4b5c757 100644 |
| 78 | +--- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java |
| 79 | ++++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java |
| 80 | +@@ -1,5 +1,6 @@ |
| 81 | + package org.bukkit.command.defaults; |
| 82 | + |
| 83 | ++import com.destroystokyo.paper.util.VersionFetcher; |
| 84 | + import com.google.common.base.Charsets; |
| 85 | + import java.util.ArrayList; |
| 86 | + import java.util.Arrays; |
| 87 | +@@ -29,6 +30,17 @@ import org.json.simple.parser.JSONParser; |
| 88 | + import org.json.simple.parser.ParseException; |
| 89 | + |
| 90 | + public class VersionCommand extends BukkitCommand { |
| 91 | ++ // Paper start |
| 92 | ++ private VersionFetcher versionFetcher; |
| 93 | ++ private VersionFetcher getVersionFetcher() { // lazy load because unsafe isn't available at command registration |
| 94 | ++ if (versionFetcher == null) { |
| 95 | ++ versionFetcher = Bukkit.getUnsafe().getVersionFetcher(); |
| 96 | ++ } |
| 97 | ++ |
| 98 | ++ return versionFetcher; |
| 99 | ++ } |
| 100 | ++ // Paper end |
| 101 | ++ |
| 102 | + public VersionCommand(String name) { |
| 103 | + super(name); |
| 104 | + |
| 105 | +@@ -43,7 +55,7 @@ public class VersionCommand extends BukkitCommand { |
| 106 | + if (!testPermission(sender)) return true; |
| 107 | + |
| 108 | + if (args.length == 0) { |
| 109 | +- sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8>> &7This server is running &5Titanium &8(&fMC: 1.8.8&8) - &7Implementing API version &f" + Bukkit.getBukkitVersion())); |
| 110 | ++ //sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8>> &7This server is running &5Titanium &8(&fMC: 1.8.8&8) - &7Implementing API version &f" + Bukkit.getBukkitVersion())); // Paper - moved to setVersionMessage |
| 111 | + sendVersion(sender); |
| 112 | + } else { |
| 113 | + StringBuilder name = new StringBuilder(); |
| 114 | +@@ -150,7 +162,7 @@ public class VersionCommand extends BukkitCommand { |
| 115 | + |
| 116 | + private void sendVersion(CommandSender sender) { |
| 117 | + if (hasVersion) { |
| 118 | +- if (System.currentTimeMillis() - lastCheck > 21600000) { |
| 119 | ++ if (System.currentTimeMillis() - lastCheck > getVersionFetcher().getCacheTime()) { // Paper - use version supplier |
| 120 | + lastCheck = System.currentTimeMillis(); |
| 121 | + hasVersion = false; |
| 122 | + } else { |
| 123 | +@@ -165,7 +177,7 @@ public class VersionCommand extends BukkitCommand { |
| 124 | + return; |
| 125 | + } |
| 126 | + versionWaiters.add(sender); |
| 127 | +- sender.sendMessage("Checking version, please wait..."); |
| 128 | ++ sender.sendMessage(ChatColor.ITALIC + "Checking version, please wait..."); // Paper - Italic |
| 129 | + if (!versionTaskStarted) { |
| 130 | + versionTaskStarted = true; |
| 131 | + new Thread(new Runnable() { |
| 132 | +@@ -183,6 +195,13 @@ public class VersionCommand extends BukkitCommand { |
| 133 | + |
| 134 | + private void obtainVersion() { |
| 135 | + String version = Bukkit.getVersion(); |
| 136 | ++ // Paper start |
| 137 | ++ if (version == null || version.startsWith("null")) { // running from ide? |
| 138 | ++ setVersionMessage(ChatColor.YELLOW + "Unknown version, custom build?"); |
| 139 | ++ return; |
| 140 | ++ } |
| 141 | ++ setVersionMessage(getVersionFetcher().getVersionMessage(version)); |
| 142 | ++ /* |
| 143 | + if (version == null) version = "Custom"; |
| 144 | + // PaperSpigot start |
| 145 | + if (version.startsWith("git-PaperSpigot-")) { |
| 146 | +@@ -227,11 +246,16 @@ public class VersionCommand extends BukkitCommand { |
| 147 | + } else { |
| 148 | + setVersionMessage("Unknown version, custom build?"); |
| 149 | + } |
| 150 | ++ */ |
| 151 | ++ // Paper end |
| 152 | + } |
| 153 | + |
| 154 | + private void setVersionMessage(String msg) { |
| 155 | + lastCheck = System.currentTimeMillis(); |
| 156 | +- versionMessage = msg; |
| 157 | ++ // Paper start |
| 158 | ++ String message = ChatColor.translateAlternateColorCodes('&', "&8>> &7This server is running &5Titanium &8(&fMC: 1.8.8&8) - &7Implementing API version &f" + Bukkit.getBukkitVersion()); |
| 159 | ++ versionMessage = message + "\n" + msg; |
| 160 | ++ // Paper end |
| 161 | + versionLock.lock(); |
| 162 | + try { |
| 163 | + hasVersion = true; |
| 164 | +-- |
| 165 | +2.38.1.windows.1 |
| 166 | + |
0 commit comments