diff --git a/ModflaredApi.jar b/ModflaredApi.jar new file mode 100644 index 000000000..f6f78a4ad Binary files /dev/null and b/ModflaredApi.jar differ diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index fbc31398e..189631415 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -17,6 +17,7 @@ loom { dependencies { implementation(project(":core")) implementation(project(":loader-core")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) minecraft("com.mojang:minecraft:${property("deps.minecraft")}") mappings(loom.layered { diff --git a/build.forge.gradle.kts b/build.forge.gradle.kts index 332229a0f..a14c3c2e0 100644 --- a/build.forge.gradle.kts +++ b/build.forge.gradle.kts @@ -26,6 +26,7 @@ legacyForge { dependencies { implementation(project(":core")) implementation(project(":loader-core")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) compileOnly("net.fabricmc.fabric-api:fabric-api:0.92.2+1.20.1") compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${property("deps.mixin-extras")}")!!) diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts index 7e1bba8fd..eb480695b 100644 --- a/build.neoforge.gradle.kts +++ b/build.neoforge.gradle.kts @@ -22,6 +22,7 @@ neoForge { dependencies { implementation(project(":core")) implementation(project(":loader-core")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) compileOnly("net.fabricmc.fabric-api:fabric-api:0.92.2+1.20.1") } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ce131a635..d02e4b7a9 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -25,6 +25,8 @@ dependencies { implementation("org.apache.httpcomponents.client5:httpclient5:5.5") testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.2") testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.2") + + implementation(files(rootDir.resolve("ModflaredApi.jar"))) } java { diff --git a/loader/core/src/main/java/pl/skidam/automodpack_loader_core/Preload.java b/loader/core/src/main/java/pl/skidam/automodpack_loader_core/Preload.java index 60217a188..ade005068 100644 --- a/loader/core/src/main/java/pl/skidam/automodpack_loader_core/Preload.java +++ b/loader/core/src/main/java/pl/skidam/automodpack_loader_core/Preload.java @@ -85,7 +85,7 @@ private void updateAll() { CustomFileUtils.deleteDummyFiles(Path.of(System.getProperty("user.dir")), latestModpackContent == null ? null : latestModpackContent.list); // Update modpack - new ModpackUpdater().prepareUpdate(latestModpackContent, modpackAddresses, secret, selectedModpackDir); + new ModpackUpdater().prepareUpdate(latestModpackContent, modpackAddresses, secret, selectedModpackDir, null); } } diff --git a/loader/core/src/main/java/pl/skidam/automodpack_loader_core/client/ModpackUpdater.java b/loader/core/src/main/java/pl/skidam/automodpack_loader_core/client/ModpackUpdater.java index fe18cbc7c..308f74243 100644 --- a/loader/core/src/main/java/pl/skidam/automodpack_loader_core/client/ModpackUpdater.java +++ b/loader/core/src/main/java/pl/skidam/automodpack_loader_core/client/ModpackUpdater.java @@ -36,17 +36,18 @@ public class ModpackUpdater { private Secrets.Secret modpackSecret; private Path modpackDir; private Path modpackContentFile; - + private Runnable callback; public String getModpackName() { return serverModpackContent.modpackName; } - public void prepareUpdate(Jsons.ModpackContentFields modpackContent, Jsons.ModpackAddresses modpackAddresses, Secrets.Secret secret, Path modpackPath) { + public void prepareUpdate(Jsons.ModpackContentFields modpackContent, Jsons.ModpackAddresses modpackAddresses, Secrets.Secret secret, Path modpackPath, Runnable callback) { this.serverModpackContent = modpackContent; this.modpackAddresses = modpackAddresses; this.modpackSecret = secret; this.modpackDir = modpackPath; + this.callback = callback; if (this.modpackAddresses.isAnyEmpty() || modpackPath.toString().isEmpty()) { throw new IllegalArgumentException("Address or modpackPath is null or empty"); @@ -377,6 +378,10 @@ public void startUpdate() { // Downloads completed Files.writeString(modpackContentFile, modpackContentJson); + if (callback != null) { + callback.run(); + } + Path cwd = Path.of(System.getProperty("user.dir")); CustomFileUtils.deleteDummyFiles(cwd, serverModpackContent.list); diff --git a/loader/loader-fabric-core.gradle.kts b/loader/loader-fabric-core.gradle.kts index 8f0a1c3a0..7d9e7839d 100644 --- a/loader/loader-fabric-core.gradle.kts +++ b/loader/loader-fabric-core.gradle.kts @@ -21,6 +21,7 @@ dependencies { compileOnly(project(":loader-core")) compileOnly(project(":loader-fabric-15")) compileOnly(project(":loader-fabric-16")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) compileOnly("com.google.code.gson:gson:2.10.1") compileOnly("org.apache.logging.log4j:log4j-core:2.8.1") diff --git a/loader/loader-forge.gradle.kts b/loader/loader-forge.gradle.kts index a6399dfbd..9e01609ae 100644 --- a/loader/loader-forge.gradle.kts +++ b/loader/loader-forge.gradle.kts @@ -19,6 +19,7 @@ legacyForge { dependencies { compileOnly(project(":core")) compileOnly(project(":loader-core")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) compileOnly("com.google.code.gson:gson:2.10.1") compileOnly("org.apache.logging.log4j:log4j-core:2.8.1") diff --git a/loader/loader-neoforge.gradle.kts b/loader/loader-neoforge.gradle.kts index 955b9c902..1ce8bc478 100644 --- a/loader/loader-neoforge.gradle.kts +++ b/loader/loader-neoforge.gradle.kts @@ -19,6 +19,7 @@ neoForge { dependencies { compileOnly(project(":core")) compileOnly(project(":loader-core")) + implementation(files(rootDir.resolve("ModflaredApi.jar"))) compileOnly("com.google.code.gson:gson:2.10.1") compileOnly("org.apache.logging.log4j:log4j-core:2.8.1") diff --git a/src/main/java/pl/skidam/automodpack/networking/packet/DataC2SPacket.java b/src/main/java/pl/skidam/automodpack/networking/packet/DataC2SPacket.java index 64dafbf0e..9143dbb86 100644 --- a/src/main/java/pl/skidam/automodpack/networking/packet/DataC2SPacket.java +++ b/src/main/java/pl/skidam/automodpack/networking/packet/DataC2SPacket.java @@ -1,5 +1,6 @@ package pl.skidam.automodpack.networking.packet; +import de.rafael.modflared.api.ModflaredApi; import io.netty.buffer.Unpooled; import pl.skidam.automodpack.mixin.core.ClientConnectionAccessor; import pl.skidam.automodpack.mixin.core.ClientLoginNetworkHandlerAccessor; @@ -17,7 +18,6 @@ import java.net.InetSocketAddress; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import net.minecraft.client.Minecraft; @@ -76,7 +76,6 @@ public static CompletableFuture receive(Minecraft Minecraft, Cl LOGGER.info("Modpack address: {}:{} Requires to follow magic protocol: {}", modpackAddress.getHostString(), modpackAddress.getPort(), requiresMagic); - Boolean needsDisconnecting = null; FriendlyByteBuf response = new FriendlyByteBuf(Unpooled.buffer()); Path modpackDir = ModpackUtils.getModpackPath(modpackAddress, modpackName); @@ -87,9 +86,20 @@ public static CompletableFuture receive(Minecraft Minecraft, Cl boolean update = ModpackUtils.isUpdate(optionalServerModpackContent.get(), modpackDir); if (update) { + String connectedAddressString = connectedAddress.getHostString(); + int connectedPort = connectedAddress.getPort(); + if (ModflaredApi.IAPITUNNEL != null && ModflaredApi.IAPITUNNEL.isModflaredTunnel(connectedAddressString, connectedPort)) { + ModflaredApi.IAPITUNNEL.addTunnelDependency(connectedAddress.getHostString(), connectedAddress.getPort(), "automodpack"); + } + + Runnable callback = () -> { + if (ModflaredApi.IAPITUNNEL != null) { + ModflaredApi.IAPITUNNEL.removeTunnelDependency(connectedAddressString, connectedPort, "automodpack"); + } + }; + disconnectImmediately(handler); - new ModpackUpdater().prepareUpdate(optionalServerModpackContent.get(), modpackAddresses, secret, modpackDir); - needsDisconnecting = true; + new ModpackUpdater().prepareUpdate(optionalServerModpackContent.get(), modpackAddresses, secret, modpackDir, callback); } else { boolean selectedModpackChanged = ModpackUtils.selectModpack(modpackDir, modpackAddresses, Set.of()); @@ -103,21 +113,17 @@ public static CompletableFuture receive(Minecraft Minecraft, Cl SecretsStore.saveClientSecret(clientConfig.selectedModpack, secret); disconnectImmediately(handler); new ReLauncher(modpackDir, UpdateType.SELECT, null).restart(false); - needsDisconnecting = true; - } else { - needsDisconnecting = false; } } } else if (ModpackUtils.canConnectModpackHost(modpackAddresses)) { // Can't download modpack because e.g. certificate is not verified but it can connect to the modpack host - needsDisconnecting = true; + disconnectImmediately(handler); } if (clientConfig.selectedModpack != null && !clientConfig.selectedModpack.isBlank()) { SecretsStore.saveClientSecret(clientConfig.selectedModpack, secret); } - response.writeUtf(String.valueOf(needsDisconnecting), Short.MAX_VALUE); - + response.writeUtf("false", Short.MAX_VALUE); return CompletableFuture.completedFuture(response); } catch (Exception e) { LOGGER.error("Error while handling data packet", e);