#include "stdafx.h" #include "UIDDispatch.h" #include "AuthDispatch.h" #include "GameDispatch.h" #include "ChatDispatch.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DBAgent { const char* g_szPktUUTString[PktUUT::MAX_UPDATE_TYPE] = { "UpdateUIDTableNone", "UpdateUIDTableUserLogin", "UpdateUIDTableUserLogout", "UpdateUIDTableUserMove", "UpdateUIDTableCharLogin", "UpdateUIDTableCharLogout", "UpdateUIDTableCharMove", "UpdateUIDTableBillingCheck", }; // UpdateUIDTable󸮽à À¯Àú ·Î±×ÀΠ󸮸¦ ÇÑ´Ù. // ¸®ÅϰªÀº »ó¼ö ¿¡·¯ ¹®ÀÚ¿­ÀÌ´Ù. NULLÀÌ¸é ¼º°øÀÌ´Ù. const char* ProcessUpdateTableUserLogin(DataStorage::CSessionData& sessionData, DataStorage::RequestData& requestData, unsigned long dwFlag, int nPlayTime, unsigned long dwCRMIndex1, unsigned char cCmd, char cBillingType, unsigned short usUUKAckError); // UpdateUIDTable󸮽à ij¸¯ÅÍ ·Î±×ÀΠ󸮸¦ ÇÑ´Ù. // ¸®ÅϰªÀº »ó¼ö ¿¡·¯ ¹®ÀÚ¿­ÀÌ´Ù. NULLÀÌ¸é ¼º°øÀÌ´Ù. const char* ProcessUpdateTableCharLogin(DataStorage::CSessionData& sessionData, DataStorage::RequestData& requestData, unsigned long dwFlag, int nPlayTime, unsigned long dwCRMIndex1, unsigned char cCmd, char cBillingType); CSingleDispatch& CUIDDispatch::GetDispatchTable() { static CSingleDispatch uidDispatch; return uidDispatch; } CUIDDispatch::CUIDDispatch(CSession& Session) : CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE) { } CUIDDispatch::~CUIDDispatch() { } void CUIDDispatch::Connected() { DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/UIDServer Connected", &GetSession(), this, GetRemoteAddr().get_addr_string()); GetDispatchTable().SetDispatch(this); SendPacket::ServerLogin(GetSendStream(), CServerSetup::GetInstance().GetServerID()); } void CUIDDispatch::Disconnected() { DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/UIDServer Disconnected", &GetSession(), this, GetRemoteAddr().get_addr_string()); GetDispatchTable().RemoveDispatch(this); } bool CUIDDispatch::DispatchPacket(PktBase* lpPktBase) { PktBase::CMDType cCmd = lpPktBase->GetCmd(); bool bResult = false; switch(cCmd) { case CmdSysServerLogout: bResult = ParseServerLogoutAck(lpPktBase); break; case CmdUserKill: bResult = ParseUserKill(static_cast(lpPktBase)); break; case CmdBillingTimeoutNotify: bResult = ParseBillingTimeNotify(static_cast(lpPktBase)); break; case CmdBillingTimeCheckNotify: bResult = ParseBillingTimeCheckNotify(static_cast(lpPktBase)); break; case CmdHanBTNWarning: bResult = ParseHanBTNWarning(static_cast(lpPktBase)); break; case CmdHanBTNUserKill: bResult = ParseHanBTNUserKill(static_cast(lpPktBase)); break; case CmdUpdateUIDTable: bResult = ParseUpdateUIDTable(static_cast(lpPktBase)); break; default: ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID¼­¹ö ÆÐŶ ó¸® ½ÇÆÐ : ¾ø´Â Ä¿¸ÇµåÀÔ´Ï´Ù", &GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd); bResult = true; break; } if(!bResult) { ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID¼­¹ö ÆÐŶ ó¸® ½ÇÆÐ : 󸮸¦ ½ÇÆÐÇß½À´Ï´Ù", &GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd); } return true; } bool CUIDDispatch::ParseServerLogoutAck(PktBase* lpPktBase) { INFLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID¼­¹ö Á¢¼Ó Á¾·á : ¼­¹ö ·Î±×¾Æ¿ô ÆÐŶÀ» ¹Þ¾Ò½À´Ï´Ù.", &GetSession(), this, GetRemoteAddr().get_addr_string()); CloseSession(); return true; } bool CUIDDispatch::ParseUpdateUIDTable(PktUUTAck* lpPktUUTAck) { // edith 2008.01.15 UID¿¡¼­ º¸³½ UpdateUIDTable °á°ú°ª 󸮷çƾ using namespace DBAgent::DataStorage; unsigned char cCmd = lpPktUUTAck->m_cCmd; unsigned long dwUID = lpPktUUTAck->m_dwUserID; unsigned long dwFlag = lpPktUUTAck->m_dwFlag; int nPlayTime = lpPktUUTAck->m_nPlayTime; unsigned long dwCRMIndex1 = lpPktUUTAck->m_dwCRMIndex1; // Çǽùæ ID (0ÀÌ¸é °³ÀÎÀ¯Àú) char cBillingType = lpPktUUTAck->m_cstrBillingType; CBilling::WarningType eOldWarnMsgType = CBilling::WARN_BEFORE_1SEC; CBilling::WarningType eNewWarnMsgType = static_cast(lpPktUUTAck->GetState()); const char* szErrorReason = 0; RequestData requestData; memset(&requestData, 0, sizeof(RequestData)); CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); if(PktUUT::MAX_UPDATE_TYPE <= cCmd) { szErrorReason = "·Î±×ÀÎ ½ÇÆÐ - ¾Ë ¼ö ¾ø´Â Ä¿¸ÇµåÀÔ´Ï´Ù"; } else if(0 == lpSessionData) { szErrorReason = "·Î±×ÀÎ ½ÇÆÐ - ¼¼¼ÇÀÌ ¾ø½À´Ï´Ù"; } else { switch(cCmd) { case PktUUT::UpdateUIDTableUserLogin: requestData = lpSessionData->PopRequest(); if(0 == requestData.m_dwRequestKey) { szErrorReason = "·Î±×ÀÎ ½ÇÆÐ - RequestKey°¡ ÀÌ»óÇÕ´Ï´Ù"; } else { szErrorReason = ProcessUpdateTableUserLogin(*lpSessionData, requestData, dwFlag, nPlayTime, dwCRMIndex1, cCmd, cBillingType, lpPktUUTAck->GetError()); eOldWarnMsgType = lpSessionData->GetBilling().GetWarnMsgType(); lpSessionData->GetBilling().SetWarnMsgType(eNewWarnMsgType); if(CBilling::WARN_EVERY_MINUTE == eNewWarnMsgType) { // °æ°í »óÅ·ΠÀÌÇà. ¸ÅºÐ¸¶´Ù ¸Þ½ÃÁö¸¦ º¸³»µµ·Ï ÇÑ´Ù. SendPacket::BillingCheckNotify(*lpSessionData, 5, cBillingType); } } break; case PktUUT::UpdateUIDTableCharLogin: requestData = lpSessionData->PopRequest(); if(0 == requestData.m_dwRequestKey) { szErrorReason = "·Î±×ÀÎ ½ÇÆÐ - RequestKey°¡ ÀÌ»óÇÕ´Ï´Ù"; } else { szErrorReason = ProcessUpdateTableCharLogin(*lpSessionData, requestData, dwFlag, nPlayTime, dwCRMIndex1, cCmd, cBillingType); } break; case PktUUT::UpdateUIDTableBillingCheck: eOldWarnMsgType = lpSessionData->GetBilling().GetWarnMsgType(); if(0 == dwFlag) { lpSessionData->GetBilling().SetWarnMsgType(eNewWarnMsgType); if (CBilling::NO_WARNING == eOldWarnMsgType && CBilling::WARN_EVERY_MINUTE == eNewWarnMsgType) { // ¹«°æ°í »óÅ¿¡¼­ °æ°í »óÅ·ΠÀÌÇà. ¸ÅºÐ¸¶´Ù ¸Þ½ÃÁö¸¦ º¸³»µµ·Ï ÇÑ´Ù. SendPacket::BillingCheckNotify(*lpSessionData, 5, cBillingType); } else if (CBilling::WARN_EVERY_MINUTE == eOldWarnMsgType && CBilling::NO_WARNING == eNewWarnMsgType) { // °æ°í »óÅ¿¡¼­ ¹«°æ°í »óÅ·ΠÀÌÇà. ¸Þ½ÃÁö¸¦ ±×¸¸ º¸³»µµ·Ï ÇÑ´Ù. SendPacket::BillingCheckNotify(*lpSessionData, 20, cBillingType); } } lpSessionData->GetBilling().AddYouxiLandPoint(nPlayTime, cBillingType); DETLOG4(g_Log, "UID:%10u / CID:%10u / nPlayTime:%d / cBillingType:%c / UpdateUIDTableBillingCheck ¼º°ø", lpSessionData->GetUID(), lpSessionData->GetCID(), nPlayTime, cBillingType); if (0 != dwFlag) { // À¯Àú ų ó¸® - Ưº°È÷ ÇÏÁö ¾Ê´Â´Ù. ³ªÁß¿¡ ºô¸µÃ¼Å©¿¡¼­ ²÷À» °ÍÀÌ´Ù. // KillUser(lpDataSession); } break; } } if(0 != szErrorReason) { ERRLOG10(g_Log, "UID:%10u / Cmd:%s / Flag:%u / PlayTime:%d / CRMIndex:%u / BillingType:%c / " " RequestKey:%10u / SelectedCID:%10u / ServerID:0x%08X / ParseUIDTable ½ÇÆÐ : %s", dwUID, g_szPktUUTString[cCmd], dwFlag, nPlayTime, dwCRMIndex1, cBillingType, requestData.m_dwRequestKey, requestData.m_dwSelectedCID, requestData.m_dwServerID, szErrorReason); if(0 == dwFlag) { PktUUT::UpdateType eUpdateType = PktUUT::UpdateUIDTableNone; switch(cCmd) { case PktUUT::UpdateUIDTableUserLogin: eUpdateType = PktUUT::UpdateUIDTableUserLogout; break; case PktUUT::UpdateUIDTableCharLogin: eUpdateType = PktUUT::UpdateUIDTableCharLogout; break; } // edith 2008.01.15 UID·Î ·Î±×ÀÎ ¸Þ½ÃÁö Àü¼Û if(0 == lpSessionData) { ERRLOG1(g_Log, "UID:%10u / UID¼­¹ö Àü¼Û ½ÇÆÐ : ¼¼¼ÇÀÌ ¾ø½À´Ï´Ù.", dwUID); } else if(eUpdateType != PktUUT::UpdateUIDTableNone && !SendPacket::UpdateUIDTable(eUpdateType, requestData.m_szAccount, requestData.m_szPassword, dwUID, requestData.m_dwSelectedCID, requestData.m_dwSessionID, requestData.m_dwServerID, requestData.m_PeerAddress)) { ERRLOG1(g_Log, "UID:%10u / UID¼­¹ö Àü¼Û ½ÇÆÐ : Àü¼Û¿¡ ½ÇÆÐÇß½À´Ï´Ù.", dwUID); } } } return true; } const char* ProcessUpdateTableUserLogin(DataStorage::CSessionData& sessionData, DataStorage::RequestData& requestData, unsigned long dwFlag, int nPlayTime, unsigned long dwCRMIndex1, unsigned char cCmd, char cBillingType, unsigned short usUUKAckError) { // edith 2008.01.15 UpdateTableUserLogin¿¡ °ü·ÃµÈ ÇÁ·Î¼¼½Ì ·ÎÁ÷ const char* szErrorReason = 0; unsigned long dwUID = sessionData.GetUID(); GET_SINGLE_DISPATCH(lpAuthDispatch, CAuthDispatch, CAuthDispatch::GetDispatchTable()); if(0 == lpAuthDispatch) { szErrorReason = "À¯Àú ·Î±×ÀÎ ½ÇÆÐ - ÀÎÁõ¼­¹ö Á¢¼Ó ²÷±è"; } else { unsigned short usError = 1; // Default : Server Error(Unknown Error) if (0 == dwFlag) { // ÅëÇÕ¼­¹ö Á¤º¸¸¦ ¾ò¾î¼­ º¸³»ÁØ´Ù. unsigned char cAgentServerType = static_cast( CServerSetup::GetInstance().GetAgentServerType()); unsigned char cFirstLogin = 0; switch(cAgentServerType) { case UnifiedConst::Part1: case UnifiedConst::Part1Unified: // ¼­¹ö ¼¼ÆÃ À߸ø ÇßÀ½. ³ªÁß¿¡ UserLogin szErrorReason = "À¯Àú ·Î±×ÀÎ ½ÇÆÐ - ¼­¹ö À߸ø Ä×À½"; break; case UnifiedConst::ROW: sessionData.SetOldServerGroupID(UnifiedConst::ROW); break; case UnifiedConst::Part2Unified: case UnifiedConst::Part2Selectable: if(!sessionData.GetUnifiedDataFromDB(CDBSingleObject::GetInstance())) { szErrorReason = "À¯Àú ·Î±×ÀÎ ½ÇÆÐ - ÅëÇÕ¼­¹ö µ¥ÀÌÅÍ ¾ò±â ½ÇÆÐ"; } break; } cFirstLogin = sessionData.GetFirstLogin(); if(0 != szErrorReason) { // µ¥ÀÌÅÍ Àоî¿À´Ù ¿¡·¯ ³­ ¸ð¾çÀÌ´Ù. UserLoginÀ» Ãë¼ÒÇÑ´Ù. } else if(!sessionData.UserEnable(CDBSingleObject::GetInstance(), dwUID)) { szErrorReason = "À¯Àú ·Î±×ÀÎ ½ÇÆÐ - À¯Àú Ȱ¼ºÈ­ ½ÇÆÐ"; } else if(!SendPacket::StartSession(lpAuthDispatch->GetSendStream(), requestData.m_dwRequestKey, dwUID, requestData.m_dwSessionID, cFirstLogin, 0)) { szErrorReason = "À¯Àú ·Î±×ÀÎ ½ÇÆÐ - À¯Àú ·Î±×ÀÎ ¼º°ø Àü¼Û ½ÇÆÐ"; } else { // ºô¸µ ½ÃÀÛ(Á¢¼Ó ²÷±â ½ÃÀÛ. ¿¹Àü ÇѰÔÀÓ °ú±Ý°ú ¿ä½Ã·£µå °ú±Ý¸¸ »ç¿ëÇÔ). // ÀÎÁõ¼­¹ö¿¡¼­´Â °ú±Ý ¾ÈÇÔ. °ú±Ý Á¤º¸ Ç¥½Ã¸¦ À§Çؼ­ ¼¼ÆÃÇÔ. sessionData.GetBilling().StartBilling(nPlayTime, dwCRMIndex1, cBillingType); // edith 2008.01.15 ·Î±×Àο¡ ¼º°øÇßÀ¸´Ï ¼¼¼Ç¿¡ µî·ÏÇÑ´Ù. // ·Î±×ÀÎ ¼º°øÇßÀ»¶§¸¸ ¼¼¼Ç IDµîÀÇ µ¥ÀÌÅ͸¦ ¼¼ÆÃÇÑ´Ù. sessionData.SetRequestData(requestData); // ¼¼¼Ç ¿­±â ¼º°ø usError = 0; // StartSessionÀ» ¹Þ¾ÒÀ» ¶§, ¿¡·¯°¡ 0À̰í, Áß°è¼­¹ö ŸÀÔÀÌ ÅëÇÕ¼­¹öÀ̸é, // ÅëÇÕ¼­¹ö µ¥ÀÌÅ͸¦ ±â´Ù¸®¹Ç·Î, µ¥ÀÌÅ͸¦ ¿©±â¼­ Àü¼ÛÇØ ÁØ´Ù. switch(cAgentServerType) { case UnifiedConst::Part2Unified: case UnifiedConst::Part2Selectable: // ½Å±Ô °èÁ¤ÀÎÁö ¾Æ´ÑÁö »ý°¢ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÏ´Ü Á¤º¸ ÁÖ°í ³ª¸é // ¼±ÅÃÇÒ Ä³¸¯ÀÌ ¾øÀ¸¸é ¾Ë¾Æ¼­ ±×³É ·Î±×ÀÎÇϱ⠶§¹®ÀÌ´Ù. if (!SendPacket::UnifiedCharInfo(lpAuthDispatch->GetSendStream(), dwUID, sessionData.GetTransferedCharCount(CDBSingleObject::GetInstance()), sessionData.GetUserInfo(), sessionData.GetUnifiedStoreInfo(), sessionData.GetUnifiedStoreInfoNum(), sessionData.GetUnifiedCharData(), sessionData.GetUnifiedCharDataNum())) { // Á¤º¸ Àü¼Û¿¡ ½ÇÆÐÇßÀ¸¸é ¹¹ ÇÏ´Â ¼ö ¾øÁö;; ¾Ë¾Æ¼­ µ¥ÀÌÅÍ ±â´Ù¸®´Ù ²÷¾îÁö°ÚÁö;; ERRLOG1(g_Log, "UID:%10u / À¯Àú ·Î±×ÀÎ ½ÇÆÐ - ÅëÇÕ¼­¹ö Á¤º¸ Àü¼Û ½ÇÆÐ", dwUID); } break; } } } else if (1 == dwFlag) { switch(usUUKAckError) { default: usError = 41; // Áߺ¹·Î±×ÀÎ break; case PktUUT::DISCONNECT_USER: usError = 42; // Disconnect¸¦ ÇßÀ¸´Ï Àç½ÃµµÇØ ºÁ.. break; } } else if (2 == dwFlag) { usError = 24; } // °³ÀÎ,ÇÇ½Ã¹æ °ü·Ã °ú±Ý Á¤º¸°¡ ¾øÀ½(ÇѰÔÀÓ) else if (4 == dwFlag) { usError = 1; } // ¼­¹ö ¿¡·¯ (DB Query ½ÇÆÐ) else if (11 == dwFlag || 13 == dwFlag || 19 == dwFlag) { // °³ÀÎ,ÇÇ½Ã¹æ °ü·Ã °ú±Ý Á¤º¸°¡ ¾øÀ½(´ë¸¸) usError = 24; } else if (20 == dwFlag) { usError = 40; } // ´ë¸¸, ÀϺ» Áߺ¹ ·Î±×ÀÎ ¹æÁö // edith 2009.09.11 MY¸¦ À§ÇÑ AllowIP ó¸®ÀÛ¾÷ else if (57 == dwFlag) { usError = 57; } // ROW¿¡¼­ AllowIP ¿¡¼­ °É¸² else if (100 >= dwFlag) { usError = (unsigned short)(dwFlag-100); }; // °¨¸¶´Ï¾Æ ¿À·ù if(0 != usError) { SendPacket::StartSession(lpAuthDispatch->GetSendStream(), requestData.m_dwRequestKey, dwUID, sessionData.GetSessionID(), 0, usError); } } return szErrorReason; } const char* ProcessUpdateTableCharLogin(DataStorage::CSessionData& sessionData, DataStorage::RequestData& requestData, unsigned long dwFlag, int nPlayTime, unsigned long dwCRMIndex1, unsigned char cCmd, char cBillingType) { const char* szErrorReason = 0; unsigned long dwUID = sessionData.GetUID(); GET_MULTI_DISPATCH(lpGameDispatch, requestData.m_dwServerID, CGameDispatch, CGameDispatch::GetDispatchTable()); if(0 == lpGameDispatch) { szErrorReason = "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ - °ÔÀÓ¼­¹ö Á¢¼Ó ²÷±è"; } else if(!sessionData.HasCharacter(requestData.m_dwSelectedCID)) { szErrorReason = "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ - ¼ÒÀ¯ÇÏÁö ¾ÊÀº ij¸¯ÅÍ È°¼ºÈ­"; const USER_INFO& userInfo = sessionData.GetUserInfo(); // WORK_LIST 2.1 °èÁ¤ ±¹Àû Ãß°¡ SERLOG9(g_Log, "UID:%10u / SelectedCID:%10u / Char1:%10u / Char2:%10u / Char3:%10u / Char4:%10u / Char5:%10u / Nation:%d %s", dwUID, requestData.m_dwSelectedCID, userInfo.CharID[0], userInfo.CharID[1], userInfo.CharID[2], userInfo.CharID[3], userInfo.CharID[4], userInfo.Nation, szErrorReason); } else { // ±âº»°ªÀº ½ÇÆÐ. ¼­¹ö ¿¡·¯. unsigned short usError = 1; if (0 == dwFlag) { // ij¸¯ÅÍ È°¼ºÈ­ if (!sessionData.CharEnable(requestData.m_dwSelectedCID, requestData.m_dwServerID)) { szErrorReason = "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ - ¼¼¼Ç Ȱ¼ºÈ­ ½ÇÆÐ"; } // ij¸¯ÅÍ µ¥ÀÌÅÍ Àü¼Û else if (!SendPacket::CharLogin(lpGameDispatch->GetSendStream(), sessionData, requestData.m_dwRequestKey)) { szErrorReason = "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ - ij¸¯ÅÍ µ¥ÀÌÅÍ Àü¼Û ½ÇÆÐ"; // Ȱ¼ºÈ­µÈ ij¸¯Å͸¦ DisableÇÔ. sessionData.CharDisable(requestData.m_dwSelectedCID, requestData.m_dwServerID); } else { // ºô¸µ ½ÃÀÛ switch(CServerSetup::GetInstance().GetBillingType()) { case CServerSetup::GamaBilling: case CServerSetup::GamaUnitedBilling: sessionData.GetBilling().StartBilling(nPlayTime, dwCRMIndex1, cBillingType); break; } // ·Î±×ÀÎ ¼º°øÇßÀ»¶§¸¸ ¼¼¼Ç IDµîÀÇ µ¥ÀÌÅ͸¦ ¼¼ÆÃÇÑ´Ù. sessionData.SetRequestData(requestData); // Á¢¼Ó ¼º°ø! usError = 0; } } else if (1 == dwFlag) { usError = 41; } // Áߺ¹·Î±×ÀÎ else if (2 == dwFlag) { usError = 24; } // °³ÀÎ,ÇÇ½Ã¹æ °ü·Ã °ú±Ý Á¤º¸°¡ ¾øÀ½ else if (4 == dwFlag) { usError = 1; } // ¼­¹ö ¿¡·¯ (DB Query ½ÇÆÐ) else if (11 == dwFlag || 13 == dwFlag || 19 == dwFlag) { // °³ÀÎ,ÇÇ½Ã¹æ °ü·Ã °ú±Ý Á¤º¸°¡ ¾øÀ½(´ë¸¸) usError = 24; } else if (20 == dwFlag) { usError = 40; } // ´ë¸¸, ÀϺ» Áߺ¹ ·Î±×ÀÎ ¹æÁö // edith 2009.09.11 MY¸¦ À§ÇÑ AllowIP ó¸®ÀÛ¾÷ else if (57 == dwFlag) { usError = 57; } // ROW¿¡¼­ AllowIP ¿¡¼­ °É¸² else if (100 >= dwFlag) { usError = (unsigned short)(dwFlag-100); }; // °¨¸¶´Ï¾Æ ¿À·ù if (0 != usError) { SendPacket::CharLoginError(lpGameDispatch->GetSendStream(), requestData.m_dwRequestKey, DBUpdateData::LOGIN, dwUID, requestData.m_dwSelectedCID, usError); } } return szErrorReason; } bool CUIDDispatch::ParseBillingTimeNotify(PktBTN* lpPktBTN) { using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(lpPktBTN->m_dwUserID); if(0 == lpSessionData) { ERRLOG2(g_Log, "UID:%10u / cRemainMin:%u / ½Ã°£ ¸¸·á °øÁö¸¦ º¸³»±â ½ÇÆÐ : À¯Àú°¡ ¾ø½À´Ï´Ù", lpPktBTN->m_dwUserID, lpPktBTN->m_cRemainMinute); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { ERRLOG2(g_Log, "UID:%10u / ST:%s / ½Ã°£ ¸¸·á °øÁö¸¦ º¸³»±â ½ÇÆÐ : ij¸¯ÅͰ¡ ºñȰ¼ºÈ­µÇ¾î ÀÖ½À´Ï´Ù", lpPktBTN->m_dwUserID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else { // ½Ã°£ÀÌ ´Ù ¶³¾îÁ®¼­ °æ°í º¸³¿. if(!SendPacket::BillingNotify(*lpSessionData, lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType)) { INFLOG4(g_Log, "UID:%10u / ServerID:0x%08X / cRemainMin:%u / cBillingType:%c / ½Ã°£ ¸¸·á °øÁö º¸³»±â ¼º°ø", lpPktBTN->m_dwUserID, lpSessionData->GetServerID(), lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType); } else { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ½Ã°£ ¸¸·á °øÁö¸¦ º¸³»±â ½ÇÆÐ : °ÔÀÓ¼­¹ö¿ÍÀÇ ¿¬°áÀÌ ²÷¾îÁ® ÀÖ½À´Ï´Ù", lpPktBTN->m_dwUserID, lpSessionData->GetServerID()); } } return true; } bool CUIDDispatch::ParseBillingTimeCheckNotify(PktBTN* lpPktBTN) { using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(lpPktBTN->m_dwUserID); if(0 == lpSessionData) { ERRLOG2(g_Log, "UID:%10u / cRemainMin:%u / ½Ã°£ ´Ù½Ã üũ(´ë¸¸) °øÁö¸¦ º¸³»±â ½ÇÆÐ : À¯Àú°¡ ¾ø½À´Ï´Ù", lpPktBTN->m_dwUserID, lpPktBTN->m_cRemainMinute); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { ERRLOG2(g_Log, "UID:%10u / ST:%s / ½Ã°£ ´Ù½Ã üũ(´ë¸¸) °øÁö¸¦ º¸³»±â ½ÇÆÐ : ij¸¯ÅͰ¡ ºñȰ¼ºÈ­µÇ¾î ÀÖ½À´Ï´Ù", lpPktBTN->m_dwUserID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else { // ½Ã°£ÀÌ ´Ù ¶³¾îÁ®¼­ °æ°í º¸³¿. if(!SendPacket::BillingCheckNotify(*lpSessionData, lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType)) { INFLOG4(g_Log, "UID:%10u / ServerID:0x%08X / cRemainMin:%u / cBillingType:%c / ½Ã°£ ´Ù½Ã üũ(´ë¸¸) °øÁö º¸³»±â ¼º°ø", lpPktBTN->m_dwUserID, lpSessionData->GetServerID(), lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType); } else { ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ½Ã°£ ´Ù½Ã üũ °øÁö(´ë¸¸)¸¦ º¸³»±â ½ÇÆÐ : °ÔÀÓ¼­¹ö¿ÍÀÇ ¿¬°áÀÌ ²÷¾îÁ® ÀÖ½À´Ï´Ù", lpPktBTN->m_dwUserID, lpSessionData->GetServerID()); } } return true; } bool CUIDDispatch::ParseHanBTNWarning(PktHanBTN* lpPktHanBTN) { // äÆÃ¼­¹ö·Î ¸Þ½ÃÁö¸¦ RelayÇÑ´Ù. using namespace DataStorage; IN_ADDR peerAddress; peerAddress.S_un.S_addr = lpPktHanBTN->m_dwIP; bool bCheckAddress = (0xFFFFFFFF != peerAddress.S_un.S_addr); CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession( lpPktHanBTN->m_szAccount, peerAddress, bCheckAddress); if(0 == lpSessionData) { ERRLOG2(g_Log, "AccountName:%16s / IP:%15s / °ú±Ý ¸¸·á ¸Þ½ÃÁö Àü¼Û ½ÇÆÐ : À¯Àú°¡ ¾ø½À´Ï´Ù", lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress)); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { ERRLOG4(g_Log, "UID:%10u / AccountName:%16s / IP:%15s / ST:%s / °ú±Ý ¸¸·á ¸Þ½ÃÁö Àü¼Û ½ÇÆÐ : ij¸¯ÅͰ¡ ºñȰ¼ºÈ­µÇ¾î ÀÖ½À´Ï´Ù", lpSessionData->GetUID(), lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress), g_szSessionStateString[lpSessionData->GetSessionState()]); } else { GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if(0 != lpChatDispatch) { char* lpBuffer = lpChatDispatch->GetSendStream().GetBuffer(sizeof(PktHanBTN)); if(0 != lpBuffer) { PktHanBTN* lpPktChatBTN = reinterpret_cast(lpBuffer); *lpPktChatBTN = *lpPktHanBTN; lpPktChatBTN->m_dwUID = lpSessionData->GetUID(); lpPktChatBTN->m_dwCID = lpSessionData->GetCID(); return lpChatDispatch->GetSendStream().WrapHeader( sizeof(PktHanBTN), CmdHanBTNWarning, 0, 0); } } ERRLOG5(g_Log, "UID:%10u / AccountName:%16s / IP:%15s / ST:%s / ChatDispatch:%p / °ú±Ý ¸¸·á ¸Þ½ÃÁö Àü¼Û ½ÇÆÐ : äÆÃ¼­¹ö¿Í ¿¬°áÀÌ ²÷°å°Å³ª, ¹öÆÛ ÇÒ´ç ½ÇÆÐ", lpSessionData->GetUID(), lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress), g_szSessionStateString[lpSessionData->GetSessionState()], lpChatDispatch); } return true; } bool CUIDDispatch::ParseHanBTNUserKill(PktHanUserKill* lpPktHanUserKill) { using namespace DataStorage; IN_ADDR peerAddress; peerAddress.S_un.S_addr = lpPktHanUserKill->m_dwIP; // Á¢¼Ó DB¸¦ ÀüºÎ µÚÁ®¼­, °èÁ¤°ú IP°¡ ÀÏÄ¡ÇÏ´Â ³ÑÇÑÅ× ¶ß°Å¿î ¸ÀÀ» º¸¿© ÁØ´Ù. bool bCheckAddress = (peerAddress.S_un.S_addr != 0xFFFFFFFF); CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession( lpPktHanUserKill->m_szAccount, peerAddress, bCheckAddress); if(0 == lpSessionData) { ERRLOG2(g_Log, "AccountName:%16s / IP:%15s / °ú±Ý ¸¸·á Á¢¼Ó ²÷±â ½ÇÆÐ : À¯Àú°¡ ¾ø½À´Ï´Ù", lpPktHanUserKill->m_szAccount, inet_ntoa(peerAddress)); } else { SERVER_ID serverID; serverID.dwID = lpSessionData->GetServerID(); CSessionData::SessionState eSessionState = lpSessionData->GetSessionState(); if ((serverID.GetType() == CServerSetup::AuthServer && CSessionData::SE_USER_ENABLED != eSessionState) || (serverID.GetType() == CServerSetup::GameServer && CSessionData::SE_CHAR_ENABLED != eSessionState)) { ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / °ú±Ý ¸¸·á Á¢¼Ó ²÷±â ½ÇÆÐ : À¯Àú³ª ij¸¯ÅͰ¡ ºñȰ¼ºÈ­µÇ¾î ÀÖ½À´Ï´Ù", lpSessionData->GetUID(), serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else if(!SendPacket::UserKill(*lpSessionData)) { ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / °ú±Ý ¸¸·á Á¢¼Ó ²÷±â ½ÇÆÐ : Á¢¼Ó ²÷±â ÆÐŶ º¸³»±â ½ÇÆÐ", lpSessionData->GetUID(), serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]); } } return true; } bool CUIDDispatch::ParseUserKill(PktUK* lpPktUK) { using namespace DataStorage; // Á¢¼Ó DB¸¦ ÀüºÎ µÚÁ®¼­, °èÁ¤°ú IP°¡ ÀÏÄ¡ÇÏ´Â ³ÑÇÑÅ× ¶ß°Å¿î ¸ÀÀ» º¸¿© ÁØ´Ù. CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID); if(0 == lpSessionData) { ERRLOG1(g_Log, "UID:%10u / UID ¼­¹ö À¯Àú Á¢¼Ó ²÷±â ½ÇÆÐ : À¯Àú°¡ ¾ø½À´Ï´Ù", lpPktUK->m_dwUserID); } else { SERVER_ID serverID; serverID.dwID = lpSessionData->GetServerID(); CSessionData::SessionState eSessionState = lpSessionData->GetSessionState(); if ((serverID.GetType() == CServerSetup::AuthServer && CSessionData::SE_USER_ENABLED != eSessionState) || (serverID.GetType() == CServerSetup::GameServer && CSessionData::SE_CHAR_ENABLED != eSessionState)) { ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / UID ¼­¹ö À¯Àú Á¢¼Ó ²÷±â ½ÇÆÐ : À¯Àú³ª ij¸¯ÅͰ¡ ºñȰ¼ºÈ­µÇ¾î ÀÖ½À´Ï´Ù", lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else if(!SendPacket::UserKill(*lpSessionData)) { ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / UID ¼­¹ö À¯Àú Á¢¼Ó ²÷±â ½ÇÆÐ : Á¢¼Ó ²÷±â ÆÐŶ º¸³»±â ½ÇÆÐ", lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]); } } return true; } }