Skip to content

Commit df0f9f3

Browse files
committed
Reimplement Patcher update checking
Closes: #5
1 parent 7027d99 commit df0f9f3

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

src/main/java/org/kettingpowered/launcher/KettingLauncher.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ public class KettingLauncher {
6868
public void init() throws Exception {
6969
final String mc_version = MCVersion.getMc(args);
7070
//This cannot get moved past the ensureOneServerAndUpdate call.
71-
//It will cause the just downloaded server to be removed, which causes issues.
72-
//noinspection ConstantValue
73-
if (false) { //todo: patcher update checking
71+
//It will cause the just downloaded server to be removed, which causes issues.
72+
if (Patcher.checkUpdateNeeded()) {
7473
if (Main.DEBUG) System.out.println("Patcher needs updating.");
7574
//prematurely delete files to prevent errors
7675
FileUtils.deleteDir(KettingFiles.NMS_BASE_DIR);
@@ -147,7 +146,6 @@ else if(versions.size() > 1) {
147146
}
148147
serverVersion = parsedServerVersions.get(0);
149148
}
150-
//todo: Server version is populated here. We could theoretically do what used to be the patched invalidation check here.
151149
if (args.enableServerUpdator() || needsDownload) {
152150
final String mc_minecraft_forge = String.format("%s-%s-%s", mc_mmp, serverVersion.t1(), serverVersion.t2());
153151
final File forgeDir = new File(KettingFiles.KETTINGSERVER_FORGE_DIR,mc_minecraft_forge);
@@ -162,8 +160,12 @@ else if(versions.size() > 1) {
162160
final MavenArtifact installerJsonArtifact = new MavenArtifact(KettingConstants.KETTINGSERVER_GROUP, Main.FORGE_SERVER_ARTIFACT_ID, mc_minecraft_forge, Optional.of("installscript"), Optional.of("json"));
163161
final MavenArtifact kettingLibsArtifact = new MavenArtifact(KettingConstants.KETTINGSERVER_GROUP, Main.FORGE_SERVER_ARTIFACT_ID, mc_minecraft_forge, Optional.of("ketting-libraries"), Optional.of("txt"));
164162
final MavenArtifact universalJarArtifact = new MavenArtifact(KettingConstants.KETTINGSERVER_GROUP, Main.FORGE_SERVER_ARTIFACT_ID, mc_minecraft_forge, Optional.of("universal"), Optional.of("jar"));
165-
166-
serverBinPatchesArtifact.downloadDependencyAndHash();
163+
164+
//noinspection ResultOfMethodCallIgnored
165+
KettingFiles.SERVER_LZMA.getParentFile().mkdirs();
166+
//noinspection ResultOfMethodCallIgnored
167+
KettingFiles.SERVER_LZMA.delete();
168+
if (!serverBinPatchesArtifact.downloadDependencyAndHash().renameTo(KettingFiles.SERVER_LZMA)) System.err.println("An error occurred, whilst moving Server Binary Patches to it's correct location. There might be errors Patching!");
167169
installerJsonArtifact.downloadDependencyAndHash();
168170
kettingLibsArtifact.downloadDependencyAndHash();
169171
universalJarArtifact.downloadDependencyAndHash();
@@ -205,7 +207,7 @@ void launch() throws Exception {
205207
Libraries.downloadMcp();
206208

207209

208-
new Patcher(); //todo: patcher update checking
210+
if (Patcher.checkUpdateNeeded()) new Patcher();
209211

210212
System.out.println("Launching Ketting...");
211213
final List<String> arg_list = new ArrayList<>(args.args());

src/main/java/org/kettingpowered/launcher/Patcher.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,19 @@
1111
import org.kettingpowered.ketting.internal.KettingFileVersioned;
1212
import org.kettingpowered.ketting.internal.KettingFiles;
1313
import org.kettingpowered.launcher.betterui.BetterUI;
14+
import org.kettingpowered.launcher.internal.utils.Hash;
1415
import org.kettingpowered.launcher.internal.utils.NetworkUtils;
1516
import org.kettingpowered.launcher.utils.Processors;
1617

18+
import java.io.BufferedReader;
19+
import java.io.BufferedWriter;
1720
import java.io.File;
1821
import java.io.FileOutputStream;
1922
import java.io.FileReader;
23+
import java.io.FileWriter;
2024
import java.io.IOException;
2125
import java.io.PrintStream;
26+
import java.security.NoSuchAlgorithmException;
2227
import java.util.ArrayList;
2328
import java.util.HashMap;
2429
import java.util.List;
@@ -32,7 +37,7 @@ public class Patcher {
3237
private final PrintStream out = System.out;
3338
private PrintStream log;
3439

35-
public Patcher() throws IOException {
40+
public Patcher() throws IOException, NoSuchAlgorithmException {
3641
downloadServer();
3742
readInstallScript();
3843
prepareTokens();
@@ -119,7 +124,7 @@ private void prepareTokens() {
119124
tokens.put("{BINPATCH}", KettingFiles.SERVER_LZMA.getAbsolutePath());
120125
}
121126

122-
private void readAndExecuteProcessors() throws IOException {
127+
private void readAndExecuteProcessors() throws IOException, NoSuchAlgorithmException {
123128
final File logFile = KettingFiles.PATCHER_LOGS;
124129
if (!logFile.exists()) {
125130
try {
@@ -182,6 +187,43 @@ public void write(int b) {
182187
}
183188
});
184189
}
190+
writeStoredHashes();
191+
}
192+
private static void writeStoredHashes() throws IOException, NoSuchAlgorithmException {
193+
try (BufferedWriter writer = new BufferedWriter(new FileWriter(KettingFiles.STORED_HASHES))){
194+
writer
195+
.append("installJson=")
196+
.append(Hash.getHash(KettingFileVersioned.FORGE_INSTALL_JSON, "SHA3-512"))
197+
.append("\nserverLzma=")
198+
.append(Hash.getHash(KettingFiles.SERVER_LZMA, "SHA3-512"))
199+
.append("\nserver=")
200+
.append(Hash.getHash(KettingFileVersioned.SERVER_JAR, "SHA3-512"));
201+
}
202+
}
203+
public static boolean checkUpdateNeeded() {
204+
if (!KettingFiles.STORED_HASHES.exists()) return true;
205+
try (BufferedReader reader = new BufferedReader(new FileReader(KettingFiles.STORED_HASHES))){
206+
return !reader.lines()
207+
.allMatch(string -> {
208+
String[] args = string.split("=");
209+
String value = args[1].trim();
210+
try {
211+
return switch (args[0].trim()) {
212+
case "installJson" ->
213+
value.equals(Hash.getHash(KettingFileVersioned.FORGE_INSTALL_JSON, "SHA3-512"));
214+
case "serverLzma" ->
215+
value.equals(Hash.getHash(KettingFiles.SERVER_LZMA, "SHA3-512"));
216+
case "server" ->
217+
value.equals(Hash.getHash(KettingFileVersioned.SERVER_JAR, "SHA3-512"));
218+
default -> false;
219+
};
220+
} catch (NoSuchAlgorithmException | IOException e) {
221+
return false;
222+
}
223+
});
224+
}catch (Exception ignored) {
225+
return true;
226+
}
185227
}
186228

187229
private void mute() {

src/main/java/org/kettingpowered/launcher/internal/utils/Hash.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.kettingpowered.launcher.internal.utils;
22

33

4+
import org.kettingpowered.launcher.KettingLauncher;
5+
46
import java.io.File;
57
import java.io.FileInputStream;
68
import java.io.IOException;
@@ -21,7 +23,7 @@ public static String getHash(File file, String algorithm) throws NoSuchAlgorithm
2123
public static String getHash(InputStream stream, String algorithm) throws NoSuchAlgorithmException, IOException {
2224
MessageDigest digest = MessageDigest.getInstance(algorithm);
2325

24-
byte[] buffer = new byte[1024];
26+
byte[] buffer = new byte[KettingLauncher.BufferSize];
2527
int total;
2628
while ((total = stream.read(buffer)) != -1) {
2729
digest.update(buffer, 0, total);

0 commit comments

Comments
 (0)