From b69c400a08cb3b8130bcca015304a54a9ec39e6e Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Mon, 12 Sep 2022 22:45:38 +0800 Subject: [PATCH] fix(multiplayer): get ip from hiper log. --- .../ui/multiplayer/MultiplayerManager.java | 19 +++++++++++++++++++ .../hmcl/ui/multiplayer/MultiplayerPage.java | 16 ++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java index 4732487e3..b07b8245f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerManager.java @@ -217,6 +217,7 @@ public final class MultiplayerManager { public static class HiperSession extends ManagedProcess { private final EventManager onExit = new EventManager<>(); + private final EventManager onIPAllocated = new EventManager<>(); private final BufferedWriter writer; HiperSession(Process process, List commands) { @@ -262,6 +263,11 @@ public final class MultiplayerManager { public EventManager onExit() { return onExit; } + + public EventManager onIPAllocated() { + return onIPAllocated; + } + } public static class HiperExitEvent extends Event { @@ -282,6 +288,19 @@ public final class MultiplayerManager { public static final int CERTIFICATE_EXPIRED = 11; } + public static class HiperIPEvent extends Event { + private final String ip; + + public HiperIPEvent(Object source, String ip) { + super(source); + this.ip = ip; + } + + public String getIP() { + return ip; + } + } + public static class HiperExitException extends RuntimeException { private final int exitCode; private final boolean ready; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java index 70518b74f..f89010b3b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPage.java @@ -39,7 +39,6 @@ import org.jetbrains.annotations.Nullable; import java.util.concurrent.CancellationException; import java.util.function.Consumer; -import java.util.function.Function; import java.util.logging.Level; import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig; @@ -57,6 +56,7 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP private final StringProperty address = new SimpleStringProperty(); private Consumer onExit; + private Consumer onIPAllocated; public MultiplayerPage() { testNAT(); @@ -205,7 +205,11 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP public void start() { MultiplayerManager.startHiper(globalConfig().getMultiplayerToken()) - .thenAcceptAsync(this.session::set, Schedulers.javafx()) + .thenAcceptAsync(session -> { + this.session.set(session); + onExit = session.onExit().registerWeak(this::onExit); + onIPAllocated = session.onIPAllocated().registerWeak(this::onIPAllocated); + }, Schedulers.javafx()) .exceptionally(throwable -> { runInFX(() -> Controllers.dialog(localizeErrorMessage(throwable), null, MessageDialogPane.MessageType.ERROR)); return null; @@ -221,6 +225,14 @@ public class MultiplayerPage extends DecoratorAnimatedPage implements DecoratorP private void clearSession() { this.session.set(null); + this.onExit = null; + this.onIPAllocated = null; + } + + private void onIPAllocated(MultiplayerManager.HiperIPEvent event) { + runInFX(() -> { + this.address.set(event.getIP()); + }); } private void onExit(MultiplayerManager.HiperExitEvent event) {