#include "StdAfx.h" #include ".\handler_sa.h" #include #include #include #include #include #include "ServerSession.h" #include "UserSession.h" #include "ServerSessionManager.h" #include "User.h" #include "UserManager.h" #include "World.h" #include "UnitServer.h" #include "WorldManager.h" #include "AgentInfoParser.h" #include "AgentInfo.h" #include "AgentServerSession.h" Handler_SA::Handler_SA(void) { } Handler_SA::~Handler_SA(void) { } // Agent Auth VOID Handler_SA::OnHandler_SA_SERVER_AUTH_SYN( ServerSession *pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_AUTH_SYN *pRecvMsg = (MSG_SA_SERVER_AUTH_SYN*)pMsg; // ÇØ´ç IPÀÇ Agent Á¤º¸°¡ Á¸ÀçÇÏ´ÂÁö üũ AgentInfo *pAgentInfo = AgentInfoParser::Instance()->GetAgentInfo( pSession->GetIP() ); MSG_SA_SERVER_AUTH_ACK AckMsg; if( pAgentInfo ) { AckMsg.m_byResult = RC_AGENT_AUTH_SUCCESS; AckMsg.m_dwAgentKey = pAgentInfo->GetKey(); pSession->SetServerKey( pAgentInfo->GetKey() ); ServerSessionManager::Instance()->AddSession( pSession ); MSGOUT( "[Handler_SA::OnHandler_SA_SERVER_AUTH_SYN] AgentServer Auth Success, Key = %u", pAgentInfo->GetKey() ); } else { AckMsg.m_byResult = RC_AGENT_AUTH_FAIL; AckMsg.m_dwAgentKey = 0; MSGOUT( "[Handler_SA::OnHandler_SA_SERVER_AUTH_SYN] AgentServer Auth Fail, Key = %d, 0" ); } pSession->SendPacket( (BYTE*)&AckMsg, sizeof(AckMsg) ); } // ¼­¹ö ½ÃÀÛ °á°ú VOID Handler_SA::OnHandler_SA_SERVER_EXECUTE_ACK( ServerSession *pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_EXECUTE_ACK *pRecvMsg = (MSG_SA_SERVER_EXECUTE_ACK*)pMsg; // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[SERVER_EXECUTE_ACK] Can't find ServerStart-User!" ); return; } // ¼­¹ö½ÃÀÛ °á°ú¸¦ ¾Ë¸°´Ù. MSG_SM_SERVER_EXECUTE_ACK AckMsg; AckMsg.m_byResult = pRecvMsg->m_byResult; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); pUser->SendPacket( &AckMsg, sizeof(AckMsg) ); //ÆÐÄ¡ ½ÃÀÛÀ» Àü À¯Àú¿¡°Ô ¾Ë·Á¼­ ÆÐÄ¡ ½ÃÀ۽à ´Ù¸¥ ÀÛ¾÷À» ¸øÇÏ°Ô ÇÑ´Ù. MSGOUT( "[SERVER_EXECUTE_ACK] Result : %d, World : %d, Channel : %d, ServerType : %d, ServerNum %d " , AckMsg.m_byResult, pRecvMsg->m_ServerInfo.m_byWorld, pRecvMsg->m_ServerInfo.m_byChannel , pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_ServerInfo.m_byServerNum ); } VOID Handler_SA::OnHandler_SA_SERVER_FORCE_DISCONNECT_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_FORCE_DISCONNECT_ACK *pRecvMsg = (MSG_SA_SERVER_FORCE_DISCONNECT_ACK*)pMsg; // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[Handler_SA::OnHandler_SA_SERVER_FORCE_DISCONNECT_ACK] Can't find ServerStart-User!" ); return; } // ¼­¹ö °­Á¦Á¾·á °á°ú¸¦ ¾Ë¸°´Ù. MSG_SM_SERVER_FORCE_DISCONNECT_ACK Ack; Ack.m_byResult = pRecvMsg->m_byResult; Ack.m_ServerInfo = pRecvMsg->m_ServerInfo; pUser->SendPacket( &Ack, sizeof(Ack) ); } // ÆÐÄ¡ ½ÃÀÛ °á°ú VOID Handler_SA::OnHandler_SA_PATCH_EXECUTE_ACK( ServerSession *pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_PATCH_EXECUTE_ACK *pRecvMsg = (MSG_SA_PATCH_EXECUTE_ACK*)pMsg; UnitServer* pSunServer = WorldManager::Instance()->FindSunServer( pRecvMsg->m_ServerInfo.m_byWorld ); if( !pSession ) { MSGOUT( "[ÆÐÄ¡½ÃÀÛ°á°ú] %d¿ùµåÀÇ SunServer Á¤º¸¸¦ ãÀ»¼ö ¾ø½À´Ï´Ù.", pRecvMsg->m_ServerInfo.m_byWorld ); return; } if( pSunServer->GetServerStatus() != SERVER_STATUS_PATCHING ) { MSGOUT( "[ÆÐÄ¡½ÃÀÛ°á°ú] %d¿ùµå°¡ ÆÐÄ¡ÁßÀÌ ¾Æ´Ñµ¥, ÆÐÄ¡°á°ú°¡ ¿Ô´Ù.", pRecvMsg->m_ServerInfo.m_byWorld ); return; } // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[ÆÐÄ¡½ÃÀÛ°á°ú] ÆÐÄ¡¸¦ ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } //ÇØ´ç¿ùµåÀÇ ¸ðµç ¼­¹öÀÇ »óŸ¦ ÆÐÄ¡ÁßÀ¸·Î °íÄ£´Ù. // UnitServer* pSunServer = WorldManager::Instance()->FindSunServer( pRecvMsg->m_ServerInfo.m_byWorld ); pSunServer->SetServerStatus( SERVER_STATUS_PATCHING ); MSG_SM_PATCH_EXECUTE_ACK AckMsg; AckMsg.m_byResult = pRecvMsg->m_byResult; memcpy( &AckMsg.m_ServerInfo, &pRecvMsg->m_ServerInfo, sizeof(SERVER_INFO) ); pUser->SendPacket( &AckMsg, sizeof(AckMsg) ); MSGOUT( "[PATCH_EXECUTE_ACK] Result : %d, World : %d, Channel : %d, ServerType : %d, ServerNum %d " , pRecvMsg->m_byResult, pRecvMsg->m_ServerInfo.m_byWorld, pRecvMsg->m_ServerInfo.m_byChannel , pRecvMsg->m_ServerInfo.m_byServerType, pRecvMsg->m_ServerInfo.m_byServerNum ); } // ÆÐÄ¡ ¿Ï·á °á°ú // ÀÌ ÆÐŶÀÌ ¿À¸é, ¹«Á¶°Ç ¼­¹ö»óŸ¦ ¿ÀÇÁ¶óÀÎÀ¸·Î ¹Ù²Û´Ù. VOID Handler_SA::OnHandler_SA_PATCH_RESULT_NTF( ServerSession *pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_PATCH_RESULT_NTF *pRecvMsg = (MSG_SA_PATCH_RESULT_NTF*)pMsg; // Manager·Î ÇöÀç °á°ú¸¦ º¸³½´Ù. MSG_SM_PATCH_RESULT_NTF msg; msg.patch_result_.patch_result_type_ = pRecvMsg->m_dwResult; msg.patch_result_.solar_server_type_ = pRecvMsg->m_byNum; ZeroMemory( &msg.m_ServerPatchInfo, sizeof(SERVER_PATCH_INFO) ); memcpy( &msg.m_ServerPatchInfo.m_PatchVer, &pRecvMsg->m_PatchVer, sizeof(PATCH_VERSION) ); // AgentKey¿Í ServerTypeÀ¸·Î ÇØ´ç¼­¹ö¸¦ ã´Â´Ù. UnitServer *pSunServer = WorldManager::Instance()->FindUnitServer( pSession->GetServerKey(), pRecvMsg->m_byServerType ); if( pSunServer ) { if( pSunServer->GetServerType() != SUN_SERVER && pSunServer->GetServerType() != SOLARAUTH_SERVER ) { MSGOUT("ÆÐÄ¡°á°ú°¡ SUN_SERVER°¡ ¾Æ´Ñ ÀÌ»óÇÑ °ªÀÌ ³Ñ¾î¿Ô´Ù. SERVER_TYPE = %d", pSunServer->GetServerType() ); } // ÇØ´ç SunServer°¡ ¼ÓÇÑ ¿ùµåÀÇ ¸ðµç ¼­¹ö»óŸ¦ OfflineÀ¸·Î ¹Ù²Û´Ù. ==> OfflineÀÌ ¾Æ´Ï¶ó ´ç¿¬È÷ Offline »óÅÂÀ̾î¾ß ÇÑ´Ù. World* pWorld = WorldManager::Instance()->FindWorld( pSunServer->GetWorld() ); pWorld->SetServerStatus( SERVER_STATUS_OFFLINE ); //ÇöÀç ÆÐÄ¡°á°ú°¡ ³¯¶ó¿Â ¼­¹ö°¡ Á¸ÀçÇÑ´Ù¸é... ÇØ´ç ¼­¹öÀÇ Á¤º¸¸¦ º¸³¾ ¸Þ¼¼Áö¿¡ ÀúÀåÇÑ´Ù. pSunServer->GetServerInfo().GetServerInfo( &msg.m_ServerPatchInfo ); } else //ÇöÀç ÆÐÄ¡°á°ú¿¡ ÇØ´çÇÏ´Â ¼­¹ö°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é.. { MSGOUT("AgentKey[%d] ServerType[%d] Can't Find ServerInfo! \n", pSession->GetServerKey(), pRecvMsg->m_byServerType ); msg.m_ServerPatchInfo.m_byServerType = pRecvMsg->m_byServerType; } // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[PATCH_RESULT_NTF] Can't find Patch-User! \n" ); return; } int nRet = pUser->SendPacket( &msg, sizeof(msg) ); } // °øÁö»çÇ× VOID Handler_SA::OnHandler_SA_SERVER_NOTICE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_NOTICE_ACK *pRecvMsg = (MSG_SA_SERVER_NOTICE_ACK*)pMsg; // À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "°øÁö¸¦ Á¤º¸¸¦ ¿äûÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_SERVER_NOTICE_ACK AckMsg; AckMsg.m_ServerInfo = pRecvMsg->m_ServerInfo; AckMsg.m_dwUserKey = pRecvMsg->m_dwUserKey; strcpy( AckMsg.m_szNotice, pRecvMsg->m_szNotice ); pUser->SendPacket( &AckMsg, sizeof(AckMsg) ); } VOID Handler_SA::OnHandler_SA_SERVER_SEND_NOTICE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_SEND_NOTICE_ACK *pRecvMsg = (MSG_SA_SERVER_SEND_NOTICE_ACK*)pMsg; // À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "°øÁö¸¦ º¸³½ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_SERVER_SEND_NOTICE_ACK AckMsg; AckMsg.m_ServerInfo = pRecvMsg->m_ServerInfo; AckMsg.m_bFlag = pRecvMsg->m_bFlag; AckMsg.m_bConnectAgentServer = TRUE; pUser->SendPacket( &AckMsg, sizeof(AckMsg) ); } VOID Handler_SA::OnHandler_SA_CHECK_LOGFILE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_CHECK_LOGFILE_ACK *pRecvMsg = (MSG_SA_CHECK_LOGFILE_ACK*)pMsg; // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[·Î±×º¸±â°á°ú] ·Î±×º¸±â¸¦ ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_CHECK_LOGFILE_ACK AckMsg; AckMsg.m_byResult = pRecvMsg->m_byResult; AckMsg.m_ServerInfo = pRecvMsg->m_ServerInfo; memcpy( &AckMsg.m_szLogFile, &pRecvMsg->m_szLogFile, MAX_FILE_BUFFER_SIZE ); AckMsg.m_wFileSize = pRecvMsg->m_wFileSize; AckMsg.m_NumAllLogPage = pRecvMsg->m_NumAllLogPage; pUser->SendPacket( &AckMsg, AckMsg.GetSize() ); } VOID Handler_SA::OnHandler_SA_CHECK_GAMEPROCESS_NTF( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_CHECK_GAMEPROCESS_NTF* pRecvMsg = (MSG_SA_CHECK_GAMEPROCESS_NTF*)pMsg; AgentServerSession* pAgentSession = (AgentServerSession*)pSession; //¿¡ÀÌÀüÆ® Ű¿Í ¼­¹öŸÀÔÀ¸·Î, ÇöÀç ¼­¹öÀÇ Á¤º¸¸¦ ¾ò´Â´Ù. UnitServer* pUnitServer = WorldManager::Instance()->FindUnitServer( pAgentSession->GetServerKey(), pRecvMsg->m_GameStatus.m_ServerType ); if( !pUnitServer ) { //±×·± ¼­¹ö Á¸ÀçÇÏÁö ¾ÊÀ½. return; } //ÇöÀç ¼­¹öÀÇ »óÅÂ¿Í °°Àº »óÅÂÀÌ¸é º¸³»Áö ¾Ê´Â´Ù. if( pUnitServer->GetServerStatus() == pRecvMsg->m_GameStatus.m_Status ) //°°Àº ¼­¹ö return; //ÇöÀç ¼­¹ö°¡ ÆÐÄ¡ÁßÀÌ¸é º¸³»Áö ¾Ê´Â´Ù. if( pUnitServer->GetServerStatus() == SERVER_STATUS_PATCHING ) return; //¿©±â·Î ¿À´Â ¸Þ¼¼Áö´Â ¼­¹ö°¡ ÄÑÁ® ÀÖ´Ù, ¾Æ´Ï¸é ²¨Á®ÀÖ´Ù.. 2°¡Áö »óÅÂÀÌ´Ù. if( SERVER_STATUS_LIVE_PROCESS == pRecvMsg->m_GameStatus.m_Status ) //ÄÑÁ®ÀÖÀ¸¸é { //1. ÇöÀç ¼­¹öÀÇ »óŰ¡ OnlineÀε¥, ¶óÀÌºê ¸í·ÉÀÌ¸é ¹«½ÃÇÑ´Ù. if( SERVER_STATUS_ONLINE == pUnitServer->GetServerStatus() ) return; } pUnitServer->SetServerStatus( pRecvMsg->m_GameStatus.m_Status ); // MSG_SM_CHECK_GAMEPROCESS_NTF msg; // ServerInfo& rServerInfo = pUnitServer->GetServerInfo(); // rServerInfo.GetServerInfo( &msg.m_ServerInfo ); // UserManager::Instance()->SendPacketAll( &msg, sizeof(msg) ); } VOID Handler_SA::OnHandler_SA_SERVER_BACKUP_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_BACKUP_ACK* pRecvMsg = (MSG_SA_SERVER_BACKUP_ACK*)pMsg; // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[¹é¾÷°á°ú] ¹é¾÷À» ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_SERVER_BACKUP_ACK ack; ack.m_byResult = pRecvMsg->m_byResult; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; pUser->SendPacket( &ack, sizeof(ack) ); } VOID Handler_SA::OnHandler_SA_SERVER_RESTORE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SERVER_RESTORE_ACK* pRecvMsg = (MSG_SA_SERVER_RESTORE_ACK*)pMsg; // ÆÐÄ¡¸¦ ½ÇÇà½ÃŲ À¯Àú¸¦ ã´Â´Ù. User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey ); if( !pUser ) { MSGOUT( "[¹é¾÷°á°ú] ¹é¾÷À» ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_SERVER_RESTORE_ACK ack; ack.m_byResult = pRecvMsg->m_byResult; ack.m_dwUserKey = pRecvMsg->m_dwUserKey; ack.m_ServerInfo = pRecvMsg->m_ServerInfo; pUser->SendPacket( &ack, sizeof(ack) ); } #ifdef __20080312__SOLARAUTH_SERVER_PATCH VOID Handler_SA::OnHandler_SA_SOLARSCRIPT_BACKUP_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_BACKUP_ACK* pRecvMsg = (MSG_SA_SOLARSCRIPT_BACKUP_ACK *)pMsg; User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey); if( !pUser ) { MSGOUT( "½ºÅ©¸³Æ® ¹é¾÷À» ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_SERVER_SOLARSCRIPT_BACKUP_ACK ack; ack.m_byResult = pRecvMsg->m_byResult; ack.m_FolderInfo = pRecvMsg->m_ScriptFolder; pUser->SendPacket( &ack, sizeof(ack) ); } VOID Handler_SA::OnHandler_SA_SOLARSCRIPT_RESTORE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_RESTORE_ACK* pRecvMsg = (MSG_SA_SOLARSCRIPT_RESTORE_ACK *)pMsg; MSG_SM_SERVER_SOLARSCRIPT_RESTORE_ACK ack; ack.m_byResult = pRecvMsg->m_byResult; ack.m_FolderInfo = pRecvMsg->m_ScriptFolder; User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey); if( !pUser ) { MSGOUT( "½ºÅ©¸³Æ® º¹¿øÀ» ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); ack.m_byResult = RC_SERVER_PATCH_EXECUTE_FAIL; } pUser->SendPacket( &ack, sizeof( ack)); } VOID Handler_SA::OnHandler_SA_SOLARSCRIPT_EXECUTE_ACK( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { MSG_SA_SOLARSCRIPT_EXECUTE_ACK* pRecvMsg = (MSG_SA_SOLARSCRIPT_EXECUTE_ACK *)pMsg; User *pUser = (User*)UserManager::Instance()->GetUser( pRecvMsg->m_dwUserKey); if( !pUser ) { MSGOUT( "½ºÅ©¸³Æ® ÆÐÄ¡¸¦ ½ÇÇàÇÑ À¯Àú¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù." ); return; } MSG_SM_PATCH_SOLARSCRIPT_EXECUTE_ACK ack; ack.m_byResult = pRecvMsg->m_byResult; ack.m_FolderInfo = pRecvMsg->m_ScriptFolder; pUser->SendPacket( &ack, sizeof( ack)); } #endif #ifdef _NA_006543_20130318_HEARTBEAT VOID Handler_SA::OnHandler_SA_CHECK_HEARTBEAT_NTF( ServerSession* pSession, MSG_BASE* pMsg, int nSize ) { //UpdateServer¿¡¼­ »ç¿ë //DISPMSG("Recv Heartbeat\n"); static_cast(pSession)->CheckHeatbeatRecv(); } #endif