/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.miscfeatures.updater; import io.github.moulberry.notenoughupdates.util.NetUtils; import net.minecraft.client.Minecraft; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; abstract class UpdateLoader { enum State { NOTHING, DOWNLOAD_STARTED, DOWNLOAD_FINISHED, INSTALLED, FAILED } URL url; AutoUpdater updater; State state = State.NOTHING; UpdateLoader(AutoUpdater updater, URL url) { this.url = url; this.updater = updater; } public State getState() { return state; } public void setState(State state) { this.state = state; } public URL getUrl() { return url; } public void scheduleDownload() { state = State.DOWNLOAD_STARTED; try { NetUtils.downloadAsync(url, File.createTempFile("NotEnoughUpdates-update", ".jar")) .handle( (f, exc) -> { if (exc != null) { state = State.FAILED; updater.logProgress("§cError while downloading. Check your logs for more info."); exc.printStackTrace(); return null; } state = State.DOWNLOAD_FINISHED; updater.logProgress("Download completed. Trying to install"); launchUpdate(f); return null; }); } catch (IOException e) { state = State.FAILED; updater.logProgress("§cError while creating download. Check your logs for more info."); e.printStackTrace(); } } public abstract void greet(); public void launchUpdate(File file) { if (state != State.DOWNLOAD_FINISHED) { updater.logProgress("§cUpdate is invalid state " + state + " to start update."); state = State.FAILED; return; } File mcDataDir = new File(Minecraft.getMinecraft().mcDataDir, "mods"); if (!mcDataDir.exists() || !mcDataDir.isDirectory() || !mcDataDir.canRead()) { updater.logProgress("§cCould not find mods folder. Searched: " + mcDataDir); state = State.FAILED; return; } ArrayList toDelete = new ArrayList<>(); File[] modFiles = mcDataDir.listFiles(); if (modFiles == null) { updater.logProgress("§cCould not list minecraft mod folder (" + mcDataDir + ")"); state = State.FAILED; return; } for (File sus : modFiles) { if (sus.getName().endsWith(".jar")) { if (updater.isNeuJar(sus)) { updater.logProgress("Found old NEU file: " + sus + ". Deleting later."); toDelete.add(sus); } } } File dest = new File(mcDataDir, file.getName()); try ( InputStream i = Files.newInputStream(file.toPath()); OutputStream o = Files.newOutputStream(dest.toPath()); ) { IOUtils.copyLarge(i, o); } catch (IOException e) { e.printStackTrace(); updater.logProgress( "§cFailed to copy release JAR. Not making any changes to your mod folder. Consult your logs for more info."); state = State.FAILED; } deleteFiles(toDelete); if (state != State.FAILED) { state = State.INSTALLED; updater.logProgress("Update successful. Thank you for your time."); return; } updater.logProgress("§cFailure to delete some files. Please delte the old NEU version manually from your mods folder."); } public abstract void deleteFiles(List toDelete); }