You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.7 KiB
124 lines
4.7 KiB
package engine.net.client.handlers; |
|
|
|
import engine.InterestManagement.WorldGrid; |
|
import engine.exception.MsgSendException; |
|
import engine.gameManager.DbManager; |
|
import engine.gameManager.SessionManager; |
|
import engine.mbEnums; |
|
import engine.net.client.ClientConnection; |
|
import engine.net.client.msg.ClientNetMsg; |
|
import engine.net.client.msg.LoginToGameServerMsg; |
|
import engine.net.client.msg.login.LoginErrorMsg; |
|
import engine.objects.Account; |
|
import engine.objects.PlayerCharacter; |
|
import engine.server.MBServerStatics; |
|
import engine.session.CSSession; |
|
import engine.session.Session; |
|
import org.pmw.tinylog.Logger; |
|
|
|
/* |
|
* @Author: |
|
* @Summary: Processes application protocol message which keeps |
|
* logs the character nto the game using the CSession key generated |
|
* by the Login server. |
|
*/ |
|
|
|
public class LoginToGameServerMsgHandler extends AbstractClientMsgHandler { |
|
|
|
public LoginToGameServerMsgHandler() { |
|
super(); |
|
} |
|
|
|
@Override |
|
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { |
|
|
|
LoginToGameServerMsg msg = (LoginToGameServerMsg) baseMsg; |
|
|
|
CSSession sessionInfo = CSSession.getCrossServerSession(msg.getSecKey()); |
|
|
|
if (sessionInfo == null) { |
|
Logger.error("Failed to validate session information from " + origin.getLocalAddressAndPortAsString()); |
|
origin.kickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, "Unable to validate session data"); |
|
// TODO Evaluate if we need to delete CSSessions here. We couldn't |
|
// find it before, why would this attempt be different? |
|
|
|
return true; |
|
} |
|
|
|
Account acc = sessionInfo.getAccount(); |
|
|
|
if (acc == null) { |
|
String err = "Session returned NULL Account. Conn:" + origin.getLocalAddressAndPortAsString(); |
|
Logger.error(err); |
|
origin.kickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, err); |
|
return true; |
|
} |
|
|
|
PlayerCharacter pc = sessionInfo.getPlayerCharacter(); |
|
|
|
if (pc == null) { |
|
String err = "Session returned NULL PlayerCharacter. Conn:" + origin.getLocalAddressAndPortAsString(); |
|
|
|
Logger.error(err); |
|
origin.kickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, err); |
|
return true; |
|
} |
|
|
|
// If account is suspended, kick |
|
|
|
if (acc.status.equals(mbEnums.AccountStatus.BANNED)) { |
|
origin.kickToLogin(MBServerStatics.LOGINERROR_NO_MORE_PLAYTIME_ON_ACCOUNT, "Account banned."); |
|
return true; |
|
} |
|
|
|
ClientConnection old = SessionManager.getClientConnection(acc); |
|
|
|
if (old != null) |
|
if (old != origin) { |
|
Logger.info("Disconnecting other client connection Using Same Account " + old.getRemoteAddressAndPortAsString()); |
|
old.disconnect(); |
|
} |
|
|
|
// Set machine ID here from CSS info |
|
origin.machineID = sessionInfo.getMachineID(); |
|
|
|
// Send response |
|
msg.setSecKey(""); |
|
|
|
if (!origin.sendMsg(msg)) { |
|
Logger.error("Failed to send message"); |
|
origin.kickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, "Unable to send ValidateGameServer to client."); |
|
return true; |
|
} |
|
|
|
//# Why was this all changed? |
|
// CLEAN UP OTHER INSTANCES OF THIS CHARACTER |
|
|
|
Session toKill = SessionManager.getSession(sessionInfo.getPlayerCharacter()); |
|
|
|
if (toKill != null) { |
|
if (toKill.getConn() != null) { |
|
LoginErrorMsg lom = new LoginErrorMsg(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, "You may not login the same character twice!"); |
|
ClientConnection conn = toKill.getConn(); |
|
if (conn != null && !conn.sendMsg(lom)) |
|
Logger.error("Failed to send message"); // TODO Do we just accept this failure to send Msg? |
|
} |
|
SessionManager.remSession(toKill); |
|
WorldGrid.RemoveWorldObject(sessionInfo.getPlayerCharacter()); |
|
} |
|
Session s = SessionManager.getNewSession(sessionInfo.getAccount(), origin); |
|
SessionManager.setPlayerCharacter(s, sessionInfo.getPlayerCharacter()); |
|
|
|
Logger.info("Login from Account: " + sessionInfo.getAccount().getUname() + " Character: " + |
|
sessionInfo.getPlayerCharacter().getName() + " machineID: " + sessionInfo.getMachineID()); |
|
|
|
// Log Admin Login Event |
|
|
|
if (pc.getAccount().status.equals(mbEnums.AccountStatus.ADMIN)) |
|
DbManager.AccountQueries.WRITE_ADMIN_LOG(pc.getCombinedName(), "ADMIN LOGIN"); |
|
|
|
DbManager.AccountQueries.SET_ACCOUNT_LOGIN(sessionInfo.getAccount(), sessionInfo.getPlayerCharacter().getName(), origin.getClientIpAddress(), sessionInfo.getMachineID()); |
|
return true; |
|
} |
|
|
|
} |