#include "Global.h" #include #include #include "GameConnection.h" #include "DBComponent.h" extern "C" { #include "MD5/global.h" #include "MD5/md5.h" } using namespace NaveNet; GameConnection::GameConnection(void) { // ÇÔ¼ö¸¦ MapÀ¸·Î ¼±¾ðÇÑ´Ù. OnMsgMap[CMD] = &GameConnection::Parsed_CMD; OnMsgMap[AUTHOR] = &GameConnection::Parsed_AUTHOR; OnMsgMap[IPLIST] = &GameConnection::Parsed_Dummy; OnMsgMap[BUYITEMINFO] = &GameConnection::Parsed_BUYITEMINFO; OnMsgMap[IRC] = &GameConnection::Parsed_IRC; } GameConnection::~GameConnection(void) { } ////////////////////////////////////////////////////////////////////// // º¯¼ö ÃʱâÈ­.. ////////////////////////////////////////////////////////////////////// void GameConnection::Clear() { m_SendPacket.Init(); } void GameConnection::DispatchPacket(NFPacket& Packet) { // InterlockedExchange((LONG*)&g_iProcessPacket,g_iProcessPacket+1); // ÇÔ¼ö È£Ãâ (this->*OnMsgMap[Packet.GetCommand()])(Packet.m_Packet, Packet.GetSize()); } void GameConnection::OnConnect(BOOL bConnect) { if(bConnect) { LOG_IMPORTANT((L"[%04d] Connect User", GetIndex())); g_UManager.Join(this); } } void GameConnection::OnDisconnect() { g_UManager.Levae(GetIndex()); LOG_IMPORTANT((L"[%04d] Disconnect User", GetIndex())); m_SendPacket.Init(); } void GameConnection::Parsed_IRC(CHAR* Packet, int Len) { LPPKIRC pkIRC = (LPPKIRC)Packet; CHAR Buff[DEF_PACKETSIZE]; ZeroMemory(Buff, sizeof(Buff)); sprintf(Buff, "%s : %s", pkIRC->Key, pkIRC->Message); Nave::String strCmd = Nave::ToString(Buff); LOG_IMPORTANT((strCmd.c_str())); } void GameConnection::Parsed_CMD(CHAR* Packet, int Len) { LPPKCMD lpPK = (LPPKCMD)Packet; if(lpPK->dwCmd == CS_IPLIST) Send_IPList(); } void GameConnection::Parsed_AUTHOR(CHAR* Packet, int Len) { LPPKAUTHOR lpPK = (LPPKAUTHOR)Packet; // DB¿Í ¿¬µ¿ÇÏ¿© MD5°ªÀ» ºñ±³. °á°ú¸¦ ¸®ÅÏÇÑ´Ù. m_dwServerType = LOWORD(lpPK->Type); m_dwServerCH = HIWORD(lpPK->Type); Nave::String strKey = Nave::ToString(lpPK->Key); LOG_IMPORTANT((L"AUTHOR : %d(%d) : %s", m_dwServerType, m_dwServerCH, strKey.c_str())); char sIP[32]; GetClientIP(sIP); // Ŭ¶ó¿¡¼­ ³¯¶ó¿Â Á¤º¸¸¦ DB¿¡ Àû´Â´Ù. if(!DBComponent::CheckAuthCode(g_DBComp, lpPK->Key, sIP)) { LOG_ERROR((L"CheckAuthCode Faild : %d(%d) %s, %s", m_dwServerType, m_dwServerCH, strKey.c_str(), sIP)); } } void GameConnection::Parsed_BUYITEMINFO(CHAR* Packet, int Len) { // Ŭ¶ó¿¡¼­ ³¯¶ó¿Â Á¤º¸¸¦ DB¿¡ Àû´Â´Ù. LPPKBUYITEMINFO lpPK = (LPPKBUYITEMINFO)Packet; char* Buffer_Out = (char*)Packet+sizeof(PKBUYITEMINFO); LPNFITEMINFO ipInfo = (LPNFITEMINFO)Buffer_Out; for(int i = 0; i < lpPK->Count; ++i, ++ipInfo) { if(DBComponent::AddItemLog(g_DBComp, ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID, ipInfo->Amount) ) { // ÀÌÁ¤º¸¸¦ DB¿¡ ¾²¸é µÈ´Ù. LOG_IMPORTANT((L"[Item] ID:%d UID:%d CID:%d = %d", ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID)); } else { // ÀÌÁ¤º¸¸¦ DB¿¡ ¾²¸é µÈ´Ù. LOG_ERROR((L"[Item] FAILD ID:%d UID:%d CID:%d = %d", ipInfo->CreateID, ipInfo->UID, ipInfo->CID, ipInfo->ItemPrototypeID)); } } } void GameConnection::Parsed_Dummy(CHAR* Packet, int Len) { } void GameConnection::Send_IRC(const char* strCommand, const char* strMsg) { m_SendPacket.SetCommand(IRC); m_SendPacket.SetSize(sizeof(PKIRC)); LPPKIRC lpIRC = (LPPKIRC)m_SendPacket.m_Packet; MD5_CTX context; unsigned char digest[16] ; memset( digest, 0, sizeof( char ) * 16 ) ; int len = strlen(strCommand); char strMD5[64]; strcpy(strMD5, strCommand); MD5Init(&context); MD5Update(&context, reinterpret_cast(strMD5), len ); MD5Final(digest, &context); for (int i = 0; i < 16; ++i) { sprintf(lpIRC->Key + i * 2, "%02x", digest[i]); } strcpy(lpIRC->Message, strMsg); SendPost(m_SendPacket); } void GameConnection::Send_CMD(DWORD dwCmd, DWORD dwValue) { m_SendPacket.SetCommand(CMD); m_SendPacket.SetSize(sizeof(PKCMD)); LPPKCMD lpPk = (LPPKCMD)m_SendPacket.m_Packet; lpPk->dwCmd = dwCmd; lpPk->dwValue = dwValue; SendPost(m_SendPacket); } void GameConnection::Send_IPList() { m_SendPacket.SetCommand(IPLIST); LPPKIPLIST lpPk = (LPPKIPLIST)m_SendPacket.m_Packet; lpPk->Type = PKIPLIST::ALLOWIP; lpPk->Page = 0; int iCurCount = 0; char cPage = 0; int iCount = 0; while(TRUE) { lpPk->Type = PKIPLIST::ALLOWIP; lpPk->Page = ++cPage; char* Buffer_Out = (char*)m_SendPacket.m_Packet+sizeof(PKIPLIST); lpPk->Count = g_IPSec.SerializeOut(PKIPLIST::ALLOWIP, iCount, 100, Buffer_Out); m_SendPacket.SetSize(sizeof(PKIPLIST)+(sizeof(IPINFO)*lpPk->Count)); iCurCount = lpPk->Count; iCount += lpPk->Count; SendPost(m_SendPacket); if(iCurCount < 100) break; } cPage = 0; iCount = 0; while(TRUE) { lpPk->Type = PKIPLIST::BLOCKIP; lpPk->Page = ++cPage; char* Buffer_Out = (char*)m_SendPacket.m_Packet+sizeof(PKIPLIST); lpPk->Count = g_IPSec.SerializeOut(PKIPLIST::BLOCKIP, iCount, 100, Buffer_Out); m_SendPacket.SetSize(sizeof(PKIPLIST)+(sizeof(IPINFO)*lpPk->Count)); iCurCount = lpPk->Count; iCount += lpPk->Count; SendPost(m_SendPacket); if(iCurCount < 100) break; } Send_CMD(SC_IPLISTEND, 0); }