Skip to content

Commit 0a76636

Browse files
committed
Rewrite
1 parent 1201548 commit 0a76636

10 files changed

Lines changed: 1220 additions & 331 deletions

File tree

Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
package lbq.jsongen;
2+
3+
import static lbq.jsongen.JSONConstants.PAULSCODE_TIME;
4+
import static lbq.jsongen.JSONConstants.getPort;
5+
import static lbq.jsongen.JSONConstants.getSkin;
6+
import static lbq.jsongen.JSONUtil.getLibraryArtifact;
7+
import static lbq.jsongen.JSONUtil.getManifest;
8+
import static lbq.jsongen.JSONUtil.getPresetJSON;
9+
import static lbq.jsongen.JSONUtil.getTime;
10+
import static lbq.jsongen.JSONUtil.getTimeString;
11+
import static lbq.jsongen.JSONUtil.parseJSON;
12+
13+
import java.io.BufferedWriter;
14+
import java.io.ByteArrayInputStream;
15+
import java.io.IOException;
16+
import java.net.URL;
17+
import java.nio.file.Files;
18+
import java.nio.file.Path;
19+
import java.time.Instant;
20+
import java.util.ArrayList;
21+
import java.util.List;
22+
23+
import org.json.JSONArray;
24+
import org.json.JSONObject;
25+
26+
public class Generator {
27+
28+
private final Path basePath;
29+
private JSONObject wrapperArtifact;
30+
private JSONObject wrapperArtifactSource;
31+
private boolean skipManifest;
32+
private boolean update;
33+
private boolean packToFolders;
34+
35+
public Generator(Path dir, Path wrapperJar, Path wrapperSource, boolean updateJsons, boolean skipMan, boolean packToFolder) {
36+
basePath = dir;
37+
skipManifest = skipMan;
38+
update = updateJsons;
39+
packToFolders = packToFolder;
40+
try {
41+
if(wrapperJar != null) {
42+
wrapperArtifact = getLibraryArtifact(wrapperJar, "https://mcphackers.github.io/libraries/org/mcphackers/launchwrapper/1.0/launchwrapper-1.0.jar");
43+
wrapperArtifact.put("path", "org/mcphackers/launchwrapper/1.0/launchwrapper-1.0.jar");
44+
}
45+
if(wrapperSource != null) {
46+
wrapperArtifactSource = getLibraryArtifact(wrapperSource, "https://mcphackers.github.io/libraries/org/mcphackers/launchwrapper/1.0/launchwrapper-1.0-sources.jar");
47+
wrapperArtifactSource.put("path", "org/mcphackers/launchwrapper/1.0/launchwrapper-1.0-sources.jar");
48+
}
49+
} catch (IOException e) {
50+
e.printStackTrace();
51+
}
52+
}
53+
54+
public void generate() throws IOException {
55+
if(update) {
56+
update();
57+
} else {
58+
generateJSONs();
59+
}
60+
}
61+
62+
public void update() throws IOException {
63+
Files.list(basePath).forEach(p -> {
64+
String fileName = p.getFileName().toString();
65+
if(!Files.isRegularFile(p) || !fileName.endsWith(".json")) {
66+
return;
67+
}
68+
try {
69+
JSONObject json = parseJSON(p);
70+
JSONObject preset = getPresetJSON();
71+
JSONArray libraries = preset.getJSONArray("libraries");
72+
if(wrapperArtifact != null) {
73+
for(int i = libraries.length() - 1; i >= 0; i--) {
74+
JSONObject obj = libraries.getJSONObject(i);
75+
JSONObject downloads = obj.getJSONObject("downloads");
76+
if(obj.getString("name").equals("org.mcphackers:launchwrapper:1.0")) {
77+
downloads.put("artifact", wrapperArtifact);
78+
JSONObject classifiers = new JSONObject();
79+
classifiers.put("sources", wrapperArtifactSource);
80+
downloads.put("classifiers", classifiers);
81+
}
82+
}
83+
}
84+
JSONArray librariesNoSoundLib = new JSONArray(libraries);
85+
for(int i = librariesNoSoundLib.length() - 1; i >= 0; i--) {
86+
JSONObject obj = librariesNoSoundLib.getJSONObject(i);
87+
if(obj.getString("name").startsWith("com.paulscode:")) {
88+
librariesNoSoundLib.remove(i);
89+
}
90+
}
91+
boolean updated = false;
92+
JSONArray verLibs = json.getJSONArray("libraries");
93+
for(int i2 = verLibs.length() - 1; i2 >= 0; i2--) {
94+
//TODO change how libraries are removed
95+
JSONObject lib = verLibs.getJSONObject(i2);
96+
if(lib.getString("name").contains("lwjgl")) {
97+
verLibs.remove(i2);
98+
continue;
99+
}
100+
if(lib.getString("name").contains("jinput")) {
101+
verLibs.remove(i2);
102+
continue;
103+
}
104+
if(lib.getString("name").contains("jutils")) {
105+
verLibs.remove(i2);
106+
continue;
107+
}
108+
if(lib.getString("name").contains("paulscode")) {
109+
verLibs.remove(i2);
110+
continue;
111+
}
112+
if(lib.getString("name").contains("asm")) {
113+
verLibs.remove(i2);
114+
continue;
115+
}
116+
if(lib.getString("name").contains("org.json")) {
117+
verLibs.remove(i2);
118+
continue;
119+
}
120+
if(lib.getString("name").contains("launchwrapper")) {
121+
verLibs.remove(i2);
122+
continue;
123+
}
124+
}
125+
Instant time = getTime(json.getString("releaseTime"));
126+
updated = true; //TODO detect library changes?
127+
if(time.compareTo(PAULSCODE_TIME) > 0) {
128+
verLibs.putAll(libraries);
129+
} else {
130+
json.put("libraries", librariesNoSoundLib);
131+
}
132+
String args = json.getString("minecraftArguments");
133+
Instant releaseTimeInstant = getTime(json.getString("releaseTime"));
134+
int port = getPort(releaseTimeInstant);
135+
if(port != -1) {
136+
if(args.contains("--resourcesProxyPort")) {
137+
String old = args;
138+
args = args.replaceAll("--resourcesProxyPort \\S+", "--resourcesProxyPort " + port);
139+
updated |= !old.equals(args);
140+
} else {
141+
args += " --resourcesProxyPort " + port;
142+
updated = true;
143+
}
144+
}
145+
String skin = getSkin(releaseTimeInstant);
146+
if(skin != null) {
147+
if(args.contains("--skinProxy")) {
148+
String old = args;
149+
args = args.replaceAll("--skinProxy \\S+", "--skinProxy " + skin);
150+
updated |= !old.equals(args);
151+
} else {
152+
args += " --skinProxy " + skin;
153+
updated = true;
154+
}
155+
}
156+
json.put("minecraftArguments", args);
157+
if(updated) {
158+
json.put("time", getTimeString(Instant.now()));
159+
}
160+
try(BufferedWriter writer = Files.newBufferedWriter(p)) {
161+
json.write(writer);
162+
}
163+
String id = json.getString("id");
164+
if(packToFolders) {
165+
Files.copy(p, Files.createDirectory(basePath.resolve(id)).resolve(id + ".json"));
166+
}
167+
} catch (IOException e) {
168+
e.printStackTrace();
169+
}
170+
});
171+
}
172+
173+
public void generateJSONs() throws IOException {
174+
JSONObject manifest = getManifest();
175+
JSONObject preset = getPresetJSON();
176+
JSONArray libraries = preset.getJSONArray("libraries");
177+
if(wrapperArtifact != null) {
178+
for(int i = libraries.length() - 1; i >= 0; i--) {
179+
JSONObject obj = libraries.getJSONObject(i);
180+
if(obj.getString("name").equals("org.mcphackers:launchwrapper:1.0")) {
181+
obj.getJSONObject("downloads").put("artifact", wrapperArtifact);
182+
}
183+
}
184+
}
185+
JSONArray librariesNoSoundLib = new JSONArray(libraries);
186+
187+
Instant soundLibTime = PAULSCODE_TIME;
188+
for(int i = librariesNoSoundLib.length() - 1; i >= 0; i--) {
189+
JSONObject obj = librariesNoSoundLib.getJSONObject(i);
190+
if(obj.getString("name").startsWith("com.paulscode:")) {
191+
librariesNoSoundLib.remove(i);
192+
}
193+
}
194+
Files.createDirectories(basePath);
195+
List<String> savedJSONs = new ArrayList<>();
196+
// if(!skipCustom) {
197+
// JSONArray versionsList = Util.parseJSONArray(ClassLoader.getSystemResourceAsStream("versions.json"));
198+
// for(int i = 0; i < versionsList.length(); i++) {
199+
// JSONObject ver = versionsList.getJSONObject(i);
200+
// String id = ver.getString("id");
201+
// savedJSONs.add(id);
202+
// System.out.println(id);
203+
// Instant time = Instant.from(DateTimeFormatter.ISO_DATE_TIME.parse(ver.getString("releaseTime")));
204+
// String clientURL = ver.optString("urlClient", null);
205+
// String serverURL = ver.optString("urlServer", null);
206+
// JSONObject version = createVersionJSON(id, clientURL, serverURL, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC)).format(time).replace("Z", "+00:00"));
207+
// try(BufferedWriter writer = Files.newBufferedWriter(versionsDir.resolve(id + ".json"))) {
208+
// version.write(writer);
209+
// }
210+
// }
211+
// }
212+
if(!skipManifest) {
213+
JSONArray versions = manifest.getJSONArray("versions");
214+
for(int i = 0; i < versions.length(); i++) {
215+
JSONObject ver = versions.getJSONObject(i);
216+
URL versionUrl = new URL(ver.getString("url"));
217+
String id = ver.getString("id");
218+
if(savedJSONs.contains(id)) {
219+
continue;
220+
}
221+
if(!id.startsWith("1.7") && !id.startsWith("1.6") && !id.startsWith("13w")) {
222+
continue;
223+
}
224+
System.out.println(id);
225+
JSONObject version = parseJSON(versionUrl.openStream());
226+
if(!version.has("minecraftArguments")) {
227+
continue;
228+
}
229+
JSONArray verLibs = version.getJSONArray("libraries");
230+
for(int i2 = verLibs.length() - 1; i2 >= 0; i2--) {
231+
JSONObject lib = verLibs.getJSONObject(i2);
232+
if(lib.getString("name").contains("lwjgl")) {
233+
verLibs.remove(i2);
234+
continue;
235+
}
236+
if(lib.getString("name").contains("jinput")) {
237+
verLibs.remove(i2);
238+
continue;
239+
}
240+
if(lib.getString("name").contains("jutils")) {
241+
verLibs.remove(i2);
242+
continue;
243+
}
244+
if(lib.getString("name").contains("paulscode")) {
245+
verLibs.remove(i2);
246+
continue;
247+
}
248+
}
249+
Instant time = getTime(version.getString("releaseTime"));
250+
if(time.compareTo(soundLibTime) > 0) {
251+
verLibs.putAll(libraries);
252+
} else {
253+
verLibs.putAll(librariesNoSoundLib);
254+
}
255+
for(String key : preset.keySet()) {
256+
if(key.equals("libraries")) {
257+
continue;
258+
}
259+
version.put(key, preset.get(key));
260+
}
261+
String args = "--username ${auth_player_name} --session ${auth_session} --gameDir ${game_directory} --assetsDir ${game_assets}";
262+
int port = getPort(time);
263+
if(port != -1) {
264+
args += " --resourcesProxyPort " + port;
265+
}
266+
String skin = getSkin(time);
267+
if(skin != null) {
268+
args += " --skinProxy " + skin;
269+
}
270+
version.put("minecraftArguments", args);
271+
Path jsonOut = basePath.resolve(id + ".json");
272+
try(BufferedWriter writer = Files.newBufferedWriter(jsonOut)) {
273+
version.write(writer);
274+
}
275+
if(packToFolders) {
276+
Files.copy(jsonOut, Files.createDirectory(basePath.resolve(id)).resolve(id + ".json"));
277+
}
278+
}
279+
}
280+
}
281+
282+
public JSONObject createVersionJSON(String id, String clientURL, String serverURL, String releaseTime) throws IOException {
283+
JSONObject version = new JSONObject();
284+
JSONObject preset = getPresetJSON();
285+
JSONArray libraries = preset.getJSONArray("libraries");
286+
if(wrapperArtifact != null) {
287+
for(int i = libraries.length() - 1; i >= 0; i--) {
288+
JSONObject obj = libraries.getJSONObject(i);
289+
if(obj.getString("name").equals("org.mcphackers:launchwrapper:1.0")) {
290+
obj.getJSONObject("downloads").put("artifact", wrapperArtifact);
291+
}
292+
}
293+
}
294+
JSONArray librariesNoSoundLib = new JSONArray(libraries);
295+
296+
for(int i = librariesNoSoundLib.length() - 1; i >= 0; i--) {
297+
JSONObject obj = librariesNoSoundLib.getJSONObject(i);
298+
if(obj.getString("name").startsWith("com.paulscode:")) {
299+
librariesNoSoundLib.remove(i);
300+
}
301+
}
302+
JSONObject downloads = new JSONObject();
303+
version.put("downloads", downloads);
304+
if(clientURL != null) {
305+
JSONObject client = new JSONObject();
306+
byte[] jar = Util.readAllBytes(new URL(clientURL).openStream());
307+
String sha1 = Util.getSHA1(new ByteArrayInputStream(jar));
308+
client.put("url", clientURL);
309+
client.put("size", jar.length);
310+
client.put("sha1", sha1);
311+
312+
downloads.put("client", client);
313+
}
314+
if(serverURL != null) {
315+
JSONObject server = new JSONObject();
316+
byte[] jar = Util.readAllBytes(new URL(serverURL).openStream());
317+
String sha1 = Util.getSHA1(new ByteArrayInputStream(jar));
318+
server.put("url", serverURL);
319+
server.put("size", jar.length);
320+
server.put("sha1", sha1);
321+
322+
downloads.put("server", server);
323+
}
324+
version.put("id", id);
325+
if(id.startsWith("a") || id.startsWith("c") || id.startsWith("in")) {
326+
version.put("type", "old_alpha");
327+
}
328+
else if(id.startsWith("b")) {
329+
version.put("type", "old_beta");
330+
}
331+
else if(id.charAt(2) == 'w' || id.equals("1.2")) {
332+
version.put("type", "snapshot");
333+
} else {
334+
version.put("type", "release");
335+
}
336+
version.put("releaseTime", releaseTime);
337+
version.put("time", getTimeString(Instant.now()));
338+
Instant releaseTimeInstant = getTime(releaseTime);
339+
if(releaseTimeInstant.compareTo(PAULSCODE_TIME) > 0) {
340+
version.put("libraries", libraries);
341+
} else {
342+
version.put("libraries", librariesNoSoundLib);
343+
}
344+
for(String key : preset.keySet()) {
345+
if(key.equals("libraries")) {
346+
continue;
347+
}
348+
version.put(key, preset.get(key));
349+
}
350+
String args = "--username ${auth_player_name} --sessionid ${auth_session} --gameDir ${game_directory} --assetsDir ${game_assets}";
351+
int port = getPort(releaseTimeInstant);
352+
if(port != -1) {
353+
args += " --resourcesProxyPort " + port;
354+
}
355+
String skin = getSkin(releaseTimeInstant);
356+
if(skin != null) {
357+
args += " --skinProxy " + skin;
358+
}
359+
version.put("minecraftArguments", args);
360+
return version;
361+
}
362+
}

0 commit comments

Comments
 (0)