This commit is contained in:
TheBrokenRail 2020-07-25 14:10:06 -04:00
parent 4d4facdf50
commit 2f140c4a60
12 changed files with 85 additions and 11 deletions

View File

@ -1,5 +1,9 @@
# Changelog
**1.1.8**
* Strict Minecraft Version Checking by Default
* Print Message To Log Showing All Scanned Mods
**1.1.7**
* Disable SemVer In JSON Strategy

View File

@ -17,6 +17,7 @@ This update strategy uses the CurseForge API to check for updates.
```
- Requires Semantic Versioning
- In Loose Versioning Mode, Can Infer File's Supported Minecraft version From CurseForge Metadata
- [Requires ```build.gradle``` modification](#build-gradle-modification)
## GitHub Releases
@ -108,4 +109,19 @@ If you prefer hyphens you can also use:
version = "${project.mod_version}-${project.minecraft_version}"
```
You can also just use the major version of Minecraft instead of the full version (like ```1.16``` instead of ```1.16.1``` or ```20w20a```).
## Loose VS Strict Versioning Mode
### Strict (Default)
In strict mode it only marks a file as compatibleif the Minecraft version is identical.
### Loose
```json
{
"custom": {
"modupdater": {
"strict": false
}
}
}
```
In loose mode, it will also mark a file as compatible if it has the same release target.

View File

@ -9,7 +9,7 @@ org.gradle.jvmargs = -Xmx1G
fabric_loader_version = 0.8.8+build.202
# Mod Properties
mod_version = 1.1.7
mod_version = 1.1.8
maven_group = com.thebrokenrail
# Dependencies

View File

@ -5,6 +5,8 @@ public interface ConfigObject {
int getInt(String str) throws MissingValueException;
boolean getBoolean(String str) throws MissingValueException;
class MissingValueException extends Exception {
private static final String MISSING_MSG = "Missing Configuration Property: %s";
private static final String INVALID_MSG = "Invalid Configuration Property: %s";

View File

@ -7,4 +7,12 @@ import javax.annotation.Nullable;
public interface UpdateStrategy {
@Nullable
ModUpdate run(ConfigObject obj, String oldVersion, String name);
default boolean isStrict(ConfigObject obj) {
try {
return obj.getBoolean("strict");
} catch (ConfigObject.MissingValueException e) {
return true;
}
}
}

View File

@ -35,4 +35,17 @@ public class ConfigObjectCustom implements ConfigObject {
throw new MissingValueException(false, str);
}
}
@Override
public boolean getBoolean(String str) throws MissingValueException {
if (obj.containsKey(str)) {
try {
return obj.get(str).getAsBoolean();
} catch (ClassCastException e) {
throw new MissingValueException(true, str);
}
} else {
throw new MissingValueException(false, str);
}
}
}

View File

@ -36,4 +36,17 @@ public class ConfigObjectHardcoded implements ConfigObject {
throw new MissingValueException(false, str);
}
}
@Override
public boolean getBoolean(String str) throws MissingValueException {
if (map.containsKey(str)) {
try {
return (Boolean) map.get(str);
} catch (ClassCastException e) {
throw new MissingValueException(true, str);
}
} else {
throw new MissingValueException(false, str);
}
}
}

View File

