#include "stdafx.h" #include "UserIDTable.h" #include "UIDAgentDispatch.h" #include "SendAgentPacket.h" #include "HanUnitedBilling.h" #include "HanUnitedDisconnID.h" #include #include #include #include #include #include // ÇѰÔÀÓ ÅëÇÕºô¸µ ó¸®. ¾ÆÁÖ º¹ÀâÇÏ°íµµ °ñÄ¡¾ÆÇ ÀÛ¾÷ÀÌ µÉ °Å °°´Ù --;; bool CUIDAgentDispatch::ProcessBillingHanUnited(PktUUT* lpPktUUT) { unsigned char Cmd = lpPktUUT->m_cCmd; unsigned long ServerID = lpPktUUT->m_dwServerID; unsigned long SessionID = lpPktUUT->m_dwSessionID; unsigned long UserID = lpPktUUT->m_dwUserID; unsigned long CharID = lpPktUUT->m_dwCharID; char *AccountName = lpPktUUT->m_strAccount; IN_ADDR& IPAddress = lpPktUUT->m_IPAddress; // ÇѰÔÀÓ Ã³¸® ·çƾ switch(Cmd) { case PktUUT::UpdateUIDTableUserLogin: { CPerformanceInstrument userLogin("UserLogin"); CAutoInstrument autoInstrument(userLogin); // ŰÆÛ °ü·Ã ó¸® RE_USPCheckBilling_Login GetData = {0,}; char Check = CServerSetup::GetInstance().GetFreeCheck() ? 1 : 0; // ±âº»(=0), ¹«·á°èÁ¤(=1) if(!DBComponent::BillingDB::USPCheckBilling_Login_Post(CDBSingleObject::GetInstance(), AccountName, UserID, Check, inet_ntoa(IPAddress), GetGroup(), &GetData)) { SERLOG6(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_Login_Post È£Ãâ ½ÇÆÐ %s : %s", UserID, AccountName, ServerID, Cmd, inet_ntoa(IPAddress), CDBSingleObject::GetInstance().GetErrorString()); // DB Query½ÇÆÐ(Ŭ¶óÀÌ¾ðÆ®¿¡´Â ¿¡·¯ 1¹ø (¼­¹ö¿¡¼­ ¿¡·¯°¡ ³µ½À´Ï´Ù) ¹ß»ý AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, 4, 0, 0, 'N', 0, 0); return true; } // ¾÷µ¥ÀÌÆ® Ack if(FALSE == CServerSetup::GetInstance().GetIgnoreFlag()) { if(1 == GetData.Flag && PktUUT::DISCONNECT_USER == lpPktUUT->GetError()) { // À¯Àú°¡ ÀÌ¹Ì Á¢¼ÓÇØ ÀÖ°í, À¯Àú Á×À̱â Ç÷¡±×°¡ ¿À¸é, À¯Àú¸¦ Á×ÀδÙ. AgentSendPacket::SendHanUnitedUserKill(GetData.intCRMIndex1, AccountName, 0); } if(2 <= GetData.Flag) { // ºô¸µ ½ÇÆÐÇÑ °æ¿ì - ÅëÇÕºô¸µÀ¸·Î üũ¸¦ º¸³½´Ù. GET_SINGLE_DISPATCH(lpHanUnitedDispatch, CHanUnitedDispatch, CHanUnitedDispatch::GetDispatchTable()); if(0 == lpHanUnitedDispatch || !lpHanUnitedDispatch->SendCanLogin(*lpPktUUT, GetData, GetGroup())) { SERLOG5(g_Log, "ID:%s/IP:%s/UID:%u/CID:%u/ServerID:0x%08x/ÅëÇÕºô¸µÀ¸·Î °ú±Ý °¡´É ¿©ºÎ Àü¼Û ½ÇÆÐ.", lpPktUUT->m_strAccount, inet_ntoa(lpPktUUT->m_IPAddress), lpPktUUT->m_dwUserID, lpPktUUT->m_dwCharID, ServerID); AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, 4, 0, 0, 'N', 0, 0); } } else { // DB¿¡¼­ ¾òÀº °ªÀ» ÀüºÎ º¸³½´Ù. AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, GetData.Flag, GetData.PlayTime, GetData.intCRMIndex1, GetData.strBillingType[0], 0, lpPktUUT->GetError()); } } else { if(1 == GetData.Flag && PktUUT::DISCONNECT_USER == lpPktUUT->GetError()) { // À¯Àú°¡ ÀÌ¹Ì Á¢¼ÓÇØ ÀÖ°í, À¯Àú Á×À̱â Ç÷¡±×°¡ ¿À¸é, À¯Àú¸¦ Á×ÀδÙ. AgentSendPacket::SendHanUnitedUserKill(GetData.intCRMIndex1, AccountName, 0); } // ¹«Á¶°Ç ¼º°ø½ÃŲ´Ù. ´Ü Áߺ¹·Î±×ÀÎÀÌ¸é ·Î±×ÀÎ ¸øÇϵµ·Ï ÇÑ´Ù. AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, (1 == GetData.Flag) ? 1 : 0, GetData.PlayTime, GetData.intCRMIndex1, GetData.strBillingType[0], 0, lpPktUUT->GetError()); } DETLOG7(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_Login_Post È£Ãâ ¸®ÅÏ °ª Ãâ·Â. %u, %u [%s]", UserID, AccountName, ServerID, Cmd, GetData.Flag, GetData.intCRMIndex1, inet_ntoa(IPAddress)); } break; case PktUUT::UpdateUIDTableCharLogin: { CPerformanceInstrument charLogin("CharLogin"); CAutoInstrument autoInstrument(charLogin); // ŰÆÛ °ü·Ã ó¸® RE_USPCheckBilling_Login GetData = {0,}; char Check = CServerSetup::GetInstance().GetFreeCheck() ? 1 : 0; // ±âº»(=0), ¹«·á°èÁ¤(=1) if(!DBComponent::BillingDB::USPCheckBilling_CharIDLogin_Post(CDBSingleObject::GetInstance(), AccountName, UserID, Check, inet_ntoa(IPAddress), GetGroup(), &GetData)) { SERLOG6(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_CharIDLogin_Post È£Ãâ ½ÇÆÐ %s : %s", UserID, AccountName, ServerID, Cmd, inet_ntoa(IPAddress), CDBSingleObject::GetInstance().GetErrorString()); // DB Query½ÇÆÐ(Ŭ¶óÀÌ¾ðÆ®¿¡´Â ¿¡·¯ 1¹ø (¼­¹ö¿¡¼­ ¿¡·¯°¡ ³µ½À´Ï´Ù) ¹ß»ý AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, 4, 0, 0, 'N', 0, 0); return true; } // ¾÷µ¥ÀÌÆ® Ack if(FALSE == CServerSetup::GetInstance().GetIgnoreFlag()) { if(2 <= GetData.Flag) { // ºô¸µ ½ÇÆÐÇÑ °æ¿ì - ÅëÇÕºô¸µÀ¸·Î üũ¸¦ º¸³½´Ù. GET_SINGLE_DISPATCH(lpHanUnitedDispatch, CHanUnitedDispatch, CHanUnitedDispatch::GetDispatchTable()); if(0 == lpHanUnitedDispatch || !lpHanUnitedDispatch->SendLogin(*lpPktUUT, GetData, GetGroup())) { SERLOG5(g_Log, "ID:%s/IP:%s/UID:%u/CID:%u/ServerID:0x%08x/ÅëÇÕºô¸µÀ¸·Î ·Î±×ÀÎ Àü¼Û ½ÇÆÐ.", lpPktUUT->m_strAccount, inet_ntoa(lpPktUUT->m_IPAddress), lpPktUUT->m_dwUserID, lpPktUUT->m_dwCharID, ServerID); AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, 4, 0, 0, 'N', 0, 0); } } else { // DB¿¡¼­ ¾òÀº °ªÀ» ÀüºÎ º¸³½´Ù. AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, GetData.Flag, GetData.PlayTime, GetData.intCRMIndex1, GetData.strBillingType[0], 0, 0); } } else { AgentSendPacket::SendUpdateUIDTable(GetGroup(), Cmd, UserID, 0, GetData.PlayTime, GetData.intCRMIndex1, GetData.strBillingType[0], 0, 0); } DETLOG7(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_CharIDLogin_Post È£Ãâ ¸®ÅÏ °ª Ãâ·Â. %u, %u [%s]", UserID, AccountName, ServerID, Cmd, GetData.Flag, GetData.intCRMIndex1, inet_ntoa(IPAddress)); } break; case PktUUT::UpdateUIDTableUserLogout: case PktUUT::UpdateUIDTableCharLogout: // ´õ ÀÌ»ó Á¢¼ÓÀ» ÇØÁ¦ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. CHanUnitedDisconnectID::GetInstance().RemoveDisconnectInfo(UserID); case PktUUT::UpdateUIDTableUserMove: case PktUUT::UpdateUIDTableCharMove: { CPerformanceInstrument logout("Logout"); CAutoInstrument autoInstrument(logout); // ŰÆÛ ó¸® unsigned long Return = 0; if(!DBComponent::BillingDB::USPCheckBilling_LogOut_Post(CDBSingleObject::GetInstance(), AccountName, &Return)) { SERLOG5(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_LogOut_Post È£Ãâ ½ÇÆÐ : %s", UserID, AccountName, ServerID, Cmd, CDBSingleObject::GetInstance().GetErrorString()); return true; } if(0 != Return && 10 != Return) { SERLOG5(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_LogOut_Post È£Ãâ ¸®ÅÏ ¿¡·¯. %u", UserID, AccountName, ServerID, Cmd, Return); } else { DETLOG5(g_Log, "À¯Àú(%u) [%s] ¼­¹ö(0x%08x) ST:%d USPCheckBilling_LogOut_Post È£Ãâ ¸®ÅÏ °ª Ãâ·Â. %u", UserID, AccountName, ServerID, Cmd, Return); if(10 == Return) { if(!CHanUnitedLogout::GetInstance().AddLogout(*lpPktUUT)) { SERLOG5(g_Log, "ID:%s/IP:%s/UID:%u/CID:%u/ServerID:0x%08x/ÅëÇÕºô¸µÀ¸·Î ·Î±×¾Æ¿ô º¸³»±â ½ÇÆÐ.", lpPktUUT->m_strAccount, inet_ntoa(lpPktUUT->m_IPAddress), lpPktUUT->m_dwUserID, lpPktUUT->m_dwCharID, ServerID); } } } } break; default: SERLOG1(g_Log, "¾Ë ¼ö ¾ø´Â Ä¿¸Çµå(%d)°¡ µé¾î¿Ô½À´Ï´Ù.", Cmd); break; } return true; } bool CUIDAgentDispatch::ProcessDisconnectHanUnited() { // ÇѰÔÀÓ ºô¸µÀ̳ª, ÇѰÔÀÓ ÅëÇÕºô¸µÀÎ °æ¿ì. unsigned long Result = 0; // TODO : ·Î±×¾Æ¿ô ó¸®. if(!DBComponent::BillingDB::USPDisConnectLogOut_Post(CDBSingleObject::GetInstance(), m_Group)) { SERLOG3(g_Log, "%d ±×·ì ·Î±×¾Æ¿ô ½ÇÆÐ. °á°ú°ª:0x%08x DB¿¡·¯ ·Î±×:%s", m_Group, Result, CDBSingleObject::GetInstance().GetErrorString()); } else { #pragma pack(1) struct HanUnitedBillingUser { char m_szID[20]; char m_szIP[15]; }; #pragma pack() GET_SINGLE_DISPATCH(lpHanUnitedDispatch, CHanUnitedDispatch, CHanUnitedDispatch::GetDispatchTable()); HanUnitedBillingUser hanUnitedBillingUser[OleDB::MaxRowNum]; memset(&hanUnitedBillingUser, 0, sizeof(HanUnitedBillingUser) * OleDB::MaxRowNum); PktUUT pktUUT; memset(&pktUUT, 0, sizeof(PktUUT)); int nGetRow = 0; while(CDBSingleObject::GetInstance().GetData((void**)hanUnitedBillingUser, sizeof(HanUnitedBillingUser), OleDB::MaxRowNum, &nGetRow)) { if(0 == nGetRow) { break; } HanUnitedBillingUser* lpBillingUser = hanUnitedBillingUser; HanUnitedBillingUser* lpBillingUserEnd = hanUnitedBillingUser + nGetRow; for(; lpBillingUser != lpBillingUserEnd; ++lpBillingUser) { _snprintf(pktUUT.m_strAccount, PktUUT::MaxAccountLen, "%s", lpBillingUser->m_szID); pktUUT.m_strAccount[PktUUT::MaxAccountLen - 1] = 0; pktUUT.m_IPAddress.S_un.S_addr = inet_addr(lpBillingUser->m_szIP); if(!CHanUnitedLogout::GetInstance().AddLogout(pktUUT)) { SERLOG3(g_Log, "ID:%s/IP:%s/ServerGroup:%d/¼­¹ö±º Á¢¼Ó ²÷±èÀ¸·Î ÅëÇÕºô¸µÀ¸·Î ·Î±×¾Æ¿ô º¸³»±â ½ÇÆÐ.", lpBillingUser->m_szID, lpBillingUser->m_szIP, m_Group); } } memset(&hanUnitedBillingUser, 0, sizeof(HanUnitedBillingUser) * OleDB::MaxRowNum); } SERLOG1(g_Log, "%d ±×·ì USPDisConnectLogOut È£Ãâ ¼º°ø", m_Group); if(!DBComponent::BillingDB::USPServer_End(CDBSingleObject::GetInstance(), m_Group, &Result)) { SERLOG3(g_Log, "%d ±×·ì ·Î±×¾Æ¿ô ½ÇÆÐ. °á°ú°ª:0x%08x DB¿¡·¯ ·Î±×:%s", m_Group, Result, CDBSingleObject::GetInstance().GetErrorString()); } else { SERLOG1(g_Log, "%d ±×·ì USEServer_End È£Ãâ ¼º°ø", m_Group); } } return true; }