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")
private IntegerProperty logLines = new SimpleIntegerProperty(100);
@SerializedName("multiplayerToken")
private StringProperty multiplayerToken = new SimpleStringProperty();
@SerializedName("authlibInjectorServers")
private ObservableList<AuthlibInjectorServer> 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);
}
}

View File

@@ -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<CreationResult> callback;
private final FutureCallback<LocalServerDetector.PingResponse> callback;
private final LocalServerDetector lanServerDetectorThread;
private LocalServerDetector.PingResponse server;
CreateMultiplayerRoomDialog(FutureCallback<CreationResult> callback) {
CreateMultiplayerRoomDialog(FutureCallback<LocalServerDetector.PingResponse> 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;
}
}
}

View File

@@ -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())));
}

View File

@@ -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<MultiplayerPage> {
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(