-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy path0001-PandaSpigot-version-checking.patch
138 lines (134 loc) · 6.34 KB
/
0001-PandaSpigot-version-checking.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hpfxd <[email protected]>
Date: Tue, 26 Oct 2021 20:51:53 -0400
Subject: [PATCH] PandaSpigot version checking
diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
index e91e1d8c1215d19a78611d3c8302ed9634bfbda5..62f36e8f9d033c82318141e4edc0636cfc58613a 100644
--- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java
+++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
@@ -18,15 +18,20 @@ import com.google.common.io.Resources;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.URL;
-import java.net.URLEncoder;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+
+// PandaSpigot start
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSyntaxException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.util.stream.StreamSupport;
+import com.google.gson.JsonElement;
+// PandaSpigot end
public class VersionCommand extends BukkitCommand {
public VersionCommand(String name) {
@@ -185,8 +190,33 @@ public class VersionCommand extends BukkitCommand {
private void obtainVersion() {
String version = Bukkit.getVersion();
if (version == null) version = "Custom";
+ // PandaSpigot start
+ if (version.startsWith("git-PandaSpigot-")) {
+ String[] parts = version.substring("git-PandaSpigot-".length()).split("[-\\s]");
+ int distance;
+ try {
+ distance = fetchDownloadApiDistance(Integer.parseInt(parts[0]));
+ } catch (NumberFormatException e) {
+ distance = fetchGitDistance("hpfxd/PandaSpigot", "master", parts[0]);
+ }
+
+ switch (distance) {
+ case -1:
+ this.setVersionMessage(ChatColor.YELLOW + "Error obtaining version information");
+ break;
+ case 0:
+ this.setVersionMessage(ChatColor.GREEN + "You are running the latest version");
+ break;
+ case -2:
+ this.setVersionMessage(ChatColor.YELLOW + "Unknown version");
+ break;
+ default:
+ this.setVersionMessage(ChatColor.RED + "You are " + distance + " version(s) behind!\n" + ChatColor.RED + "Download the new version at " + ChatColor.GOLD + "https://github.com/hpfxd/PandaSpigot");
+ break;
+ }
// PaperSpigot start
- if (version.startsWith("git-PaperSpigot-")) {
+ } else if (version.startsWith("git-PaperSpigot-")) {
+ // PandaSpigot end
String[] parts = version.substring("git-PaperSpigot-".length()).split("[-\\s]");
int paperSpigotVersions = getDistance("paperspigot", parts[0]);
if (paperSpigotVersions == -1) {
@@ -246,6 +276,65 @@ public class VersionCommand extends BukkitCommand {
}
}
+ // PandaSpigot start
+ private static int fetchDownloadApiDistance(int runNumber) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL("https://downloads.hpfxd.com/v2/projects/pandaspigot/versions/1.8.8").openConnection();
+ connection.setRequestProperty("Accept", "application/json");
+ connection.setRequestProperty("User-Agent", "PandaSpigot/" + Bukkit.getVersion());
+ connection.connect();
+ if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return -2;
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
+ JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
+ JsonArray arr = obj.getAsJsonArray("builds");
+ int latest = StreamSupport.stream(arr.spliterator(), false)
+ .mapToInt(JsonElement::getAsInt)
+ .max()
+ .orElse(-1);
+ if (latest < 0) {
+ return -1;
+ } else {
+ return latest - runNumber;
+ }
+ } catch (JsonSyntaxException | NumberFormatException e) {
+ e.printStackTrace();
+ return -1;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ return -1;
+ }
+ }
+ private static int fetchGitDistance(String repo, String branch, String hash) {
+ hash = hash.replace("\"", "");
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + repo + "/compare/" + branch + "..." + hash).openConnection();
+ connection.setRequestProperty("Accept", "application/vnd.github.v3+json");
+ connection.setRequestProperty("User-Agent", "PandaSpigot/" + Bukkit.getVersion());
+ connection.connect();
+ if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return -2; // Unknown commit
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
+ JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
+ String status = obj.get("status").getAsString();
+ switch (status) {
+ case "identical":
+ return 0;
+ case "behind":
+ return obj.get("behind_by").getAsInt();
+ default:
+ return -1;
+ }
+ } catch (JsonSyntaxException | NumberFormatException e) {
+ e.printStackTrace();
+ return -1;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ return -1;
+ }
+ }
+ // PandaSpigot end
+
private static int getDistance(String repo, String currentVerInt) { // PaperSpigot
try {
BufferedReader reader = Resources.asCharSource(