package net.cis.server.main.listener;
import java.util.Map;
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 net.cis.server.backend.manager.ISecurityManager;
import net.cis.server.backend.manager.ISystemManager;
import net.cis.server.backend.manager.IUserManager;
import net.cis.server.backend.model.ClientState;
import net.cis.server.backend.model.UserAuthorizedToken;
import org.apache.commons.logging.LogFactory;
import com.jme3.network.HostedConnection;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
public class ServerMessageListener implements MessageListener<HostedConnection> {
private final Map<Integer, ClientState> clientMap;
private ISystemManager systemManager;
private ISecurityManager securityManager;
private IUserManager userManager;
public ServerMessageListener(Map<Integer, ClientState> clientMap) {
this.clientMap = clientMap;
}
@Override
public void messageReceived(HostedConnection source, Message m) {
ClientState client = clientMap.get(source.getId());
if (client == null) {
source.close("You're not known by the server. Did you please gracefully for a connection?");
LogFactory.getLog(ServerMessageListener.class).error("Unknown Host! : " + source.getAddress());
}
if (!client.isAuthorized())
doHandshake(client, m);
}
private void doHandshake(ClientState client, Message m) {
if (m instanceof GameVersionMessage) {
GameVersionMessage msg = (GameVersionMessage) m;
if (!systemManager.validateGameVersion(msg.getGameVersion())) {
client.setUpToDate(false);
client.conn.send(new GameVersionMessage(systemManager.getGameVersion()));
} else {
client.setUpToDate(true);
client.conn.send(new GameInformationMessage(systemManager.getActualGameInformation()));
}
} else if (m instanceof AuthorizeMessage) {
if (!client.isUpToDate()) {
clientMap.remove(client.conn.getId());
client.conn.close("You MUST update your Client!");
}
if (client.isAuthorized())
return;
AuthorizeMessage msg = (AuthorizeMessage) m;
UserAuthorizedToken token = securityManager.authorize(msg.getUsername(), msg.getPassword());
if (token == null) {
clientMap.remove(client.conn.getId());
client.conn.close("Username/password not known or incorrect!");
} else {
client.setAuthenticationToken(token);
client.conn.send(new UserDataMessage(userManager.getUserData(token)));
}
}
}
public void setSystemManager(ISystemManager systemManager) {
this.systemManager = systemManager;
}
public void setSecurityManager(ISecurityManager securityManager) {
this.securityManager = securityManager;
}
public void setUserManager(IUserManager userManager) {
this.userManager = userManager;
}
}