diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java index 0f2b0b45..f1552b8d 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/LaunchServer.java @@ -111,6 +111,8 @@ public static final class Config { public String startScript; + public boolean updatesNotify = true; // Defaultly to true + public String getAddress() { return address; } diff --git a/LaunchServer/src/main/java/ru/gravit/launchserver/Updater.java b/LaunchServer/src/main/java/ru/gravit/launchserver/Updater.java index 0befa8f1..7136de39 100644 --- a/LaunchServer/src/main/java/ru/gravit/launchserver/Updater.java +++ b/LaunchServer/src/main/java/ru/gravit/launchserver/Updater.java @@ -1,6 +1,5 @@ package ru.gravit.launchserver; -import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -9,19 +8,26 @@ import java.util.Locale; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.kohsuke.github.GHRelease; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GitHub; +import ru.gravit.launcher.Launcher; +import ru.gravit.utils.Version; +import ru.gravit.utils.Version.Type; import ru.gravit.utils.helper.LogHelper; public class Updater extends TimerTask { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss", Locale.US); private static final long period = 1000*3600; + private static final Version VERSION = Launcher.getVersion(); private final Timer taskPool; private final GHRepository gravitLauncher; - private GHRelease parenRel = null; + private Version parent = VERSION; public Updater(LaunchServer srv) { this.taskPool = new Timer("Updater thread", true); @@ -29,26 +35,61 @@ public Updater(LaunchServer srv) { GHRepository gravitLauncherTmp = null; try { gravitLauncherTmp = GitHub.connectAnonymously().getOrganization("GravitLauncher").getRepository("Launcher"); - } catch (IOException e) { + } catch (Throwable e) { LogHelper.error(e); } this.gravitLauncher = gravitLauncherTmp; - run(); - taskPool.schedule(this, new Date(System.currentTimeMillis()+period), period); + if (srv.config.updatesNotify) taskPool.schedule(this, new Date(System.currentTimeMillis()+period), period); } @Override public void run() { try { GHRelease rel = gravitLauncher.getLatestRelease(); - if (rel.equals(parenRel)) return; - LogHelper.warning("Latest release: %s", rel.getName()); - LogHelper.warning("It`s published at: " + DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(rel.getPublished_at().getTime()), ZoneId.systemDefault()))); - parenRel = rel; - } catch (IOException e) { + Version relV = parseVer(rel.getTagName()); + if (relV == null) { + LogHelper.debug("Updater: parsing version error."); + return; + } + if (!parent.equals(relV)) parent = relV; + if (VERSION.major >= relV.major && VERSION.minor >= relV.minor + && VERSION.patch >= relV.patch && VERSION.build >= relV.build) return; + if (relV.release.equals(Type.STABLE) || relV.release.equals(Type.LTS)) { + LogHelper.warning("New %s release: %s", relV.getReleaseStatus(), relV.getVersionString()); + LogHelper.warning("You can download it: " + rel.getHtmlUrl().toString()); + LogHelper.warning("It`s published at: " + DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(rel.getPublished_at().getTime()), ZoneId.systemDefault()))); + } else { + LogHelper.debug("New %s release: %s", relV.getReleaseStatus(), relV.getVersionString()); + LogHelper.debug("You can download it: " + rel.getHtmlUrl()); + LogHelper.debug("It`s published at: " + DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(rel.getPublished_at().getTime()), ZoneId.systemDefault()))); + } + } catch (Throwable e) { LogHelper.error(e); } } + private static final Pattern startingVerPattern = Pattern.compile("\\d+\\.\\d+\\.\\d+"); + private static final Pattern pointPatternSpltitter = Pattern.compile("\\."); + + private static Version parseVer(String relS) { + Matcher verMatcher = startingVerPattern.matcher(relS); + if (!verMatcher.find()) return VERSION; + String[] ver = pointPatternSpltitter.split(relS.substring(verMatcher.start(), verMatcher.end())); + if (ver.length < 3) return VERSION; + return new Version(Integer.parseInt(ver[0]), Integer.parseInt(ver[1]), + Integer.parseInt(ver[2]), ver.length > 3 ? Integer.parseInt(ver[3]) : 0, findRelType(relS.substring(verMatcher.end()+1))); + } + + private static Type findRelType(String substring) { + if (substring.length() < 3 || substring.isEmpty()) return Type.UNKNOWN; + String tS = substring; + if (tS.startsWith("-")) tS = tS.substring(1); + final String wrk = tS.toLowerCase(Locale.ENGLISH); + final AtomicReference t = new AtomicReference(Type.UNKNOWN); + Type.unModTypes.forEach((s, type) -> { + if (wrk.startsWith(s)) t.set(type); + }); + return t.get(); + } } diff --git a/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/config.cfg b/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/config.cfg index 85f9a164..c0eaf34b 100644 --- a/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/config.cfg +++ b/LaunchServer/src/main/resources/ru/gravit/launchserver/defaults/config.cfg @@ -56,6 +56,7 @@ "isDownloadJava": false, "isWarningMissArchJava": true, "enabledProGuard": true, + "updatesNotify": true, "stripLineNumbers": true, "deleteTempFiles": true, "startScript": ".\\start.sh" diff --git a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java index 5d7858c6..8de9245a 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/profiles/ClientProfile.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.net.InetSocketAddress; -import java.nio.file.Path; import java.util.*; public final class ClientProfile implements Comparable { diff --git a/libLauncher/src/main/java/ru/gravit/utils/Version.java b/libLauncher/src/main/java/ru/gravit/utils/Version.java index 5795a7a8..1f0a0577 100644 --- a/libLauncher/src/main/java/ru/gravit/utils/Version.java +++ b/libLauncher/src/main/java/ru/gravit/utils/Version.java @@ -2,6 +2,11 @@ import ru.gravit.launcher.LauncherAPI; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; import java.util.Objects; public final class Version { @@ -68,34 +73,8 @@ public int hashCode() { @LauncherAPI public String getReleaseStatus() { - String result; - switch (release) { - case LTS: - result = "lts"; - break; - case STABLE: - result = "stable"; - break; - case BETA: - result = "beta"; - break; - case ALPHA: - result = "alpha"; - break; - case DEV: - result = "dev"; - break; - case EXPERIMENTAL: - result = "experimental"; - break; - case UNKNOWN: - result = ""; - break; - default: - result = ""; - break; - } - return result; + if (release.equals(Type.UNKNOWN)) return ""; + return release.name().toLowerCase(Locale.ENGLISH); } @Override @@ -112,6 +91,13 @@ public enum Type { ALPHA, DEV, EXPERIMENTAL, - UNKNOWN + UNKNOWN; + + private static final Map types = new HashMap<>(); + public static final Map unModTypes = Collections.unmodifiableMap(types); + + static { + Arrays.asList(values()).stream().forEach(type -> types.put(type.name().substring(0, type.name().length() < 3 ? type.name().length() : 3), type)); + } } } diff --git a/modules b/modules index 79e24c86..53106ee2 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 79e24c862b2324b7751f1520f9732eed31416c6d +Subproject commit 53106ee20700cb73ad65fd7dddf69b0d0b766f4c