// TransferServerConnection.cpp // copyright 2000 Verant Interactive // Author: Justin Randall //----------------------------------------------------------------------- #include "FirstCentralServer.h" #include "ConfigCentralServer.h" #include "ConnectionServerConnection.h" #include "ConsoleConnection.h" #include "serverNetworkMessages/CharacterTransferStatusMessage.h" #include "serverNetworkMessages/ToggleAvatarLoginStatus.h" #include "serverNetworkMessages/TransferAccountData.h" #include "serverNetworkMessages/TransferAccountDataArchive.h" #include "serverNetworkMessages/TransferCharacterData.h" #include "serverNetworkMessages/TransferCharacterDataArchive.h" #include "serverNetworkMessages/TransferRequestMoveValidation.h" #include "serverNetworkMessages/UploadCharacterMessage.h" #include "serverNetworkMessages/ValidateAccountMessage.h" #include "sharedLog/Log.h" #include "sharedNetwork/NetworkSetupData.h" #include "sharedNetworkMessages/ConsoleChannelMessages.h" #include "sharedNetworkMessages/GenericValueTypeMessage.h" #include "TransferServerConnection.h" //----------------------------------------------------------------------- TransferServerConnection::TransferServerConnection(const std::string & a, const unsigned short p) : ServerConnection(a, p, NetworkSetupData()) { } //----------------------------------------------------------------------- TransferServerConnection::~TransferServerConnection() { } //----------------------------------------------------------------------- void TransferServerConnection::onConnectionClosed() { static MessageConnectionCallback m("TransferServerConnectionClosed"); emitMessage(m); } //----------------------------------------------------------------------- void TransferServerConnection::onConnectionOpened() { LOG("TransferServerConnection", ("Connection with the transfer server is open, sending CentralGalaxyName message(%s)", ConfigCentralServer::getClusterName())); static MessageConnectionCallback m("TransferServerConnectionOpened"); emitMessage(m); // send galaxy name to the character transfer server GenericValueTypeMessage cgn("CentralGalaxyName", ConfigCentralServer::getClusterName()); send(cgn, true); } //----------------------------------------------------------------------- void TransferServerConnection::onReceive(const Archive::ByteStream & message) { Archive::ReadIterator ri = message.begin(); const GameNetworkMessage msg(ri); ri = message.begin(); if(msg.isType("UploadCharacterMessage")) { const UploadCharacterMessage ucm(ri); CentralServer::getInstance().sendToGameServer(ucm.getFromGameServerId(), ucm, true); LOG("TransferServerConnection", ("Received character data for SUID %lu for character object %s on game server %d", ucm.getStationId(), ucm.getFromCharacterId().getValueString().c_str(), ucm.getFromGameServerId())); } else if(msg.isType("CharacterTransferStatusMessage")) { const CharacterTransferStatusMessage ctsm(ri); CentralServer::getInstance().sendToGameServer(ctsm.getGameServerId(), ctsm, true); } else if(msg.isType("TransferRequestCharacterList")) { // simply forward the request to any available login server const GenericValueTypeMessage request(ri); IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(request)); } else if(msg.isType("TransferRequestMoveValidation")) { const TransferRequestMoveValidation request(ri); IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(request)); LOG("CustomerService", ("CharacterTransfer: Received TransferRequestMoveValidation : %s on %s to %s on %s. Forwarding request to LoginServer.", request.getSourceCharacter().c_str(), request.getSourceGalaxy().c_str(), request.getDestinationCharacter().c_str(), request.getDestinationGalaxy().c_str())); } else if(msg.isType("TransferRequestKickConnectedClients")) { GenericValueTypeMessage > const request(ri); // disconnect any clients with a connection to SWG services GenericValueTypeMessage kickSource("TransferKickConnectedClients", request.getValue().first); GenericValueTypeMessage kickDestination("TransferKickConnectedClients", request.getValue().second); CentralServer::getInstance().sendToAllLoginServers(kickSource); CentralServer::getInstance().sendToAllLoginServers(kickDestination); CentralServer::getInstance().sendToAllConnectionServers(kickSource, true); CentralServer::getInstance().sendToAllConnectionServers(kickDestination, true); } else if(msg.isType("TransferGetCharacterDataFromLoginServer")) { const GenericValueTypeMessage getCharacterData(ri); // The transfer server has received a move request. The request doesn't // contain the source id of the character, character's container or scene // information. The LoginServer can retrieve the character ID for the // source station id + character name contained in character data. // Forward the request to the login server. It will respond and the // message can be routed back to the transfer server for further // processing IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(getCharacterData)); LOG("CustomerService", ("CharacterTransfer: ***CentralServer: received TransferGetCharacterDataFromLoginServer : %s)", getCharacterData.getValue().toString().c_str())); } else if(msg.isType("TransferGetLoginLocationData")) { GenericValueTypeMessage getLoginData(ri); CentralServer::getInstance().sendToDBProcess(getLoginData, true); LOG("CustomerService", ("CharacterTransfer: ***CentralServer: Received TransferGetLoginLocationData for %s\n", getLoginData.getValue().getSourceCharacterName().c_str())); } else if(msg.isType("TransferLoginCharacterToSourceServer")) { const GenericValueTypeMessage loginCharacter(ri); ConnectionServerConnection * connectionServer = CentralServer::getInstance().getAnyConnectionServer(); if(connectionServer) { connectionServer->send(loginCharacter, true); LOG("CustomerService", ("CharacterTransfer: ***CentralServer: Received TransferLoginCharacterToSourceServer request from Transfer Server. Sendint request to ConnectionServer : %s\n", loginCharacter.getValue().toString().c_str())); } else { LOG("CustomerService", ("CharacterTransfer: ***CentralServer: Couldn't find a connection server to satisfy the transfer request for %s\n", loginCharacter.getValue().toString().c_str())); } } else if(msg.isType("TransferLoginCharacterToDestinationServer")) { const GenericValueTypeMessage loginCharacter(ri); LOG("CustomerService", ("CharacterTransfer: ***CentralServer: Received TransferLoginCharacterToDestinationServer request from Transfer Server for %s\n", loginCharacter.getValue().toString().c_str())); ConnectionServerConnection * connectionServer = CentralServer::getInstance().getAnyConnectionServer(); if(connectionServer) { connectionServer->send(loginCharacter, true); } } else if(msg.isType("ToggleAvatarLoginStatus")) { ToggleAvatarLoginStatus toggle(ri); LOG("CustomerService", ("CharacterTransfer: Received ToggleAvatarLoginStatus for station ID %d, Character Object %s", toggle.getStationId(), toggle.getCharacterId().getValueString().c_str())); IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(toggle)); } else if(msg.isType("TransferRequestNameValidation")) { GenericValueTypeMessage request(ri); LOG("CustomerService", ("CharacterTransfer: Received TransferRequestNameValidation from TransferServer. Forwarding request to a random GameServer. %s", request.getValue().toString().c_str())); IGNORE_RETURN(CentralServer::getInstance().sendToRandomGameServer(request)); } else if(msg.isType("TransferRenameCharacter")) { GenericValueTypeMessage renameRequest(ri); LOG("CustomerService", ("CharacterTransfer: Received TransferRenameCharacter. Sending rename request to game database. %s", renameRequest.getValue().toString().c_str())); // send first portion of request to DBProcess , wait for response CentralServer::getInstance().sendToDBProcess(renameRequest, true); } else if(msg.isType("TransferAccountRequestLoginServer")) { // got message to transfer a character from one account to another - have to update in loginServer GenericValueTypeMessage accountTransferRequest(ri); LOG("CustomerService", ("CharacterTransfer: Received TransferAccountRequestLoginServer from station ID %d to station ID %d", accountTransferRequest.getValue().getSourceStationId(), accountTransferRequest.getValue().getDestinationStationId())); IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(accountTransferRequest)); } else if(msg.isType("RequestChatTransferAvatar")) { GenericValueTypeMessage chatTransferAvatar(ri); LOG("CustomerService", ("CharacterTransfer: Received RequestChatTransferAvatar from TransferServer. Forward request to ChatServer. %s", chatTransferAvatar.getValue().toString().c_str())); CentralServer::getInstance().broadcastToChatServers(chatTransferAvatar); } else if(msg.isType("DeleteFailedTransfer")) { GenericValueTypeMessage deleteCharacter(ri); LOG("CustomerService", ("CharacterTransfer: received request to delete a character for a failed transfer. %s", deleteCharacter.getValue().toString().c_str())); IGNORE_RETURN(CentralServer::getInstance().sendToArbitraryLoginServer(deleteCharacter)); } else if(msg.isType("TransferClosePseudoClientConnection")) { GenericValueTypeMessage closeRequest(ri); CentralServer::getInstance().sendToAllConnectionServers(closeRequest, true); } else if(msg.isType("ConGenericMessage")) { ConGenericMessage con(ri); ConsoleConnection::onCommandComplete(con.getMsg(), static_cast(con.getMsgId())); } } //-----------------------------------------------------------------------