Skip to content

Commit e9d28a6

Browse files
committed
Updater, hopefully a working one
1 parent 8fe6308 commit e9d28a6

11 files changed

Lines changed: 157 additions & 26 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ dependencies {
2222
// Required libraries
2323
implementation 'org.ow2.asm:asm:9.2'
2424

25-
implementation 'com.github.MCPHackers:RetroFernflower:65eb7e6ba3'
25+
implementation 'com.github.MCPHackers:RetroFernflower:bb99af2076'
2626
implementation 'org.fusesource.jansi:jansi:2.4.0'
2727
implementation 'net.fabricmc:tiny-remapper:0.6.0'
2828
// TODO: Don't gut MCInjector bundled ASM

src/main/java/org/mcphackers/mcp/EnumMode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public enum EnumMode {
1212
recompile("Recompile Minecraft sources", new TaskInfoRecompile(), new String[] {"debug", "side", "client", "server"}),
1313
reobfuscate("Reobfuscate Minecraft classes", new TaskInfoReobfuscate(), new String[] {"debug", "side", "client", "server"}),
1414
updatemd5("Update md5 hash tables used for reobfuscation", new TaskInfoUpdateMD5(), new String[] {"debug", "side", "client", "server"}),
15-
updatemcp("Download an update if available", null),
15+
updatemcp("Download an update if available", new TaskInfoDownloadUpdate()),
1616
setup("Choose a version to setup", new TaskInfoSetup(), new String[] {"debug"}),
1717
cleanup("Delete all source and class folders", new TaskInfoCleanup(), new String[] {"debug", "src"}),
1818
startclient("Runs the client from compiled classes", new TaskInfoRun(0), new String[] {"runbuild"}),
@@ -23,7 +23,7 @@ public enum EnumMode {
2323
public final String desc;
2424
public final TaskInfo task;
2525
public String[] params = new String[] {};
26-
private static Map<String, String> paramDescs = new HashMap<String, String>();
26+
private static final Map<String, String> paramDescs = new HashMap<String, String>();
2727

2828
private EnumMode(String desc, TaskInfo task) {
2929
this.desc = desc;

src/main/java/org/mcphackers/mcp/MCP.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import org.fusesource.jansi.Ansi;
55
import org.fusesource.jansi.AnsiConsole;
66
import org.mcphackers.mcp.tasks.info.TaskInfo;
7+
import org.mcphackers.mcp.tools.Util;
78
import org.mcphackers.mcp.tools.VersionsParser;
89

10+
import java.io.IOException;
911
import java.nio.file.Files;
1012
import java.nio.file.Paths;
1113
import java.util.*;
@@ -28,7 +30,23 @@ public class MCP {
2830
.fgCyan().a(" |_| \\_\\___|\\__|_| \\___/").fgYellow().a("|_| |_|\\_____|_| ").a('\n')
2931
.fgDefault();
3032

31-
public static void main(String[] args) {
33+
private static boolean checkIfUpdating(String[] args) throws IOException {
34+
if(args.length == 2) {
35+
if(args[0].equals("update")) {
36+
Util.runCommand(new String[] {
37+
Util.getJava(),
38+
"-jar",
39+
args[1]
40+
});
41+
return true;
42+
}
43+
}
44+
return false;
45+
}
46+
47+
public static void main(String[] args) throws Exception {
48+
if(checkIfUpdating(args)) return;
49+
Files.deleteIfExists(Paths.get(MCPConfig.UPDATE_JAR));
3250
SelfCommandPrompt.runWithCMD(SelfCommandPrompt.suggestAppId(), "RetroMCP " + VERSION, args);
3351
AnsiConsole.systemInstall();
3452
logger = new MCPLogger();
@@ -39,20 +57,19 @@ public static void main(String[] args) {
3957

4058
boolean startedWithNoParams = false;
4159
boolean exit = false;
42-
43-
if (args.length <= 0) {
44-
startedWithNoParams = true;
45-
logger.println(logo);
46-
}
60+
String version = null;
4761
if(Files.exists(Paths.get(MCPConfig.VERSION))) {
4862
try {
4963
VersionsParser.setCurrentVersion(new String(Files.readAllBytes(Paths.get(MCPConfig.VERSION))));
5064
} catch (Exception e) {
51-
logger.info(new Ansi().fgBrightRed().a("Unable to get current version!").fgDefault().toString());
65+
version = new Ansi().fgBrightRed().a("Unable to get current version!").fgDefault().toString();
5266
}
53-
logger.info(new Ansi().a("Current version: ").fgBrightCyan().a(VersionsParser.getCurrentVersion()).fgDefault().toString());
67+
version = new Ansi().a("Current version: ").fgBrightCyan().a(VersionsParser.getCurrentVersion()).fgDefault().toString();
5468
}
5569
if (args.length <= 0) {
70+
startedWithNoParams = true;
71+
logger.println(logo);
72+
if(version != null) logger.info(version);
5673
logger.println("Enter a command to execute:");
5774
}
5875
int executeTimes = 0;
@@ -116,7 +133,7 @@ public static void main(String[] args) {
116133
shutdown();
117134
}
118135

119-
private static void setParams(Map<String, Object> parsedArgs, EnumMode mode) {
136+
private static void setParams(Map<String, Object> parsedArgs, EnumMode mode) {
120137
for (Map.Entry<String, Object> arg : parsedArgs.entrySet()) {
121138
Object value = arg.getValue();
122139
String name = arg.getKey();

src/main/java/org/mcphackers/mcp/MCPConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class MCPConfig {
5656
public static final String BUILD_ZIP_SERVER = BUILD + "minecraft_server.zip";
5757
public static final String BUILD_JAR_CLIENT = BUILD + "minecraft.jar";
5858
public static final String BUILD_JAR_SERVER = BUILD + "minecraft_server.jar";
59+
public static final String UPDATE_JAR = "update.jar";
5960

6061
public boolean debug;
6162
public boolean patch;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.mcphackers.mcp.tasks;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.net.URL;
6+
import java.nio.file.Files;
7+
import java.nio.file.Path;
8+
import java.nio.file.Paths;
9+
10+
import org.json.JSONObject;
11+
import org.mcphackers.mcp.MCP;
12+
import org.mcphackers.mcp.MCPConfig;
13+
import org.mcphackers.mcp.tasks.info.TaskInfo;
14+
import org.mcphackers.mcp.tools.FileUtil;
15+
import org.mcphackers.mcp.tools.Util;
16+
17+
public class TaskDownloadUpdate extends Task {
18+
19+
private static final String API = "https://api.github.com/repos/MCPHackers/RetroMCP-Java/releases/latest";
20+
21+
public TaskDownloadUpdate(TaskInfo info) {
22+
super(-1 , info);
23+
}
24+
25+
@Override
26+
public void doTask() throws Exception {
27+
URL updateURL = new URL(API);
28+
InputStream in = updateURL.openStream();
29+
JSONObject releaseJson = Util.parseJSONFile(in);
30+
String latestVersion = releaseJson.getString("tag_name");
31+
String notes = releaseJson.getString("body");
32+
if(!latestVersion.equals(MCP.VERSION)) {
33+
MCP.logger.info("New version found: " + latestVersion);
34+
MCP.logger.info(notes);
35+
for(Object obj : releaseJson.getJSONArray("assets")) {
36+
if(obj instanceof JSONObject) {
37+
JSONObject assetObj = (JSONObject)obj;
38+
if(!assetObj.getString("name").endsWith(".jar")) {
39+
continue;
40+
}
41+
FileUtil.downloadFile(new URL(assetObj.getString("browser_download_url")), Paths.get("update.jar"));
42+
}
43+
}
44+
MCP.logger.info("Press return key to continue");
45+
MCP.input.nextLine();
46+
Path jarPath = Paths.get(MCP.class
47+
.getProtectionDomain()
48+
.getCodeSource()
49+
.getLocation()
50+
.toURI());
51+
if(!Files.isDirectory(jarPath)) {
52+
Files.copy(jarPath, Paths.get(MCPConfig.UPDATE_JAR));
53+
Util.runCommand(new String[] {
54+
Util.getJava(),
55+
"-jar",
56+
MCPConfig.UPDATE_JAR,
57+
"update",
58+
jarPath.toString()
59+
});
60+
System.exit(0);
61+
}
62+
else {
63+
throw new IOException("Running from a folder! Aborting");
64+
}
65+
}
66+
}
67+
}

src/main/java/org/mcphackers/mcp/tasks/TaskRun.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.mcphackers.mcp.tasks;
22

3-
import java.io.File;
43
import java.nio.file.Files;
54
import java.nio.file.Paths;
65
import java.util.ArrayList;
@@ -22,7 +21,7 @@ public TaskRun(int side, TaskInfo info) {
2221

2322
@Override
2423
public void doTask() throws Exception {
25-
String java = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java";
24+
String java = Util.getJava();
2625
String natives = FileUtil.absolutePathString(MCPConfig.NATIVES);
2726
List<String> cpList = new LinkedList<String>();
2827
if(side == SERVER) {

src/main/java/org/mcphackers/mcp/tasks/TaskSetup.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.mcphackers.mcp.tasks;
22

3-
import java.net.URI;
3+
import java.net.URL;
44
import java.nio.file.Files;
55
import java.nio.file.Path;
66
import java.nio.file.Paths;
@@ -59,7 +59,7 @@ public void doTask() throws Exception {
5959
MCP.logger.info(new Ansi().fgMagenta().a("================ ").fgDefault().a("Current versions").fgMagenta().a(" ================").fgDefault().toString());
6060
MCP.logger.info(getTable(versions));
6161
MCP.logger.info(new Ansi().fgMagenta().a("==================================================").fgDefault().toString());
62-
MCP.logger.info(new Ansi().fgYellow().a("If you wish to supply your own configuration, type \"custom\".").fgDefault().toString());
62+
//MCP.logger.info(new Ansi().fgYellow().a("If you wish to supply your own configuration, type \"custom\".").fgDefault().toString());
6363
}
6464
// Keep asking until they have a valid option
6565
while (!versions.contains(chosenVersion)) {
@@ -97,19 +97,19 @@ public void doTask() throws Exception {
9797
String url = VersionsParser.getDownloadURL(side);
9898
// TODO Classic server zips
9999
Path pathOut = Paths.get(side == CLIENT ? MCPConfig.CLIENT : MCPConfig.SERVER);
100-
FileUtil.downloadFile(new URI(url).toURL(), pathOut);
100+
FileUtil.downloadFile(new URL(url), pathOut);
101101
MCP.logger.info(" Done in " + Util.time(System.currentTimeMillis() - startTime));
102102
}
103103
}
104104

105105
MCP.logger.info(" Downloading libraries...");
106106
startTime = System.currentTimeMillis();
107-
FileUtil.downloadFile(new URI(libsURL).toURL(), Paths.get(MCPConfig.LIB + "libs.zip"));
107+
FileUtil.downloadFile(new URL(libsURL), Paths.get(MCPConfig.LIB + "libs.zip"));
108108
String nativesURL = natives.get(Util.getOperatingSystem());
109109
if(nativesURL == null) {
110110
throw new Exception("Could not find natives for your operating system");
111111
}
112-
FileUtil.downloadFile(new URI(nativesURL).toURL(), Paths.get(MCPConfig.LIB + "natives.zip"));
112+
FileUtil.downloadFile(new URL(nativesURL), Paths.get(MCPConfig.LIB + "natives.zip"));
113113
MCP.logger.info(" Done in " + Util.time(System.currentTimeMillis() - startTime));
114114
FileUtil.unzip(Paths.get(MCPConfig.LIB + "libs.zip"), Paths.get(MCPConfig.LIB), true);
115115
FileUtil.unzip(Paths.get(MCPConfig.LIB + "natives.zip"), Paths.get(MCPConfig.NATIVES), true);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.mcphackers.mcp.tasks.info;
2+
3+
import org.mcphackers.mcp.tasks.Task;
4+
import org.mcphackers.mcp.tasks.TaskDownloadUpdate;
5+
6+
public class TaskInfoDownloadUpdate extends TaskInfo {
7+
@Override
8+
public String title() {
9+
return "Setting up";
10+
}
11+
12+
@Override
13+
public String successMsg() {
14+
return "UP TO DATE!";
15+
}
16+
17+
@Override
18+
public String failMsg() {
19+
return "COULD NOT FETCH LATEST RELEASE!";
20+
}
21+
22+
@Override
23+
public Task newTask(int side) {
24+
return new TaskDownloadUpdate(this);
25+
}
26+
27+
@Override
28+
public boolean isMultiThreaded() {
29+
return false;
30+
}
31+
}

src/main/java/org/mcphackers/mcp/tools/FileUtil.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.io.FileOutputStream;
55
import java.io.IOException;
66
import java.io.InputStream;
7-
import java.net.URI;
87
import java.net.URISyntaxException;
98
import java.net.URL;
109
import java.nio.channels.Channels;
@@ -109,10 +108,10 @@ public static void downloadGitDir(URL url, Path output) throws IOException, URIS
109108
if(jsonObject.getString("type").equals("dir")) {
110109
Path dir = output.resolve(jsonObject.getString("name"));
111110
createDirectories(dir);
112-
downloadGitDir(new URI(jsonObject.getString("url")).toURL(), dir);
111+
downloadGitDir(new URL(jsonObject.getString("url")), dir);
113112
}
114113
else if (jsonObject.getString("type").equals("file")) {
115-
downloadFile(new URI(jsonObject.getString("download_url")).toURL(), output.resolve(jsonObject.getString("name")));
114+
downloadFile(new URL(jsonObject.getString("download_url")), output.resolve(jsonObject.getString("name")));
116115
}
117116
}
118117
}

src/main/java/org/mcphackers/mcp/tools/Util.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public void run() {
4949
return proc.exitValue();
5050
}
5151

52+
public static void runCommand(String[] cmd) throws IOException {
53+
ProcessBuilder procBuilder = new ProcessBuilder(cmd);
54+
procBuilder.start();
55+
}
56+
5257
public static OS getOperatingSystem() {
5358
String osName = System.getProperty("os.name").toLowerCase();
5459
return osName.contains("win") ? OS.windows
@@ -174,4 +179,8 @@ public static <K, V> K getKey(Map<K, V> map, V value) {
174179
}
175180
return null;
176181
}
182+
183+
public static String getJava() {
184+
return System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java";
185+
}
177186
}

0 commit comments

Comments
 (0)