package com.jenjinstudios.demo.client.ui;
import com.jenjinstudios.client.net.ClientUser;
import com.jenjinstudios.core.MessageIO;
import com.jenjinstudios.core.io.MessageInputStream;
import com.jenjinstudios.core.io.MessageOutputStream;
import com.jenjinstudios.demo.client.Main;
import com.jenjinstudios.world.client.WorldClient;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author Caleb Brinkman
*/
public final class LoginPane extends GridPane
{
private static final Logger LOGGER = Logger.getLogger(LoginPane.class.getName());
private final TextField addressField = new TextField("127.0.0.1");
private final TextField portField = new TextField("51015");
private final TextField usernameField = new TextField("TestAccount1");
private final Button loginButton = new Button("Login");
private final PasswordField passwordField = new PasswordField();
private final Main main;
private WorldClient worldClient;
public LoginPane(final Main main) {
this.main = main;
setHgap(10);
setVgap(10);
setPadding(new Insets(25, 25, 25, 25));
createForm();
}
public static WorldClient tryCreateWorldClient(String address, int port, ClientUser user) {
WorldClient worldClient;
try
{
worldClient = createWorldClient(address, port, user);
worldClient.start();
worldClient.initializeWorldFromServer();
LOGGER.log(Level.INFO, "Created World Client.");
} catch (IOException e)
{
LOGGER.log(Level.SEVERE, "Exception creating world client.", e);
worldClient = null;
}
return worldClient;
}
private static WorldClient createWorldClient(String address, int port, ClientUser clientUser) throws IOException {
String slash = File.separator;
File worldFile = new File(System.getProperty("user.home") + slash + ".jenjin-demo" + slash + "World.json");
Socket socket = new Socket(address, port);
MessageInputStream messageInputStream = new MessageInputStream(socket.getInputStream());
MessageOutputStream messageOutputStream = new MessageOutputStream(socket.getOutputStream());
MessageIO messageIO = new MessageIO(messageInputStream, messageOutputStream);
return new WorldClient(messageIO, clientUser, worldFile);
}
private void createForm() {
addressField.setPromptText("Server Address");
portField.setPromptText("Port Number");
usernameField.setPromptText("Username");
passwordField.setPromptText("Password");
passwordField.setText("testPassword");
add(addressField, 1, 0);
add(portField, 3, 0);
add(usernameField, 1, 1);
add(passwordField, 3, 1);
add(loginButton, 3, 2);
loginButton.setOnAction(this::loginButtonFired);
setOnKeyPressed(this::keyPressed);
}
private void keyPressed(KeyEvent event) {
if (event.getCode().equals(KeyCode.ENTER))
{
loginButton.fire();
}
}
private void loginButtonFired(ActionEvent event) {
LOGGER.log(Level.FINE, "Login Button Fired: {0}", event);
ClientUser clientUser = new ClientUser(usernameField.getText(), passwordField.getText());
String address = addressField.getText();
int port = Integer.parseInt(portField.getText());
worldClient = tryCreateWorldClient(address, port, clientUser);
if (worldClient != null)
{
logIn();
}
}
private void logIn() {
if (worldClient.getLoginTracker().sendLoginRequestAndWaitForResponse())
{
LOGGER.log(Level.INFO, "Successfully logged in!");
main.successfulLogin(worldClient);
} else
{
LOGGER.log(Level.WARNING, "Login unsuccessful");
worldClient.shutdown();
}
}
}