Multi-Threading
This commit is contained in:
parent
17f56fd400
commit
0a941684f8
@ -6,6 +6,8 @@ import net.fabricmc.api.ModInitializer;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ModUpdater implements ModInitializer {
|
||||
public static final String NAMESPACE = "modupdater";
|
||||
|
||||
@ -21,19 +23,28 @@ public class ModUpdater implements ModInitializer {
|
||||
|
||||
private static ModUpdate[] updates;
|
||||
|
||||
private static Thread updateThread;
|
||||
|
||||
public static ModUpdate[] getUpdates() {
|
||||
if (updates == null) {
|
||||
if (Thread.currentThread() == updateThread) {
|
||||
updates = ModUpdateStrategies.findAvailableUpdates();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return updates;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
updateThread = new Thread(() -> {
|
||||
getLogger().info("Checking For Mod Updates...");
|
||||
for (ModUpdate update : getUpdates()) {
|
||||
for (ModUpdate update : Objects.requireNonNull(getUpdates())) {
|
||||
getLogger().info(update.text + " (" + update.downloadURL + ')');
|
||||
}
|
||||
getLogger().info(updates.length + " Mod Update(s) Found");
|
||||
});
|
||||
//updateThread.start();
|
||||
}
|
||||
}
|
||||
|
@ -14,9 +14,11 @@ import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.TranslatableText;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class ModUpdateScreen extends Screen {
|
||||
private ModUpdateListWidget list;
|
||||
public ModUpdateListWidget list;
|
||||
private ButtonWidget download;
|
||||
private final Screen parent;
|
||||
|
||||
@ -56,15 +58,27 @@ public class ModUpdateScreen extends Screen {
|
||||
@Environment(EnvType.CLIENT)
|
||||
private static class ModUpdateListWidget extends EntryListWidget<ModUpdateEntry> {
|
||||
private final ModUpdateScreen screen;
|
||||
private ModUpdate[] updates = null;
|
||||
|
||||
private ModUpdateListWidget(MinecraftClient client, ModUpdateScreen screen) {
|
||||
super(client, screen.width, screen.height, 32, screen.height - 40, 18);
|
||||
this.screen = screen;
|
||||
|
||||
for (ModUpdate update : ModUpdater.getUpdates()) {
|
||||
reload();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
ModUpdate[] newUpdates = ModUpdater.getUpdates();
|
||||
if (!Arrays.equals(updates, newUpdates)) {
|
||||
clearEntries();
|
||||
if (newUpdates != null) {
|
||||
for (ModUpdate update : newUpdates) {
|
||||
addEntry(new ModUpdateEntry(update, screen, this));
|
||||
}
|
||||
}
|
||||
updates = newUpdates;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowWidth() {
|
||||
@ -100,6 +114,15 @@ public class ModUpdateScreen extends Screen {
|
||||
protected boolean isFocused() {
|
||||
return screen.getFocused() == this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
reload();
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
if (updates == null) {
|
||||
drawCenteredText(matrices, screen.textRenderer, new TranslatableText("gui.modupdater.loading"), width / 2, height / 2 - screen.textRenderer.fontHeight, 16777215);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
|
@ -13,6 +13,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class ModUpdateStrategies {
|
||||
private static final Map<String, ModUpdateStrategy> data = new HashMap<>();
|
||||
@ -40,7 +41,10 @@ public class ModUpdateStrategies {
|
||||
public static ModUpdate[] findAvailableUpdates() {
|
||||
List<ModUpdate> updates = new ArrayList<>();
|
||||
|
||||
AtomicInteger remaining = new AtomicInteger(0);
|
||||
|
||||
for (ModContainer mod : FabricLoader.getInstance().getAllMods()) {
|
||||
Thread thread = new Thread(() -> {
|
||||
ModMetadata metadata = mod.getMetadata();
|
||||
String name = metadata.getName() + " (" + metadata.getId() + ')';
|
||||
|
||||
@ -59,10 +63,31 @@ public class ModUpdateStrategies {
|
||||
}
|
||||
|
||||
if (update != null) {
|
||||
synchronized (updates) {
|
||||
updates.add(update);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (remaining) {
|
||||
remaining.decrementAndGet();
|
||||
remaining.notifyAll();
|
||||
}
|
||||
});
|
||||
synchronized (remaining) {
|
||||
remaining.incrementAndGet();
|
||||
}
|
||||
thread.start();
|
||||
}
|
||||
|
||||
synchronized (remaining) {
|
||||
while (remaining.get() > 0) {
|
||||
try {
|
||||
remaining.wait();
|
||||
} catch (InterruptedException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return updates.toArray(new ModUpdate[0]);
|
||||
}
|
||||
|
||||
|
@ -35,8 +35,10 @@ public class Util {
|
||||
public static final String JAR_EXTENSION = ".jar";
|
||||
|
||||
public static String getVersionFromFileName(String fileName) {
|
||||
while (!Character.isDigit(fileName.charAt(0))) {
|
||||
int index = fileName.indexOf("-");
|
||||
fileName = fileName.substring(index != -1 ? index + 1 : 0);
|
||||
}
|
||||
if (fileName.endsWith(JAR_EXTENSION)) {
|
||||
fileName = fileName.substring(0, fileName.length() - JAR_EXTENSION.length());
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"gui.modupdater.title": "Available Mod Updates",
|
||||
"gui.modupdater.download": "Download"
|
||||
"gui.modupdater.download": "Download",
|
||||
"gui.modupdater.loading": "Loading..."
|
||||
}
|
Reference in New Issue
Block a user