package com.faforever.client.update;
import com.faforever.client.i18n.I18n;
import com.faforever.client.task.CompletableTask;
import com.google.common.io.CharStreams;
import com.google.common.reflect.TypeToken;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import javax.annotation.Resource;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class CheckForUpdateTask extends CompletableTask<UpdateInfo> {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private final Gson gson;
@Resource
Environment environment;
@Resource
I18n i18n;
private ComparableVersion currentVersion;
public CheckForUpdateTask() {
super(Priority.LOW);
gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
}
@Override
protected UpdateInfo call() throws Exception {
updateTitle(i18n.get("clientUpdateCheckTask.title"));
logger.info("Checking for client update");
String releasesUrl = environment.getProperty("github.releases.url");
int connectionTimeout = environment.getProperty("github.releases.timeout", int.class);
URL url = new URL(releasesUrl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(connectionTimeout);
try (Reader reader = new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8)) {
Type type = new TypeToken<List<GitHubRelease>>() {
}.getType();
StringBuilder to = new StringBuilder();
CharStreams.copy(reader, to);
List<GitHubRelease> releases = gson.fromJson(to.toString(), type);
GitHubRelease gitHubRelease = releases.get(0);
// Strip the "v" prefix
String strippedVersion = gitHubRelease.getName().substring(1);
ComparableVersion latestVersion = new ComparableVersion(strippedVersion);
logger.info("Current version is {}, newest version is {}", currentVersion, gitHubRelease.getName());
if (!(latestVersion.compareTo(currentVersion) > 0)) {
return null;
}
GitHubAsset gitHubAsset = gitHubRelease.getAssets()[0];
return new UpdateInfo(
gitHubRelease.getName(),
gitHubAsset.getName(),
gitHubAsset.getBrowserDownloadUrl(),
gitHubAsset.getSize(),
gitHubRelease.getHtmlUrl());
}
}
public void setCurrentVersion(ComparableVersion currentVersion) {
this.currentVersion = currentVersion;
}
}