package net.cis.client.main.ctrl;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import net.cis.client.game.common.threading.IGameDestroyCallback;
import net.cis.client.game.ctrl.GameApplication;
import net.cis.client.game.ctrl.GameController;
import net.cis.client.login.AbstractLoginController;
import net.cis.client.main.ClientMain;
import net.cis.common.model.system.UserData;
import net.cis.common.model.system.message.AuthorizeMessage;
import net.cis.common.model.system.message.GameInformationMessage;
import net.cis.common.model.system.message.GameVersionMessage;
import net.cis.common.model.system.message.UserDataMessage;
import org.apache.commons.logging.LogFactory;
import com.jme3.network.Client;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
import com.jme3.network.Network;
import com.jme3.network.NetworkClient;
import com.jme3.niftygui.NiftyJmeDisplay;
public class LoginController extends AbstractLoginController implements MessageListener<Client> {
private final GameApplication gameApp;
private boolean authorized = false;
private Timer startLoginTimer;
private final NiftyJmeDisplay niftyDisplay;
public LoginController(GameApplication gameApp, NiftyJmeDisplay niftyDisplay) {
this.gameApp = gameApp;
this.niftyDisplay = niftyDisplay;
}
@Override
public void doLogin(String name, String password, String server) {
final Client cisClient = initClient(server);
if (cisClient == null)
return;
HandshakeController handshakeController = new HandshakeController(cisClient, callback);
cisClient.addClientStateListener(handshakeController);
cisClient.addMessageListener(handshakeController, GameVersionMessage.class, GameInformationMessage.class,
AuthorizeMessage.class);
cisClient.addMessageListener(this, UserDataMessage.class);
gameApp.addGameDestroyCallback(new IGameDestroyCallback() {
@Override
public void destroy() {
cisClient.close();
}
});
cisClient.start();
startLoginTimer = startLoginTimer();
handshakeController.authenticate(name, password);
}
@Override
public void messageReceived(Client source, Message m) {
if (!(m instanceof UserDataMessage))
throw new RuntimeException("Error! This must not happen!");
if (!authorized) {
authorized = true;
startLoginTimer.cancel();
startLoginTimer = null;
String msg = "Authorization successful!";
LogFactory.getLog(LoginController.class).info(msg);
callback.statusMessage(msg);
}
UserDataMessage userDataMsg = (UserDataMessage) m;
startGame(userDataMsg.getUserData());
}
public void startGame(UserData userData) {
// TODO: UserData verarbeiten (Position des spielers, ...)
GameController gc = new GameController(userData, niftyDisplay);
gameApp.getStateManager().attach(gc);
}
private Client initClient(String server) {
String[] serverStrings = server.split(":");
int port = 0;
if (serverStrings.length != 2) {
String errMsg = "Wrong Server-Format: " + server;
loginFailed(errMsg);
LogFactory.getLog(ClientMain.class).warn(errMsg);
return null;
}
try {
port = Integer.parseInt(serverStrings[1]);
} catch (NumberFormatException e) {
String errMsg = "Wrong portnumber: " + serverStrings[1];
loginFailed(errMsg);
LogFactory.getLog(ClientMain.class).warn(errMsg, e);
}
final NetworkClient cisClient = Network.createClient();
try {
cisClient.connectToServer(serverStrings[0], port, port);
} catch (IOException e) {
String errMsg = "Could not find server!";
LogFactory.getLog(ClientMain.class).warn(errMsg, e);
loginFailed(errMsg);
return null;
}
return cisClient;
}
private Timer startLoginTimer() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
String errMsg = "Timeout while trying to connect!";
loginFailed(errMsg);
LogFactory.getLog(LoginController.class).warn(errMsg);
}
}, 10000);
return timer;
}
}