Merge pull request #161 from GravitLauncher/feature/updater-VerCheck

Сравнение с версией на гитхабе в Updater.
This commit is contained in:
Gravit 2019-01-24 20:00:04 +07:00 committed by GitHub
commit ff569cc2ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 70 additions and 41 deletions

View file

@ -111,6 +111,8 @@ public static final class Config {
public String startScript;
public boolean updatesNotify = true; // Defaultly to true
public String getAddress() {
return address;
}

View file

@ -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<Type> t = new AtomicReference<Type>(Type.UNKNOWN);
Type.unModTypes.forEach((s, type) -> {
if (wrk.startsWith(s)) t.set(type);
});
return t.get();
}
}

View file

@ -56,6 +56,7 @@
"isDownloadJava": false,
"isWarningMissArchJava": true,
"enabledProGuard": true,
"updatesNotify": true,
"stripLineNumbers": true,
"deleteTempFiles": true,
"startScript": ".\\start.sh"

View file

@ -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<ClientProfile> {

View file

@ -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<String, Type> types = new HashMap<>();
public static final Map<String, Type> 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));
}
}
}

@ -1 +1 @@
Subproject commit 79e24c862b2324b7751f1520f9732eed31416c6d
Subproject commit 53106ee20700cb73ad65fd7dddf69b0d0b766f4c