diff options
Diffstat (limited to 'src/main/java/me/shedaniel/rei/update/UpdateChecker.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/update/UpdateChecker.java | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/src/main/java/me/shedaniel/rei/update/UpdateChecker.java b/src/main/java/me/shedaniel/rei/update/UpdateChecker.java new file mode 100644 index 000000000..9c60d9e6b --- /dev/null +++ b/src/main/java/me/shedaniel/rei/update/UpdateChecker.java @@ -0,0 +1,202 @@ +package me.shedaniel.rei.update; + +import com.google.common.collect.Lists; +import com.google.gson.*; +import com.google.gson.annotations.SerializedName; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.loader.FabricLoader; +import net.fabricmc.loader.ModContainer; +import net.minecraft.SharedConstants; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.StringTextComponent; +import net.minecraft.world.World; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringBufferInputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +public class UpdateChecker implements ClientModInitializer { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + private static Version currentVersion = null, latestForGame = null; + private static JsonVersionElement element; + private static World lastWorld = null; + private static String VERSION_STRING = "https://raw.githubusercontent.com/shedaniel/RoughlyEnoughItems/1.14/version.json"; + + public static boolean isOutdated() { + return latestForGame.compareTo(currentVersion) == 1 && currentVersion != null; + } + + public static UpdatePriority getUpdatePriority(List<Version> versions) { + UpdatePriority p = UpdatePriority.NONE; + List<UpdatePriority> priorities = Arrays.asList(UpdatePriority.values()); + for(UpdatePriority priority : versions.stream().map(UpdateChecker::getUpdatePriority).collect(Collectors.toList())) + if (priority.compareTo(p) > 0) + p = priority; + return p; + } + + public static UpdatePriority getUpdatePriority(Version version) { + JsonArray array = element.getChangelogs().getFabric(); + for(JsonElement element : array) { + JsonObject jsonObject = element.getAsJsonObject(); + if (jsonObject.has("version") && jsonObject.get("version").getAsString().equals(version.toString())) + return UpdatePriority.fromString(jsonObject.get("level").getAsString()); + } + return UpdatePriority.NONE; + } + + public static boolean checkUpdates() { + return RoughlyEnoughItemsCore.getConfigHelper().checkUpdates(); + } + + public static List<String> getChangelog(Version currentVersion) { + List<String> changelogs = Lists.newLinkedList(); + JsonArray array = element.getChangelogs().getFabric(); + array.forEach(jsonElement -> { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + Version jsonVersion = new Version(jsonObject.get("version").getAsString()); + if (jsonVersion.compareTo(currentVersion) > 0 && jsonVersion.compareTo(latestForGame) <= 0) + changelogs.add(I18n.translate("text.rei.update_changelog_line", jsonObject.get("text").getAsString())); + }); + return changelogs; + } + + public static Version getCurrentVersion() { + return currentVersion; + } + + public static Version getLatestForGame() { + return latestForGame; + } + + public static void onTick(MinecraftClient client) { + if (client.world != lastWorld) { + lastWorld = client.world; + if (lastWorld != null) { + if (checkUpdates() && isOutdated()) { + String currentVersionString = getCurrentVersion() == null ? "null" : getCurrentVersion().toString(); + List<Version> versions = getVersionsHigherThan(currentVersion); + String t[] = I18n.translate("text.rei.update_outdated", currentVersionString, getLatestForGame(), getUpdatePriority(versions).name().toUpperCase()).split("\n"); + for(String s : t) + client.player.addChatMessage(new StringTextComponent(s), false); + getChangelog(currentVersion).forEach(s -> client.player.addChatMessage(new StringTextComponent(s), false)); + } + } + } + } + + private static List<Version> getVersionsHigherThan(Version currentVersion) { + List<Version> versions = Lists.newLinkedList(); + JsonArray array = element.getChangelogs().getFabric(); + array.forEach(jsonElement -> { + Version jsonVersion = new Version(jsonElement.getAsJsonObject().get("version").getAsString()); + if (jsonVersion.compareTo(currentVersion) > 0) + versions.add(jsonVersion); + }); + return versions; + } + + @Override + public void onInitializeClient() { + if (!checkUpdates()) + return; + FabricLoader.INSTANCE.getMods().stream().map(ModContainer::getInfo).forEach(modInfo -> { + if (modInfo.getId().equals("roughlyenoughitems")) + try { + currentVersion = new Version(modInfo.getVersionString()); + } catch (Exception e) { + } + }); + InputStream downloadedStream = downloadVersionString(); + String downloadedString = null; + try { + downloadedString = IOUtils.toString(downloadedStream, StandardCharsets.UTF_8); + element = GSON.fromJson(downloadedString, JsonVersionElement.class); + } catch (IOException e) { + e.printStackTrace(); + } + if (downloadedString != null && !downloadedString.equalsIgnoreCase("{}")) + latestForGame = new Version(parseLatest(element, SharedConstants.getGameVersion().getName())); + else latestForGame = new Version("0.0.0"); + } + + private InputStream downloadVersionString() { + try { + URL versionUrl = new URL(VERSION_STRING); + return versionUrl.openStream(); + } catch (IOException e) { + return new StringBufferInputStream("{}"); + } + } + + private String parseLatest(JsonVersionElement element, String gameVersion) { + List<LatestVersionObject> objects = new LinkedList<>(element.getLatestVersions()); + for(int i = objects.size() - 1; i >= 0; i--) + if (objects.get(i).getGameVersion().equals(gameVersion)) + return objects.get(i).getModVersion(); + return objects.get(objects.size() - 1).getModVersion(); + } + + private class JsonVersionElement { + @SerializedName("latest") + private List<LatestVersionObject> latestVersions; + private ChangelogObject changelogs; + + public JsonVersionElement() { + this.latestVersions = Lists.newArrayList(); + changelogs = new ChangelogObject(); + } + + public List<LatestVersionObject> getLatestVersions() { + return latestVersions; + } + + public ChangelogObject getChangelogs() { + return changelogs; + } + } + + private class LatestVersionObject { + @SerializedName("game") + private String gameVersion = ""; + @SerializedName("mod") + private String modVersion = ""; + + public String getGameVersion() { + return gameVersion; + } + + public String getModVersion() { + return modVersion; + } + + @Override + public String toString() { + return String.format("LatestVersion[%s] = %s", getGameVersion(), getModVersion()); + } + } + + private class ChangelogObject { + private JsonArray fabric = new JsonArray(); + private JsonArray rift = new JsonArray(); + + public JsonArray getFabric() { + return fabric; + } + + public JsonArray getRift() { + return rift; + } + } + +} |
