2019-01-21 12:11:56 +03:00
package ru.gravit.launchserver ;
import java.time.Instant ;
import java.time.LocalDateTime ;
import java.time.ZoneId ;
import java.time.format.DateTimeFormatter ;
import java.util.Date ;
import java.util.Locale ;
import java.util.Timer ;
import java.util.TimerTask ;
2019-01-22 22:12:56 +03:00
import java.util.concurrent.atomic.AtomicReference ;
2019-01-22 16:49:58 +03:00
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
2019-01-21 12:11:56 +03:00
import org.kohsuke.github.GHRelease ;
import org.kohsuke.github.GHRepository ;
import org.kohsuke.github.GitHub ;
2019-01-22 16:49:58 +03:00
import ru.gravit.launcher.Launcher ;
import ru.gravit.utils.Version ;
import ru.gravit.utils.Version.Type ;
2019-01-21 12:11:56 +03:00
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 ;
2019-01-22 21:25:51 +03:00
private static final Version VERSION = Launcher . getVersion ( ) ;
2019-01-21 12:11:56 +03:00
private final Timer taskPool ;
private final GHRepository gravitLauncher ;
2019-01-22 22:12:56 +03:00
private Version parent = VERSION ;
2019-01-24 15:43:39 +03:00
2019-01-21 12:11:56 +03:00
public Updater ( LaunchServer srv ) {
this . taskPool = new Timer ( " Updater thread " , true ) ;
GHRepository gravitLauncherTmp = null ;
try {
gravitLauncherTmp = GitHub . connectAnonymously ( ) . getOrganization ( " GravitLauncher " ) . getRepository ( " Launcher " ) ;
2019-01-22 16:52:32 +03:00
} catch ( Throwable e ) {
2019-01-21 12:11:56 +03:00
LogHelper . error ( e ) ;
}
this . gravitLauncher = gravitLauncherTmp ;
run ( ) ;
2019-01-22 16:49:58 +03:00
if ( srv . config . updatesNotify ) taskPool . schedule ( this , new Date ( System . currentTimeMillis ( ) + period ) , period ) ;
2019-01-21 12:11:56 +03:00
}
@Override
public void run ( ) {
try {
GHRelease rel = gravitLauncher . getLatestRelease ( ) ;
2019-01-22 16:49:58 +03:00
Version relV = parseVer ( rel . getTagName ( ) ) ;
2019-01-24 15:43:39 +03:00
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 ;
2019-01-22 16:49:58 +03:00
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 ( ) ) ) ) ;
}
2019-01-22 16:52:32 +03:00
} catch ( Throwable e ) {
2019-01-21 12:11:56 +03:00
LogHelper . error ( e ) ;
}
}
2019-01-22 16:49:58 +03:00
private static final Pattern startingVerPattern = Pattern . compile ( " \\ d+ \\ . \\ d+ \\ . \\ d+ " ) ;
2019-01-24 15:43:39 +03:00
private static final Pattern pointPatternSpltitter = Pattern . compile ( " \\ . " ) ;
2019-01-22 16:49:58 +03:00
2019-01-22 21:25:51 +03:00
private static Version parseVer ( String relS ) {
2019-01-22 16:49:58 +03:00
Matcher verMatcher = startingVerPattern . matcher ( relS ) ;
2019-01-22 22:12:56 +03:00
if ( ! verMatcher . find ( ) ) return VERSION ;
2019-01-24 15:43:39 +03:00
String [ ] ver = pointPatternSpltitter . split ( relS . substring ( verMatcher . start ( ) , verMatcher . end ( ) ) ) ;
2019-01-22 22:12:56 +03:00
if ( ver . length < 3 ) return VERSION ;
2019-01-22 16:49:58 +03:00
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 ;
2019-01-22 21:25:51 +03:00
if ( tS . startsWith ( " - " ) ) tS = tS . substring ( 1 ) ;
2019-01-22 22:12:56 +03:00
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 ( ) ;
2019-01-22 16:49:58 +03:00
}
2019-01-21 12:11:56 +03:00
}