2020-06-24 18:21:26 +00:00
|
|
|
package com.thebrokenrail.modupdater.strategy;
|
|
|
|
|
|
|
|
import com.squareup.moshi.JsonAdapter;
|
|
|
|
import com.squareup.moshi.JsonDataException;
|
|
|
|
import com.squareup.moshi.Moshi;
|
|
|
|
import com.thebrokenrail.modupdater.ModUpdater;
|
2020-06-25 20:56:09 +00:00
|
|
|
import com.thebrokenrail.modupdater.api.ConfigObject;
|
|
|
|
import com.thebrokenrail.modupdater.api.UpdateStrategy;
|
2020-06-28 17:43:17 +00:00
|
|
|
import com.thebrokenrail.modupdater.data.ModUpdate;
|
2020-06-24 18:21:26 +00:00
|
|
|
import com.thebrokenrail.modupdater.util.Util;
|
|
|
|
import net.fabricmc.loader.api.SemanticVersion;
|
|
|
|
import net.fabricmc.loader.util.version.VersionParsingException;
|
|
|
|
|
2020-06-25 20:56:09 +00:00
|
|
|
import javax.annotation.Nullable;
|
2020-06-24 18:21:26 +00:00
|
|
|
import java.io.IOException;
|
|
|
|
|
2020-06-25 20:56:09 +00:00
|
|
|
public class GitHubReleasesStrategy implements UpdateStrategy {
|
2020-06-24 18:21:26 +00:00
|
|
|
@SuppressWarnings({"unused", "MismatchedReadAndWriteOfArray"})
|
|
|
|
private static class GitHubRelease {
|
|
|
|
private GitHubReleaseAsset[] assets;
|
|
|
|
}
|
|
|
|
|
|
|
|
@SuppressWarnings("unused")
|
|
|
|
private static class GitHubReleaseAsset {
|
|
|
|
private String name;
|
|
|
|
private String browser_download_url;
|
|
|
|
}
|
|
|
|
|
2020-06-27 17:56:22 +00:00
|
|
|
private final JsonAdapter<GitHubRelease[]> jsonAdapter;
|
|
|
|
|
|
|
|
public GitHubReleasesStrategy() {
|
|
|
|
Moshi moshi = new Moshi.Builder().build();
|
|
|
|
jsonAdapter = moshi.adapter(GitHubRelease[].class).nonNull();
|
|
|
|
}
|
|
|
|
|
2020-06-24 18:21:26 +00:00
|
|
|
@Override
|
2020-06-25 20:56:09 +00:00
|
|
|
@Nullable
|
2020-08-05 17:06:45 +00:00
|
|
|
public ModUpdate run(ConfigObject obj, String oldVersion, String name, String id) {
|
2020-06-24 18:21:26 +00:00
|
|
|
String owner;
|
|
|
|
String repo;
|
|
|
|
try {
|
|
|
|
owner = obj.getString("owner");
|
|
|
|
repo = obj.getString("repository");
|
|
|
|
} catch (ConfigObject.MissingValueException e) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, e.getMessage());
|
2020-06-24 18:21:26 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-06-25 01:54:28 +00:00
|
|
|
String data;
|
|
|
|
try {
|
|
|
|
data = Util.urlToString(String.format("https://api.github.com/repos/%s/%s/releases", owner, repo));
|
|
|
|
} catch (IOException e) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, e.toString());
|
2020-06-25 01:54:28 +00:00
|
|
|
return null;
|
|
|
|
}
|
2020-06-24 18:21:26 +00:00
|
|
|
|
|
|
|
GitHubRelease[] releases;
|
|
|
|
try {
|
2020-06-27 17:56:22 +00:00
|
|
|
releases = jsonAdapter.fromJson(data);
|
2020-06-25 01:54:28 +00:00
|
|
|
} catch (JsonDataException | IOException e) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, e.toString());
|
2020-06-24 18:21:26 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (releases == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-07-25 18:10:06 +00:00
|
|
|
boolean strict = isStrict(obj);
|
|
|
|
|
2020-06-24 18:21:26 +00:00
|
|
|
GitHubReleaseAsset newestFile = null;
|
|
|
|
for (GitHubRelease release : releases) {
|
|
|
|
for (GitHubReleaseAsset asset : release.assets) {
|
|
|
|
if (Util.isFileCompatible(asset.name)) {
|
|
|
|
String fileVersion = Util.getVersionFromFileName(asset.name);
|
2020-08-05 17:06:45 +00:00
|
|
|
if (Util.isVersionCompatible(id, fileVersion, strict)) {
|
2020-06-24 18:21:26 +00:00
|
|
|
if (newestFile != null) {
|
|
|
|
try {
|
|
|
|
if (SemanticVersion.parse(fileVersion).compareTo(SemanticVersion.parse(fileVersion)) > 0) {
|
|
|
|
newestFile = asset;
|
|
|
|
}
|
|
|
|
} catch (VersionParsingException ignored) {
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
newestFile = asset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newestFile != null) {
|
|
|
|
String newestFileVersion = Util.getVersionFromFileName(newestFile.name);
|
|
|
|
try {
|
|
|
|
if (SemanticVersion.parse(newestFileVersion).compareTo(SemanticVersion.parse(oldVersion)) > 0) {
|
|
|
|
return new ModUpdate(oldVersion, newestFileVersion, newestFile.browser_download_url, name);
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} catch (VersionParsingException e) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|