This commit is contained in:
parent
0a941684f8
commit
d6420cdf5f
@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
**1.0.3**
|
||||
* Add Support For GitHub Releases
|
||||
* Use Multi-Threading
|
||||
|
||||
**1.0.2**
|
||||
* Improve Errors
|
||||
* Improve GUI
|
||||
|
16
README.md
16
README.md
@ -35,6 +35,19 @@ Place this in your ``fabric.mod.json``:
|
||||
}
|
||||
```
|
||||
|
||||
**GitHub Releases**
|
||||
```json
|
||||
{
|
||||
"custom": {
|
||||
"modupdater": {
|
||||
"strategy": "github",
|
||||
"owner": "Repository Owner",
|
||||
"repository": "Repository Name"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Also replace this in ````build.gradle````:
|
||||
```gradle
|
||||
version = project.mod_version
|
||||
@ -48,4 +61,5 @@ version = "${project.mod_version}+${project.minecraft_version}"
|
||||
[View Changelog](CHANGELOG.md)
|
||||
|
||||
## Credits
|
||||
The icon was created by ``ProspectorDev``.
|
||||
- The icon was created by ``ProspectorDev``
|
||||
- The GitHub Releases strategy was written by ``AppleTheGolden``
|
@ -9,7 +9,7 @@ org.gradle.jvmargs = -Xmx1G
|
||||
fabric_loader_version = 0.8.8+build.202
|
||||
|
||||
# Mod Properties
|
||||
mod_version = 1.0.2
|
||||
mod_version = 1.0.3
|
||||
maven_group = com.thebrokenrail
|
||||
|
||||
# Dependencies
|
||||
|
@ -21,7 +21,7 @@ public class ModUpdater implements ModInitializer {
|
||||
getLogger().warn("Invalid JSON Configuration: " + modID);
|
||||
}
|
||||
|
||||
private static ModUpdate[] updates;
|
||||
private static volatile ModUpdate[] updates;
|
||||
|
||||
private static Thread updateThread;
|
||||
|
||||
@ -45,6 +45,6 @@ public class ModUpdater implements ModInitializer {
|
||||
}
|
||||
getLogger().info(updates.length + " Mod Update(s) Found");
|
||||
});
|
||||
//updateThread.start();
|
||||
updateThread.start();
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package com.thebrokenrail.modupdater.strategy;
|
||||
|
||||
import com.mojang.bridge.game.GameVersion;
|
||||
import com.squareup.moshi.JsonAdapter;
|
||||
import com.squareup.moshi.JsonDataException;
|
||||
import com.squareup.moshi.Moshi;
|
||||
import com.thebrokenrail.modupdater.ModUpdater;
|
||||
import com.thebrokenrail.modupdater.util.ConfigObject;
|
||||
@ -43,6 +44,9 @@ class CurseForgeStrategy implements ModUpdateStrategy {
|
||||
} catch (IOException e) {
|
||||
ModUpdater.getLogger().warn("Unable To Access CurseForge: " + name);
|
||||
return null;
|
||||
} catch (JsonDataException e) {
|
||||
ModUpdater.getLogger().warn("CurseForge Sent Invalid Data: ", e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (files == null) {
|
||||
@ -59,6 +63,7 @@ class CurseForgeStrategy implements ModUpdateStrategy {
|
||||
|
||||
CurseForgeFile newestFile = null;
|
||||
for (CurseForgeFile file : files) {
|
||||
if (Util.isFileCompatible(file.fileName)) {
|
||||
String fileVersion = Util.getVersionFromFileName(file.fileName);
|
||||
if (Arrays.asList(file.gameVersion).contains(versionStr) || Util.isVersionCompatible(fileVersion)) {
|
||||
if (newestFile != null) {
|
||||
@ -74,6 +79,7 @@ class CurseForgeStrategy implements ModUpdateStrategy {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newestFile != null) {
|
||||
String newestFileVersion = Util.getVersionFromFileName(newestFile.fileName);
|
||||
|
@ -0,0 +1,97 @@
|
||||
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;
|
||||
import com.thebrokenrail.modupdater.util.ConfigObject;
|
||||
import com.thebrokenrail.modupdater.util.ModUpdate;
|
||||
import com.thebrokenrail.modupdater.util.ModUpdateStrategy;
|
||||
import com.thebrokenrail.modupdater.util.Util;
|
||||
import net.fabricmc.loader.api.SemanticVersion;
|
||||
import net.fabricmc.loader.util.version.VersionParsingException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class GitHubReleasesStrategy implements ModUpdateStrategy {
|
||||
@SuppressWarnings({"unused", "MismatchedReadAndWriteOfArray"})
|
||||
private static class GitHubRelease {
|
||||
private GitHubReleaseAsset[] assets;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static class GitHubReleaseAsset {
|
||||
private String name;
|
||||
private String browser_download_url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModUpdate checkForUpdate(ConfigObject obj, String oldVersion, String name) {
|
||||
String owner;
|
||||
String repo;
|
||||
try {
|
||||
owner = obj.getString("owner");
|
||||
repo = obj.getString("repository");
|
||||
} catch (ConfigObject.MissingValueException e) {
|
||||
ModUpdater.invalidModUpdaterConfig(name);
|
||||
return null;
|
||||
}
|
||||
|
||||
String data = Util.urlToString(String.format("https://api.github.com/repos/%s/%s/releases", owner, repo));
|
||||
|
||||
Moshi moshi = new Moshi.Builder().build();
|
||||
JsonAdapter<GitHubRelease[]> jsonAdapter = moshi.adapter(GitHubRelease[].class);
|
||||
|
||||
GitHubRelease[] releases;
|
||||
try {
|
||||
// GitHub's API never omits values, they're always null
|
||||
releases = jsonAdapter.nonNull().fromJson(data);
|
||||
} catch (IOException e) {
|
||||
ModUpdater.getLogger().warn("Unable To Access GitHub: " + name);
|
||||
return null;
|
||||
} catch (JsonDataException e) {
|
||||
ModUpdater.getLogger().warn("GitHub Sent Invalid Data: ", e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (releases == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
GitHubReleaseAsset newestFile = null;
|
||||
for (GitHubRelease release : releases) {
|
||||
for (GitHubReleaseAsset asset : release.assets) {
|
||||
if (Util.isFileCompatible(asset.name)) {
|
||||
String fileVersion = Util.getVersionFromFileName(asset.name);
|
||||
if (Util.isVersionCompatible(fileVersion)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
@ -31,7 +31,7 @@ public class MavenStrategy implements ModUpdateStrategy {
|
||||
return null;
|
||||
}
|
||||
|
||||
String mavenRoot = repository + '/' + group.replaceAll("\\.", "/") + '/' + artifact;
|
||||
String mavenRoot = String.format("%s/%s/%s", repository, group.replaceAll("\\.", "/"), artifact);
|
||||
|
||||
Document doc;
|
||||
try {
|
||||
|
@ -94,5 +94,6 @@ public class ModUpdateStrategies {
|
||||
static {
|
||||
data.put("curseforge", new CurseForgeStrategy());
|
||||
data.put("maven", new MavenStrategy());
|
||||
data.put("github", new GitHubReleasesStrategy());
|
||||
}
|
||||
}
|
||||
|
@ -75,6 +75,10 @@ public class Util {
|
||||
return isVersionCompatible(versionStr,'+') || isVersionCompatible(versionStr, '-');
|
||||
}
|
||||
|
||||
public static boolean isFileCompatible(String fileName) {
|
||||
return !fileName.endsWith("-dev" + JAR_EXTENSION) && !fileName.endsWith("-sources" + JAR_EXTENSION) && !fileName.endsWith("-sources-dev" + JAR_EXTENSION);
|
||||
}
|
||||
|
||||
public static GameVersion getMinecraftVersion() {
|
||||
updateMinecraftVersion();
|
||||
return minecraftVersion;
|
||||
|
Reference in New Issue
Block a user