This commit is contained in:
parent
26073170b7
commit
c0303bf44f
@ -1,5 +1,9 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
**1.1.2**
|
||||||
|
* Cache Reader Objects
|
||||||
|
* Improve Logging
|
||||||
|
|
||||||
**1.1.1**
|
**1.1.1**
|
||||||
* Use CurseForge For Fabric API
|
* Use CurseForge For Fabric API
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ org.gradle.jvmargs = -Xmx1G
|
|||||||
fabric_loader_version = 0.8.8+build.202
|
fabric_loader_version = 0.8.8+build.202
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.1.1
|
mod_version = 1.1.2
|
||||||
maven_group = com.thebrokenrail
|
maven_group = com.thebrokenrail
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
@ -6,7 +6,7 @@ import net.fabricmc.api.ModInitializer;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.util.Objects;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class ModUpdater implements ModInitializer {
|
public class ModUpdater implements ModInitializer {
|
||||||
public static final String NAMESPACE = "modupdater";
|
public static final String NAMESPACE = "modupdater";
|
||||||
@ -17,34 +17,28 @@ public class ModUpdater implements ModInitializer {
|
|||||||
return LogManager.getLogger(LOGGER_NAME);
|
return LogManager.getLogger(LOGGER_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void log(String name, String msg) {
|
public static void logWarn(String name, String msg) {
|
||||||
getLogger().warn(String.format("%s: %s", name, msg));
|
getLogger().warn(String.format("%s: %s", name, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void logInfo(String info) {
|
||||||
|
getLogger().info(info);
|
||||||
|
}
|
||||||
|
|
||||||
private static volatile ModUpdate[] updates;
|
private static volatile ModUpdate[] updates;
|
||||||
|
|
||||||
private static Thread updateThread;
|
public static void findUpdates() {
|
||||||
|
|
||||||
public static ModUpdate[] getUpdates() {
|
|
||||||
if (updates == null) {
|
|
||||||
if (Thread.currentThread() == updateThread) {
|
|
||||||
updates = UpdateStrategyRunner.checkAllModsForUpdates();
|
updates = UpdateStrategyRunner.checkAllModsForUpdates();
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static ModUpdate[] getUpdates() {
|
||||||
return updates;
|
return updates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
updateThread = new Thread(() -> {
|
Thread updateThread = new Thread(ModUpdater::findUpdates);
|
||||||
getLogger().info("Checking For Mod Updates...");
|
|
||||||
for (ModUpdate update : Objects.requireNonNull(getUpdates())) {
|
|
||||||
getLogger().info(update.text + " (" + update.downloadURL + ')');
|
|
||||||
}
|
|
||||||
getLogger().info(updates.length + " Mod Update(s) Found");
|
|
||||||
});
|
|
||||||
updateThread.start();
|
updateThread.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,18 +33,18 @@ public class ModUpdateScreen extends Screen {
|
|||||||
children.add(list);
|
children.add(list);
|
||||||
int buttonWidth = 150;
|
int buttonWidth = 150;
|
||||||
int paddingX = 5;
|
int paddingX = 5;
|
||||||
int doneX = width / 2 - buttonWidth - paddingX;
|
int downloadX = width / 2 - buttonWidth - paddingX;
|
||||||
int downloadX = width / 2 + paddingX;
|
int doneX = width / 2 + paddingX;
|
||||||
download = addButton(new ButtonWidget(downloadX, height - 30, buttonWidth, 20, new TranslatableText("gui." + ModUpdater.NAMESPACE + ".download"), buttonWidget -> {
|
addButton(new ButtonWidget(downloadX, height - 30, buttonWidth, 20, ScreenTexts.DONE, buttonWidget -> {
|
||||||
|
assert client != null;
|
||||||
|
client.openScreen(parent);
|
||||||
|
}));
|
||||||
|
download = addButton(new ButtonWidget(doneX, height - 30, buttonWidth, 20, new TranslatableText("gui." + ModUpdater.NAMESPACE + ".download"), buttonWidget -> {
|
||||||
if (list.getSelected() != null) {
|
if (list.getSelected() != null) {
|
||||||
Util.getOperatingSystem().open(list.getSelected().update.downloadURL);
|
Util.getOperatingSystem().open(list.getSelected().update.downloadURL);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
download.active = false;
|
download.active = false;
|
||||||
addButton(new ButtonWidget(doneX, height - 30, buttonWidth, 20, ScreenTexts.DONE, buttonWidget -> {
|
|
||||||
assert client != null;
|
|
||||||
client.openScreen(parent);
|
|
||||||
}));
|
|
||||||
super.init();
|
super.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,13 @@ public class CurseForgeStrategy implements UpdateStrategy {
|
|||||||
private String[] gameVersion;
|
private String[] gameVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final JsonAdapter<CurseForgeFile[]> jsonAdapter;
|
||||||
|
|
||||||
|
public CurseForgeStrategy() {
|
||||||
|
Moshi moshi = new Moshi.Builder().build();
|
||||||
|
jsonAdapter = moshi.adapter(CurseForgeFile[].class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
||||||
@ -31,7 +38,7 @@ public class CurseForgeStrategy implements UpdateStrategy {
|
|||||||
try {
|
try {
|
||||||
projectID = obj.getInt("projectID");
|
projectID = obj.getInt("projectID");
|
||||||
} catch (ConfigObject.MissingValueException e) {
|
} catch (ConfigObject.MissingValueException e) {
|
||||||
ModUpdater.log(name, e.getMessage());
|
ModUpdater.logWarn(name, e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,18 +46,15 @@ public class CurseForgeStrategy implements UpdateStrategy {
|
|||||||
try {
|
try {
|
||||||
data = Util.urlToString("https://addons-ecs.forgesvc.net/api/v2/addon/" + projectID + "/files");
|
data = Util.urlToString("https://addons-ecs.forgesvc.net/api/v2/addon/" + projectID + "/files");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurseForgeFile[] files;
|
CurseForgeFile[] files;
|
||||||
try {
|
try {
|
||||||
Moshi moshi = new Moshi.Builder().build();
|
|
||||||
JsonAdapter<CurseForgeFile[]> jsonAdapter = moshi.adapter(CurseForgeFile[].class);
|
|
||||||
|
|
||||||
files = jsonAdapter.fromJson(data);
|
files = jsonAdapter.fromJson(data);
|
||||||
} catch (JsonDataException | IOException e) {
|
} catch (JsonDataException | IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,13 @@ public class GitHubReleasesStrategy implements UpdateStrategy {
|
|||||||
private String browser_download_url;
|
private String browser_download_url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final JsonAdapter<GitHubRelease[]> jsonAdapter;
|
||||||
|
|
||||||
|
public GitHubReleasesStrategy() {
|
||||||
|
Moshi moshi = new Moshi.Builder().build();
|
||||||
|
jsonAdapter = moshi.adapter(GitHubRelease[].class).nonNull();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
||||||
@ -35,7 +42,7 @@ public class GitHubReleasesStrategy implements UpdateStrategy {
|
|||||||
owner = obj.getString("owner");
|
owner = obj.getString("owner");
|
||||||
repo = obj.getString("repository");
|
repo = obj.getString("repository");
|
||||||
} catch (ConfigObject.MissingValueException e) {
|
} catch (ConfigObject.MissingValueException e) {
|
||||||
ModUpdater.log(name, e.getMessage());
|
ModUpdater.logWarn(name, e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,19 +50,15 @@ public class GitHubReleasesStrategy implements UpdateStrategy {
|
|||||||
try {
|
try {
|
||||||
data = Util.urlToString(String.format("https://api.github.com/repos/%s/%s/releases", owner, repo));
|
data = Util.urlToString(String.format("https://api.github.com/repos/%s/%s/releases", owner, repo));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
GitHubRelease[] releases;
|
GitHubRelease[] releases;
|
||||||
try {
|
try {
|
||||||
Moshi moshi = new Moshi.Builder().build();
|
releases = jsonAdapter.fromJson(data);
|
||||||
JsonAdapter<GitHubRelease[]> jsonAdapter = moshi.adapter(GitHubRelease[].class);
|
|
||||||
|
|
||||||
// GitHub's API never omits values, they're always null
|
|
||||||
releases = jsonAdapter.nonNull().fromJson(data);
|
|
||||||
} catch (JsonDataException | IOException e) {
|
} catch (JsonDataException | IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@ import java.io.InputStream;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MavenStrategy implements UpdateStrategy {
|
public class MavenStrategy implements UpdateStrategy {
|
||||||
|
private final SAXReader reader = new SAXReader();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
public ModUpdate run(ConfigObject obj, String oldVersion, String name) {
|
||||||
@ -30,7 +32,7 @@ public class MavenStrategy implements UpdateStrategy {
|
|||||||
group = obj.getString("group");
|
group = obj.getString("group");
|
||||||
artifact = obj.getString("artifact");
|
artifact = obj.getString("artifact");
|
||||||
} catch (ConfigObject.MissingValueException e) {
|
} catch (ConfigObject.MissingValueException e) {
|
||||||
ModUpdater.log(name, e.getMessage());
|
ModUpdater.logWarn(name, e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,16 +42,15 @@ public class MavenStrategy implements UpdateStrategy {
|
|||||||
try {
|
try {
|
||||||
data = Util.urlToString(mavenRoot + "/maven-metadata.xml");
|
data = Util.urlToString(mavenRoot + "/maven-metadata.xml");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Document doc;
|
Document doc;
|
||||||
try (InputStream source = new ByteArrayInputStream(data.getBytes())) {
|
try (InputStream source = new ByteArrayInputStream(data.getBytes())) {
|
||||||
SAXReader reader = new SAXReader();
|
|
||||||
doc = reader.read(source);
|
doc = reader.read(source);
|
||||||
} catch (DocumentException | IOException e) {
|
} catch (DocumentException | IOException e) {
|
||||||
ModUpdater.log(name, e.toString());
|
ModUpdater.logWarn(name, e.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ public class UpdateStrategyRunner {
|
|||||||
try {
|
try {
|
||||||
obj = new ConfigObjectCustom(metadata.getCustomValue(ModUpdater.NAMESPACE).getAsObject());
|
obj = new ConfigObjectCustom(metadata.getCustomValue(ModUpdater.NAMESPACE).getAsObject());
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
ModUpdater.log(name, String.format("\"%s\" Is Not An Object", ModUpdater.NAMESPACE));
|
ModUpdater.logWarn(name, String.format("\"%s\" Is Not An Object", ModUpdater.NAMESPACE));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -41,13 +41,13 @@ public class UpdateStrategyRunner {
|
|||||||
try {
|
try {
|
||||||
strategy = obj.getString("strategy");
|
strategy = obj.getString("strategy");
|
||||||
} catch (ConfigObject.MissingValueException e) {
|
} catch (ConfigObject.MissingValueException e) {
|
||||||
ModUpdater.log(name, e.getMessage());
|
ModUpdater.logWarn(name, e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateStrategy strategyObj = UpdateStrategyRegistry.get(strategy);
|
UpdateStrategy strategyObj = UpdateStrategyRegistry.get(strategy);
|
||||||
if (strategyObj == null) {
|
if (strategyObj == null) {
|
||||||
ModUpdater.log(name, "Invalid Strategy: " + name);
|
ModUpdater.logWarn(name, "Invalid Strategy: " + name);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +55,8 @@ public class UpdateStrategyRunner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static ModUpdate[] checkAllModsForUpdates() {
|
public static ModUpdate[] checkAllModsForUpdates() {
|
||||||
|
ModUpdater.logInfo("Checking For Mod Updates...");
|
||||||
|
|
||||||
List<ModUpdate> updates = new ArrayList<>();
|
List<ModUpdate> updates = new ArrayList<>();
|
||||||
|
|
||||||
AtomicInteger remaining = new AtomicInteger(0);
|
AtomicInteger remaining = new AtomicInteger(0);
|
||||||
@ -66,6 +68,7 @@ public class UpdateStrategyRunner {
|
|||||||
ModUpdate update = checkModForUpdate(metadata);
|
ModUpdate update = checkModForUpdate(metadata);
|
||||||
|
|
||||||
if (update != null) {
|
if (update != null) {
|
||||||
|
ModUpdater.logInfo(update.text + " (" + update.downloadURL + ')');
|
||||||
synchronized (updates) {
|
synchronized (updates) {
|
||||||
updates.add(update);
|
updates.add(update);
|
||||||
}
|
}
|
||||||
@ -91,6 +94,8 @@ public class UpdateStrategyRunner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModUpdater.logInfo(updates.size() + String.format(" Mod Update%s Found", updates.size() == 1 ? "" : "s"));
|
||||||
|
|
||||||
return updates.toArray(new ModUpdate[0]);
|
return updates.toArray(new ModUpdate[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user