diff --git a/Readme.md b/Readme.md index e4d5e3791..28949f4ab 100644 --- a/Readme.md +++ b/Readme.md @@ -17,8 +17,11 @@ It should be automatically included when pulling the full mod. XZ for Java (data compression)\ https://tukaani.org/xz/java.html -Toml for Java (config handling)\ +Json & Toml for Java (config handling)\ https://github.com/TheElectronWill/night-config -Json for Java (config handling)\ -https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple \ No newline at end of file +SVG Salamander for SVG's\ +https://github.com/blackears/svgSalamander + +FlatLaf for theming (Tempory to test stuff)\ +https://www.formdev.com/flatlaf/ diff --git a/core/src/main/java/com/seibel/lod/core/config/Config.java b/core/src/main/java/com/seibel/lod/core/config/Config.java index 7c38b4fc7..c36dcafd3 100644 --- a/core/src/main/java/com/seibel/lod/core/config/Config.java +++ b/core/src/main/java/com/seibel/lod/core/config/Config.java @@ -873,7 +873,7 @@ public class Config public static class AutoUpdater { public static ConfigEntry enableAutoUpdater = new ConfigEntry.Builder() - .set(false) // Keep this as false for development + .set(false) // Keep this as false for development but should be set to true when released .comment("Automatically checks for updates on game launch") .build(); diff --git a/core/src/main/java/com/seibel/lod/core/jar/installer/ModrinthGetter.java b/core/src/main/java/com/seibel/lod/core/jar/installer/ModrinthGetter.java index 1d0c4f91c..475dae491 100644 --- a/core/src/main/java/com/seibel/lod/core/jar/installer/ModrinthGetter.java +++ b/core/src/main/java/com/seibel/lod/core/jar/installer/ModrinthGetter.java @@ -16,7 +16,7 @@ import java.util.*; public class ModrinthGetter { public static final String ModrinthAPI = "https://api.modrinth.com/v2/project/"; public static final String projectID = "distanthorizons"; - public static Config projectRelease = Config.inMemory(); + public static ArrayList projectRelease; public static List releaseID = new ArrayList<>(); // This list contains the release ID's public static List mcVersions = new ArrayList<>(); // List of available Minecraft versions in the mod @@ -36,18 +36,24 @@ public class ModrinthGetter { public static boolean init() { try { - JsonFormat.fancyInstance().createParser().parse(WebDownloader.downloadAsString(new URL(ModrinthAPI+projectID+"/version")), projectRelease, ParsingMode.REPLACE); + projectRelease = JsonFormat.fancyInstance().createParser().parse("{\"E\":" + WebDownloader.downloadAsString(new URL(ModrinthAPI+projectID+"/version")) + "}").get("E"); - for (int i = 0; i < projectRelease.size(); i++) { - Config currentRelease = (Config) projectRelease.get(String.valueOf(i)); + for (Config currentRelease: projectRelease) { String workingID = currentRelease.get("id").toString(); releaseID.add(workingID); releaseNames.put(workingID, currentRelease.get("name").toString().replaceAll(" - 1\\..*", "")); changeLogs.put(workingID, currentRelease.get("changelog").toString()); try { - downloadUrl.put(workingID, new URL(currentRelease.get("files.0.url").toString())); + downloadUrl.put(workingID, + new URL( + ((Config) + ((ArrayList) currentRelease.get("files")) + .get(0)) + .get("url") + .toString() + )); } catch (Exception e) { e.printStackTrace(); } // Get all the mc versions this mod is available for @@ -71,21 +77,17 @@ public class ModrinthGetter { } public static String getLatestNameForVersion(String mcVer) { - return releaseNames.get(((List) mcVerToReleaseID.get(mcVer)).get(0)); + return releaseNames.get(mcVerToReleaseID.get(mcVer).get(0)); } public static URL getLatestDownloadForVersion(String mcVer) { - return downloadUrl.get(((List) mcVerToReleaseID.get(mcVer)).get(0)); + return downloadUrl.get(mcVerToReleaseID.get(mcVer).get(0)); } public static String getLatestShaForVersion(String mcVer) { - return projectRelease.get(mcVersions.indexOf(mcVer) + ".files.0.hashes.sha1").toString(); -// return ((JSONObject) -// ((JSONObject) -// ((JSONArray) -// ((JSONObject) projectRelease.get(mcVersions.indexOf(mcVer))) -// .get("files")) -// .get(0)) -// .get("hashes")) -// .get("sha1") -// .toString(); + return ((Config) + ((ArrayList) projectRelease.get( + mcVersions.indexOf(mcVer) + ).get("files")).get(0)) + .get("hashes.sha1") + .toString(); } } diff --git a/core/src/main/java/com/seibel/lod/core/jar/updater/SelfUpdater.java b/core/src/main/java/com/seibel/lod/core/jar/updater/SelfUpdater.java new file mode 100644 index 000000000..9f2ece7d0 --- /dev/null +++ b/core/src/main/java/com/seibel/lod/core/jar/updater/SelfUpdater.java @@ -0,0 +1,91 @@ +package com.seibel.lod.core.jar.updater; + +import com.seibel.lod.core.ModInfo; +import com.seibel.lod.core.config.Config; +import com.seibel.lod.core.dependencyInjection.SingletonInjector; +import com.seibel.lod.core.jar.JarUtils; +import com.seibel.lod.core.jar.installer.ModrinthGetter; +import com.seibel.lod.core.jar.installer.WebDownloader; +import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.wrapperInterfaces.IVersionConstants; +import org.apache.logging.log4j.Logger; + +import java.nio.file.Files; +import java.security.MessageDigest; + +/** + * Used to update the mod automatically + * + * @author coolGi + */ +public class SelfUpdater { + private static final Logger LOGGER = DhLoggerBuilder.getLogger(SelfUpdater.class.getSimpleName()); + + /** As we cannot delete(or replace) the jar while the mod is running, we just have this to delete it once the game closes */ + public static boolean deleteOldOnClose = false; + + /** + * Should be called on the game starting. + * (After the config has been initialised) + * @return Whether it should open the update ui + */ + public static boolean onStart() { + // Some init stuff + // We use sha1 to check the version as our versioning system is different to the one on modrinth + if (!ModrinthGetter.init()) return false; + String jarSha = ""; + try { jarSha = JarUtils.getFileChecksum(MessageDigest.getInstance("SHA"), JarUtils.jarFile); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + String mcVersion = SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion(); + + // Check the sha's of both our stuff + if (jarSha.equals(ModrinthGetter.getLatestShaForVersion(mcVersion))) + return false; + + + LOGGER.info("New version ("+ModrinthGetter.getLatestNameForVersion(mcVersion)+") of "+ ModInfo.READABLE_NAME+" is available"); + if (!Config.Client.AutoUpdater.promptForUpdate.get()) { + // Auto-update mod + updateMod(mcVersion); + return false; + } // else + return true; + } + + /** + * Should be called when the game is closed. + * This is ued to delete the previous file if it is required at the end. + */ + public static void onClose() { + if (deleteOldOnClose) { + try { + Files.delete(JarUtils.jarFile.toPath()); + } catch (Exception e) { + LOGGER.warn("Failed to delete previous " + ModInfo.READABLE_NAME + " file, please delete it manually at [" + JarUtils.jarFile + "]"); + e.printStackTrace(); + } + } + } + + public static boolean updateMod() { + return updateMod( + SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion() + ); + } + public static boolean updateMod(String minecraftVersion) { + try { + LOGGER.info("Attempting to auto update " + ModInfo.READABLE_NAME); + WebDownloader.downloadAsFile(ModrinthGetter.getLatestDownloadForVersion(minecraftVersion), JarUtils.jarFile.getParentFile().toPath().resolve(ModInfo.NAME + "-" + ModrinthGetter.getLatestNameForVersion(minecraftVersion) + ".jar").toFile()); + deleteOldOnClose = true; + LOGGER.info(ModInfo.READABLE_NAME + " successfully updated. It will apply on game's relaunch"); + return true; + } catch (Exception e) { + LOGGER.info("Failed to update "+ModInfo.READABLE_NAME+" to version "+ModrinthGetter.getLatestNameForVersion(minecraftVersion)); + e.printStackTrace(); + return false; + } + } +} diff --git a/core/src/main/resources/assets/lod/lang/en_us.json b/core/src/main/resources/assets/lod/lang/en_us.json index 75d0dbb1f..6b0f080fd 100644 --- a/core/src/main/resources/assets/lod/lang/en_us.json +++ b/core/src/main/resources/assets/lod/lang/en_us.json @@ -7,9 +7,9 @@ "lod.updater.title": "Distant Horizons auto updater", "lod.updater.text1": - "There is a new update for Distant Horizons available", + "§lUpdate for Distant Horizons available!", "lod.updater.text2": - "Would you like to automatically update from version %s to %s", + "§fWould you like to automatically update from version %s§f to %s§f?", "lod.updater.later": "Later", "lod.updater.never": @@ -18,9 +18,9 @@ "Update", "lod.updater.update.@tooltip": "Updates the mod this 1 time\n(Updates when game closed)", - "lod.updater.silentUpdate": + "lod.updater.silent": "Always silent update", - "lod.updater.silentUpdate.@tooltip": + "lod.updater.silent.@tooltip": "Every time an update is available, it would update\n(§6WARNING§r: It wont prompt the user on an update, tough it would keep the mod up to date)", diff --git a/core/src/main/resources/logo.png b/core/src/main/resources/logo.png index 93b5294d6..8127192e7 100644 Binary files a/core/src/main/resources/logo.png and b/core/src/main/resources/logo.png differ