From e776532947a721391d539ed2f57b06cdc16519de Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Mon, 27 Sep 2021 12:48:42 +0800 Subject: [PATCH] feat(multiplayer): save token. --- .../org/jackhuang/hmcl/setting/Config.java | 15 ++++++++ .../CreateMultiplayerRoomDialog.java | 36 +++---------------- .../hmcl/ui/multiplayer/MultiplayerPage.java | 11 +++--- .../ui/multiplayer/MultiplayerPageSkin.java | 14 +++++++- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index ba8115edc..3918743ff 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -158,6 +158,9 @@ public final class Config implements Cloneable, Observable { @SerializedName("logLines") private IntegerProperty logLines = new SimpleIntegerProperty(100); + @SerializedName("multiplayerToken") + private StringProperty multiplayerToken = new SimpleStringProperty(); + @SerializedName("authlibInjectorServers") private ObservableList authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server }); @@ -580,4 +583,16 @@ public final class Config implements Cloneable, Observable { public StringProperty preferredLoginTypeProperty() { return preferredLoginType; } + + public String getMultiplayerToken() { + return multiplayerToken.get(); + } + + public StringProperty multiplayerTokenProperty() { + return multiplayerToken; + } + + public void setMultiplayerToken(String multiplayerToken) { + this.multiplayerToken.set(multiplayerToken); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/CreateMultiplayerRoomDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/CreateMultiplayerRoomDialog.java index c210798e8..cf38a2c33 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/CreateMultiplayerRoomDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/CreateMultiplayerRoomDialog.java @@ -17,9 +17,6 @@ */ package org.jackhuang.hmcl.ui.multiplayer; -import com.jfoenix.controls.JFXTextField; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.layout.ColumnConstraints; @@ -38,13 +35,12 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAware { - private final StringProperty token = new SimpleStringProperty(); - private final FutureCallback callback; + private final FutureCallback callback; private final LocalServerDetector lanServerDetectorThread; private LocalServerDetector.PingResponse server; - CreateMultiplayerRoomDialog(FutureCallback callback) { + CreateMultiplayerRoomDialog(FutureCallback callback) { this.callback = callback; setTitle(i18n("multiplayer.session.create")); @@ -63,21 +59,16 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa body.addRow(0, hintPane); - JFXTextField tokenField = new JFXTextField(); - tokenField.textProperty().bindBidirectional(token); - tokenField.setPromptText(i18n("multiplayer.session.create.token.prompt")); - body.addRow(1, new Label(i18n("multiplayer.session.create.token")), tokenField); - Label nameField = new Label(); nameField.setText(Optional.ofNullable(Accounts.getSelectedAccount()) .map(Account::getUsername) .map(username -> i18n("multiplayer.session.name.format", username)) .orElse("")); - body.addRow(2, new Label(i18n("multiplayer.session.create.name")), nameField); + body.addRow(1, new Label(i18n("multiplayer.session.create.name")), nameField); Label portLabel = new Label(i18n("multiplayer.nat.testing")); portLabel.setText(i18n("multiplayer.nat.testing")); - body.addRow(3, new Label(i18n("multiplayer.session.create.port")), portLabel); + body.addRow(2, new Label(i18n("multiplayer.session.create.port")), portLabel); setValid(false); @@ -111,7 +102,7 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa protected void onAccept() { setLoading(); - callback.call(new CreationResult(token.get(), Objects.requireNonNull(server)), () -> { + callback.call(Objects.requireNonNull(server), () -> { runInFX(this::onSuccess); }, msg -> { runInFX(() -> onFailure(msg)); @@ -130,21 +121,4 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa lanServerDetectorThread.interrupt(); } - public static class CreationResult { - private final String token; - private final LocalServerDetector.PingResponse server; - - public CreationResult(String token, LocalServerDetector.PingResponse server) { - this.token = token; - this.server = server; - } - - public String getToken() { - return token; - } - - public LocalServerDetector.PingResponse getServer() { - return server; - } - } } 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 8cb41855e..1917de734 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 @@ -38,6 +38,7 @@ import java.util.concurrent.CancellationException; import java.util.function.Consumer; import java.util.logging.Level; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -170,9 +171,9 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware } Controllers.dialog(new CreateMultiplayerRoomDialog((result, resolve, reject) -> { - int port = result.getServer().getAd(); + int port = result.getAd(); try { - initCatoSession(MultiplayerManager.createSession(result.getToken(), result.getServer().getMotd(), port)); + initCatoSession(MultiplayerManager.createSession(config().getMultiplayerToken(), result.getMotd(), port)); } catch (Exception e) { LOG.log(Level.WARNING, "Failed to create session", e); reject.accept(i18n("multiplayer.session.create.error")); @@ -191,8 +192,7 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware } Controllers.prompt(new PromptDialogPane.Builder(i18n("multiplayer.session.join"), (result, resolve, reject) -> { - String token = ((PromptDialogPane.Builder.StringQuestion) result.get(1)).getValue(); - String invitationCode = ((PromptDialogPane.Builder.StringQuestion) result.get(2)).getValue(); + String invitationCode = ((PromptDialogPane.Builder.StringQuestion) result.get(1)).getValue(); MultiplayerManager.Invitation invitation; try { invitation = MultiplayerManager.parseInvitationCode(invitationCode); @@ -211,7 +211,7 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware } try { - MultiplayerManager.joinSession(token, invitation.getVersion(), invitation.getSessionName(), invitation.getId(), invitation.getGamePort(), localPort) + MultiplayerManager.joinSession(config().getMultiplayerToken(), invitation.getVersion(), invitation.getSessionName(), invitation.getId(), invitation.getGamePort(), localPort) .thenAcceptAsync(session -> { initCatoSession(session); @@ -235,7 +235,6 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware } }) .addQuestion(new PromptDialogPane.Builder.HintQuestion(i18n("multiplayer.session.join.hint"))) - .addQuestion(new PromptDialogPane.Builder.StringQuestion(i18n("multiplayer.session.create.token"), "").setPromptText(i18n("multiplayer.session.create.token.prompt"))) .addQuestion(new PromptDialogPane.Builder.StringQuestion(i18n("multiplayer.session.join.invitation_code"), "", new RequiredValidator()))); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java index 80a6e8a5f..e7066cb66 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/multiplayer/MultiplayerPageSkin.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.ui.multiplayer; import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXTextField; import de.javawi.jstun.test.DiscoveryInfo; import javafx.beans.binding.Bindings; import javafx.geometry.Insets; @@ -38,6 +39,7 @@ import org.jackhuang.hmcl.ui.construct.*; import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.util.javafx.BindingMapping; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.ui.versions.VersionPage.wrap; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -231,9 +233,19 @@ public class MultiplayerPageSkin extends SkinBase { ComponentList thanksPane = new ComponentList(); { + GridPane gridPane = new GridPane(); + gridPane.getColumnConstraints().setAll(new ColumnConstraints(), FXUtils.getColumnHgrowing()); + gridPane.setVgap(8); + gridPane.setHgap(16); + + JFXTextField tokenField = new JFXTextField(); + tokenField.textProperty().bindBidirectional(config().multiplayerTokenProperty()); + tokenField.setPromptText(i18n("multiplayer.session.create.token.prompt")); + gridPane.addRow(0, new Label(i18n("multiplayer.session.create.token")), tokenField); + Label label = new Label(i18n("multiplayer.powered_by")); - thanksPane.getContent().add(label); + thanksPane.getContent().addAll(gridPane, label); } content.getChildren().setAll(