2020-06-25 20:56:09 +00:00
|
|
|
package com.thebrokenrail.modupdater.strategy.util;
|
|
|
|
|
|
|
|
import com.thebrokenrail.modupdater.ModUpdater;
|
|
|
|
import com.thebrokenrail.modupdater.api.ConfigObject;
|
2020-06-28 17:43:17 +00:00
|
|
|
import com.thebrokenrail.modupdater.api.UpdateStrategy;
|
2020-06-25 20:56:09 +00:00
|
|
|
import com.thebrokenrail.modupdater.api.impl.ConfigObjectCustom;
|
|
|
|
import com.thebrokenrail.modupdater.data.ModUpdate;
|
|
|
|
import com.thebrokenrail.modupdater.util.Util;
|
|
|
|
import net.fabricmc.loader.api.FabricLoader;
|
|
|
|
import net.fabricmc.loader.api.ModContainer;
|
|
|
|
import net.fabricmc.loader.api.metadata.ModMetadata;
|
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
2020-07-25 18:10:06 +00:00
|
|
|
import java.util.function.Consumer;
|
2020-06-25 20:56:09 +00:00
|
|
|
|
|
|
|
public class UpdateStrategyRunner {
|
|
|
|
@Nullable
|
2020-07-25 18:10:06 +00:00
|
|
|
private static ModUpdate checkModForUpdate(ModMetadata metadata, Consumer<String> scan) {
|
2020-06-25 20:56:09 +00:00
|
|
|
String name = metadata.getName() + " (" + metadata.getId() + ')';
|
|
|
|
|
|
|
|
ConfigObject obj;
|
|
|
|
if (metadata.containsCustomValue(ModUpdater.NAMESPACE)) {
|
|
|
|
try {
|
|
|
|
obj = new ConfigObjectCustom(metadata.getCustomValue(ModUpdater.NAMESPACE).getAsObject());
|
|
|
|
} catch (ClassCastException e) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, String.format("\"%s\" Is Not An Object", ModUpdater.NAMESPACE));
|
2020-06-25 20:56:09 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
obj = Util.getHardcodedConfig(metadata.getId());
|
|
|
|
if (obj == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String oldVersion = metadata.getVersion().toString();
|
|
|
|
|
|
|
|
String strategy;
|
|
|
|
try {
|
|
|
|
strategy = obj.getString("strategy");
|
|
|
|
} catch (ConfigObject.MissingValueException e) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, e.getMessage());
|
2020-06-25 20:56:09 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
UpdateStrategy strategyObj = UpdateStrategyRegistry.get(strategy);
|
|
|
|
if (strategyObj == null) {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logWarn(name, "Invalid Strategy: " + name);
|
2020-06-25 20:56:09 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-07-25 18:10:06 +00:00
|
|
|
scan.accept(name);
|
|
|
|
|
2020-08-05 17:06:45 +00:00
|
|
|
return strategyObj.run(obj, oldVersion, name, metadata.getId());
|
2020-06-25 20:56:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public static ModUpdate[] checkAllModsForUpdates() {
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logInfo("Checking For Mod Updates...");
|
|
|
|
|
2020-06-25 20:56:09 +00:00
|
|
|
List<ModUpdate> updates = new ArrayList<>();
|
2020-07-25 18:10:06 +00:00
|
|
|
List<String> scannedMods = new ArrayList<>();
|
2020-06-25 20:56:09 +00:00
|
|
|
|
|
|
|
AtomicInteger remaining = new AtomicInteger(0);
|
|
|
|
|
|
|
|
for (ModContainer mod : FabricLoader.getInstance().getAllMods()) {
|
|
|
|
Thread thread = new Thread(() -> {
|
2020-06-27 23:22:04 +00:00
|
|
|
try {
|
|
|
|
ModMetadata metadata = mod.getMetadata();
|
2020-06-25 20:56:09 +00:00
|
|
|
|
2020-07-25 18:10:06 +00:00
|
|
|
ModUpdate update = checkModForUpdate(metadata, name -> {
|
|
|
|
synchronized (scannedMods) {
|
|
|
|
scannedMods.add(name);
|
|
|
|
}
|
|
|
|
});
|
2020-06-25 20:56:09 +00:00
|
|
|
|
2020-06-27 23:22:04 +00:00
|
|
|
if (update != null) {
|
|
|
|
ModUpdater.logInfo(update.text + " (" + update.downloadURL + ')');
|
|
|
|
synchronized (updates) {
|
|
|
|
updates.add(update);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (Throwable e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
} finally {
|
|
|
|
synchronized (remaining) {
|
|
|
|
remaining.decrementAndGet();
|
|
|
|
remaining.notifyAll();
|
2020-06-25 20:56:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
synchronized (remaining) {
|
|
|
|
remaining.incrementAndGet();
|
|
|
|
}
|
|
|
|
thread.start();
|
|
|
|
}
|
|
|
|
|
|
|
|
synchronized (remaining) {
|
|
|
|
while (remaining.get() > 0) {
|
|
|
|
try {
|
|
|
|
remaining.wait();
|
|
|
|
} catch (InterruptedException ignored) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-27 17:56:22 +00:00
|
|
|
ModUpdater.logInfo(updates.size() + String.format(" Mod Update%s Found", updates.size() == 1 ? "" : "s"));
|
|
|
|
|
2020-07-25 18:10:06 +00:00
|
|
|
ModUpdater.logInfo("Scanned " + scannedMods.size() + " Mods: " + String.join(", ", scannedMods));
|
|
|
|
|
2020-06-25 20:56:09 +00:00
|
|
|
return updates.toArray(new ModUpdate[0]);
|
|
|
|
}
|
|
|
|
}
|