Files
Client/Server/NFAuthTool/NFAuthServer/GameConnection.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

235 lines
5.1 KiB
C++

#include "Global.h"
#include <Nave/NFLog.h>
#include <Nave/NFStringUtil.h>
#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<unsigned char *>(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);
}