@ -70,11 +70,13 @@ public class CurseForgeStrategy implements UpdateStrategy {
versionStr = version.getReleaseTarget() + "-Snapshot";
}
boolean strict = isStrict(obj);
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 ((Arrays.asList(file.gameVersion).contains(versionStr) && strict) || Util.isVersionCompatible(fileVersion, strict)) {
if (newestFile != null) {
String newestFileVersion = Util.getVersionFromFileName(newestFile.fileName);
try {

View File

@ -66,12 +66,14 @@ public class GitHubReleasesStrategy implements UpdateStrategy {
return null;
}
boolean strict = isStrict(obj);
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 (Util.isVersionCompatible(fileVersion, strict)) {
if (newestFile != null) {
try {
if (SemanticVersion.parse(fileVersion).compareTo(SemanticVersion.parse(fileVersion)) > 0) {

View File

@ -80,12 +80,14 @@ public class MavenStrategy implements UpdateStrategy {
return null;
}
boolean strict = isStrict(obj);
String newestVersion = null;
for (int i = 0; i < versions.getLength(); i++) {
Node node = versions.item(i);
String version = node.getTextContent();
if (Util.isVersionCompatible(version)) {
if (Util.isVersionCompatible(version, strict)) {
if (newestVersion != null) {
try {
if (SemanticVersion.parse(version).compareTo(SemanticVersion.parse(newestVersion)) > 0) {

View File

@ -14,10 +14,11 @@ import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
public class UpdateStrategyRunner {
@Nullable
private static ModUpdate checkModForUpdate(ModMetadata metadata) {
private static ModUpdate checkModForUpdate(ModMetadata metadata, Consumer<String> scan) {
String name = metadata.getName() + " (" + metadata.getId() + ')';
ConfigObject obj;
@ -51,6 +52,8 @@ public class UpdateStrategyRunner {
return null;
}
scan.accept(name);
return strategyObj.run(obj, oldVersion, name);
}
@ -58,6 +61,7 @@ public class UpdateStrategyRunner {
ModUpdater.logInfo("Checking For Mod Updates...");
List<ModUpdate> updates = new ArrayList<>();
List<String> scannedMods = new ArrayList<>();
AtomicInteger remaining = new AtomicInteger(0);
@ -66,7 +70,11 @@ public class UpdateStrategyRunner {
try {
ModMetadata metadata = mod.getMetadata();
ModUpdate update = checkModForUpdate(metadata);
ModUpdate update = checkModForUpdate(metadata, name -> {
synchronized (scannedMods) {
scannedMods.add(name);
}
});
if (update != null) {
ModUpdater.logInfo(update.text + " (" + update.downloadURL + ')');
@ -100,6 +108,8 @@ public class UpdateStrategyRunner {
ModUpdater.logInfo(updates.size() + String.format(" Mod Update%s Found", updates.size() == 1 ? "" : "s"));
ModUpdater.logInfo("Scanned " + scannedMods.size() + " Mods: " + String.join(", ", scannedMods));
return updates.toArray(new ModUpdate[0]);
}
}

View File

@ -75,13 +75,13 @@ public class Util {
}
}
private static boolean isVersionCompatible(String versionStr, char prefix) {
private static boolean isVersionCompatible(String versionStr, char prefix, boolean strict) {
updateMinecraftVersion();
return versionStr.endsWith(prefix + minecraftVersionSemantic) || versionStr.endsWith(prefix + minecraftVersion.getReleaseTarget()) || versionStr.endsWith(prefix + getMajorVersion());
return versionStr.endsWith(prefix + minecraftVersionSemantic) || versionStr.endsWith(prefix + minecraftVersion.getName()) || (!strict && (versionStr.endsWith(prefix + minecraftVersion.getReleaseTarget()) || versionStr.endsWith(prefix + getMajorVersion())));
}
public static boolean isVersionCompatible(String versionStr) {
return isVersionCompatible(versionStr, '+') || isVersionCompatible(versionStr, '-');
public static boolean isVersionCompatible(String versionStr, boolean strict) {
return isVersionCompatible(versionStr, '+', strict) || isVersionCompatible(versionStr, '-', strict);
}
public static boolean isFileCompatible(String fileName) {
@ -99,12 +99,14 @@ public class Util {
Map<String, Object> map = new HashMap<>();
map.put("strategy", "curseforge");
map.put("projectID", 306612);
map.put("strict", false);
return new ConfigObjectHardcoded(map);
}
case "modmenu": {
Map<String, Object> map = new HashMap<>();
map.put("strategy", "curseforge");
map.put("projectID", 308702);
map.put("strict", false);
return new ConfigObjectHardcoded(map);
}
default: {