feat(multiplayer): save token.

This commit is contained in:
huanghongxun
2021-09-27 12:48:42 +08:00
parent 35f2d89a23
commit e776532947
4 changed files with 38 additions and 38 deletions

View File

@@ -158,6 +158,9 @@ public final class Config implements Cloneable, Observable {
@SerializedName("logLines") @SerializedName("logLines")
private IntegerProperty logLines = new SimpleIntegerProperty(100); private IntegerProperty logLines = new SimpleIntegerProperty(100);
@SerializedName("multiplayerToken")
private StringProperty multiplayerToken = new SimpleStringProperty();
@SerializedName("authlibInjectorServers") @SerializedName("authlibInjectorServers")
private ObservableList<AuthlibInjectorServer> authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server }); private ObservableList<AuthlibInjectorServer> authlibInjectorServers = FXCollections.observableArrayList(server -> new Observable[] { server });
@@ -580,4 +583,16 @@ public final class Config implements Cloneable, Observable {
public StringProperty preferredLoginTypeProperty() { public StringProperty preferredLoginTypeProperty() {
return preferredLoginType; return preferredLoginType;
} }
public String getMultiplayerToken() {
return multiplayerToken.get();
}
public StringProperty multiplayerTokenProperty() {
return multiplayerToken;
}
public void setMultiplayerToken(String multiplayerToken) {
this.multiplayerToken.set(multiplayerToken);
}
} }

View File

@@ -17,9 +17,6 @@
*/ */
package org.jackhuang.hmcl.ui.multiplayer; 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.Label;
import javafx.scene.control.ProgressIndicator; import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.ColumnConstraints; 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 { public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAware {
private final StringProperty token = new SimpleStringProperty(); private final FutureCallback<LocalServerDetector.PingResponse> callback;
private final FutureCallback<CreationResult> callback;
private final LocalServerDetector lanServerDetectorThread; private final LocalServerDetector lanServerDetectorThread;
private LocalServerDetector.PingResponse server; private LocalServerDetector.PingResponse server;
CreateMultiplayerRoomDialog(FutureCallback<CreationResult> callback) { CreateMultiplayerRoomDialog(FutureCallback<LocalServerDetector.PingResponse> callback) {
this.callback = callback; this.callback = callback;
setTitle(i18n("multiplayer.session.create")); setTitle(i18n("multiplayer.session.create"));
@@ -63,21 +59,16 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa
body.addRow(0, hintPane); 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(); Label nameField = new Label();
nameField.setText(Optional.ofNullable(Accounts.getSelectedAccount()) nameField.setText(Optional.ofNullable(Accounts.getSelectedAccount())
.map(Account::getUsername) .map(Account::getUsername)
.map(username -> i18n("multiplayer.session.name.format", username)) .map(username -> i18n("multiplayer.session.name.format", username))
.orElse("")); .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")); Label portLabel = new Label(i18n("multiplayer.nat.testing"));
portLabel.setText(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); setValid(false);
@@ -111,7 +102,7 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa
protected void onAccept() { protected void onAccept() {
setLoading(); setLoading();
callback.call(new CreationResult(token.get(), Objects.requireNonNull(server)), () -> { callback.call(Objects.requireNonNull(server), () -> {
runInFX(this::onSuccess); runInFX(this::onSuccess);
}, msg -> { }, msg -> {
runInFX(() -> onFailure(msg)); runInFX(() -> onFailure(msg));
@@ -130,21 +121,4 @@ public class CreateMultiplayerRoomDialog extends DialogPane implements DialogAwa
lanServerDetectorThread.interrupt(); 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;
}
}
} }

View File

@@ -38,6 +38,7 @@ import java.util.concurrent.CancellationException;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; 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.ui.FXUtils.runInFX;
import static org.jackhuang.hmcl.util.Logging.LOG; import static org.jackhuang.hmcl.util.Logging.LOG;
import static org.jackhuang.hmcl.util.i18n.I18n.i18n; 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) -> { Controllers.dialog(new CreateMultiplayerRoomDialog((result, resolve, reject) -> {
int port = result.getServer().getAd(); int port = result.getAd();
try { try {
initCatoSession(MultiplayerManager.createSession(result.getToken(), result.getServer().getMotd(), port)); initCatoSession(MultiplayerManager.createSession(config().getMultiplayerToken(), result.getMotd(), port));
} catch (Exception e) { } catch (Exception e) {
LOG.log(Level.WARNING, "Failed to create session", e); LOG.log(Level.WARNING, "Failed to create session", e);
reject.accept(i18n("multiplayer.session.create.error")); 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) -> { 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(1)).getValue();
String invitationCode = ((PromptDialogPane.Builder.StringQuestion) result.get(2)).getValue();
MultiplayerManager.Invitation invitation; MultiplayerManager.Invitation invitation;
try { try {
invitation = MultiplayerManager.parseInvitationCode(invitationCode); invitation = MultiplayerManager.parseInvitationCode(invitationCode);
@@ -211,7 +211,7 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware
} }
try { 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 -> { .thenAcceptAsync(session -> {
initCatoSession(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.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()))); .addQuestion(new PromptDialogPane.Builder.StringQuestion(i18n("multiplayer.session.join.invitation_code"), "", new RequiredValidator())));
} }

View File

@@ -18,6 +18,7 @@
package org.jackhuang.hmcl.ui.multiplayer; package org.jackhuang.hmcl.ui.multiplayer;
import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextField;
import de.javawi.jstun.test.DiscoveryInfo; import de.javawi.jstun.test.DiscoveryInfo;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.geometry.Insets; 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.ui.versions.Versions;
import org.jackhuang.hmcl.util.javafx.BindingMapping; 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.ui.versions.VersionPage.wrap;
import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
@@ -231,9 +233,19 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
ComponentList thanksPane = new ComponentList(); 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")); Label label = new Label(i18n("multiplayer.powered_by"));
thanksPane.getContent().add(label); thanksPane.getContent().addAll(gridPane, label);
} }
content.getChildren().setAll( content.getChildren().setAll(