This commit is contained in:
parent
4d4facdf50
commit
2f140c4a60
@ -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
|
||||
|
||||
|
@ -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.
|
@ -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
|
||||
|
@ -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";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
@ -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: {
|
||||
|
Reference in New Issue
Block a user