www.pudn.com > [Server]Distribute.rar > DistributeDBMsgParser.cpp


#include "stdafx.h" 
#include "DistributeDBMsgParser.h" 
#include "DataBase.h" 
#include "CommonDBMsgParser.h" 
#include "UserTable.h" 
#include "ServerTable.h" 
#include "Network.h" 
#include "UserManager.h" 
 
extern int g_nServerSetNum; 
extern DWORD g_dwMaxUser; 
 
DBMsgFunc g_DBMsgFunc[] = 
{ 
	NULL, 
	RLoginCheckQuery, 
	RIpCheckQuery,			/// eIpCheckQuery (GM¾ÆÀÌÇÇ¿¡ ´ëÇÑ Ã¼Å©) 
	RCheckMaxUser, 
	RLoginCheckQueryTest, 
	 
	RTest, 
}; 
 
void LoginCheckInit() 
{ 
	g_DB.FreeQuery(0, 0, "EXEC %s", "MP_CHARACTER_LoginInit"); 
/* ¾ÆÁ÷ Ãß°¡ÇÏÁö ¸»°Í... ÇÁ·Î½ÃÁ® ¼öÁ¤ÈÄ Ãß°¡ (LBS) 
	char txt[128]; 
	sprintf(txt, "EXEC %s %d", "up_Server_ResetLoginMember", g_nServerSetNum); 
	g_DB.LoginQuery(eQueryType_FreeQuery, 0, 0, txt); 
*/ 
} 
 
 
/* 
void LoginCheckDelete(DWORD UserID)//, DWORD dwConnectionIndex) 
{ 
	char txt[128]; 
	sprintf(txt, "EXEC %s %d", "Up_Member_CheckOut", UserID); 
	g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt); 
} 
 
 
BOOL LoginCheckQuery(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex) 
{ 
	char guery[128]; 
	// id,pw,AuthKey,ServerGroupNum 
	sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1); 
	if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery) == FALSE) 
	{ 
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex); 
		return FALSE; 
	} 
	 
	g_Console.Log(eLogDisplay,4,"IDPW_QUERY   ID: %s,  ConnectionIndex: %d",id,dwConnectionIndex); 
	return TRUE; 
} 
*/ 
 
BOOL IPCheckQuery(char* ip, DWORD AuthKey, DWORD dwConnectionIndex) 
{ 
	char query[128]; 
	sprintf(query, "EXEC %s \'%s\', %d", "Up_Ip_CheckIn", ip, AuthKey); 
	if(g_DB.LoginQuery(eQueryType_FreeQuery, eIpCheckQuery, dwConnectionIndex, query) == FALSE) 
	{ 
		g_Console.Log(eLogDisplay,4,"DB is Busy(IP_CHECK)  IP:%s  ConnectionIndex:%d", ip, dwConnectionIndex); 
		return FALSE; 
	} 
 
//	g_Console.Log(eLogDisplay,4,"IP_QUERY   IP: %s,  ConnectionIndex: %d", ip, dwConnectionIndex); 
	return TRUE; 
} 
 
void LoginError(DWORD dwConnectionIdx, DWORD AuthKey,DWORD ErrorCode,DWORD dwParam) 
{	 
	MSG_DWORD2 msguser; 
	msguser.Category = MP_USERCONN; 
	msguser.Protocol = MP_USERCONN_LOGIN_NACK; 
	msguser.dwData1 = ErrorCode; 
	msguser.dwData2 = dwParam; 
	 
	g_pUserTable->SendToUser(dwConnectionIdx, AuthKey, &msguser, sizeof(msguser) ); 
 
	 
//	g_Console.Log(eLogDisplay,4,"  LOGINERROR   Errorcode: %d,  ConnectionIndex: %d",ErrorCode,dwConnectionIdx); 
} 
 
void RIpCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage) 
{ 
	if(pMessage->dwResult == 0) 
	{ 
		// DB Error(DB is busy) 
		return; 
	} 
 
	WORD Ecode =atoi((char*)pData->Data[0]); 
	DWORD AuthKey = atoi((char*)pData->Data[1]); 
 
	DWORD dwConnectionIdx	= pMessage->dwID; 
	USERINFO* pUserInfo		= g_pUserTable->FindUser(dwConnectionIdx); 
 
	if( pUserInfo == NULL )	//ÀÌ¹Ì ³ª°¬´Ù. 
		return; 
 
	if( pUserInfo->dwUniqueConnectIdx != AuthKey )	// ÀÌ¹Ì ³ª°¡°í ´Ù¸¥ ³ÑÀÌ µé¾î¿Â °æ¿ì 
		return; 
 
	if( Ecode == 0 ) 
	{ 
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_INVALID_IP ); 
		LoginCheckDelete( pUserInfo->dwUserID ); 
		//LoginCheckDelete( pUserInfo->dwUserID); 
		return; 
	} 
 
	// ¼º°ø 
	SERVERINFO* FastInfo = g_pServerTable->GetFastServer( AGENT_SERVER ); 
	 
	if(FastInfo == NULL) 
	{ 
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOAGENTSERVER ); 
		LoginCheckDelete( pUserInfo->dwUserID ); 
		pUserInfo->dwUserID = 0; 
		return; 
	} 
				 
	MSG_DWORD2BYTE msg; 
	msg.Category	= MP_USERCONN; 
	msg.Protocol	= MP_USERCONN_NOTIFY_USERLOGIN_SYN; 
	msg.dwObjectID	= pUserInfo->dwUserID; 
	msg.dwData1		= AuthKey; 
	msg.dwData2		= dwConnectionIdx; 
	msg.bData		= pUserInfo->UserLevel; 
				 
	g_Network.Send2Server(FastInfo->dwConnectionIndex,(char*)&msg,sizeof(msg)); 
} 
 
DWORD testTime[1024]; 
BOOL LoginCheckQueryTest(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex) 
{ 
	char guery[128]; 
	sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1); 
	if(g_DB.LoginQuery(101, eLoginCheckQueryTest, dwConnectionIndex, guery) == FALSE) 
	{ 
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex); 
		return FALSE; 
	} 
	 
	g_Console.Log(eLogDisplay,4,"IDPW_QUERY   ID: %s,  ConnectionIndex: %d",id,dwConnectionIndex); 
	return TRUE; 
} 
 
void	RLoginCheckQueryTest(LPQUERY pData, LPDBMESSAGE pMessage) 
{ 
	DWORD AuthKey =atoi((char*)pData->Data[2]); 
	 
	testTime[AuthKey-1] = GetTickCount() - pMessage->dwID; 
 
	g_Console.Log(eLogDisplay,4,"IDPW TestReceived    ID: %d  Time: %d",AuthKey,testTime[AuthKey-1]); 
 
	if(AuthKey == 1024) 
	{ 
		FILE* fp = fopen("test.txt","w"); 
		for(int n=0;n<1024;++n) 
			fprintf(fp,"%d  ElapsedTime: %d\n",n+1,testTime[n]); 
		fclose(fp); 
	} 
} 
 
//* MemberDB ±³Ã¼ ÀÛ¾÷ 2004.03.22 
void LoginCheckDelete(DWORD UserID) 
{ 
	char txt[128]; 
	sprintf(txt, "EXEC %s %d", "Up_GameLogout", UserID); 
	g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt); 
} 
//*/ 
 
//* MemberDB ±³Ã¼ ÀÛ¾÷ 2004.03.22 
BOOL LoginCheckQuery(char* id, char* pw, char* ip, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIndex, DWORD dwMaxUser, WORD ServerNum) 
{ 
	char guery[128]; 
	// id,pw,AuthKey,ServerGroupNum 
	// MaxUser°Ë»çÇÒ¶§ 
	sprintf(guery, "EXEC %s \'%s\', \'%s\', \'%s\', %d, \'%d\', %d, %d, %d",  
						"up_gameloginadult_free", id, pw, ip, ServerNo, AuthKey, dwMaxUser, gUserMGR.GetLimitAge(), ServerNum); 
 
	if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery, FALSE) == FALSE) 
	{ 
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex); 
		LoginError( dwConnectionIndex, AuthKey, LOGIN_ERROR_DISTSERVERISBUSY ); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
//*/ 
 
//* MemberDB ±³Ã¼ ÀÛ¾÷ 2004.03.22 
void RLoginCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage) 
{ 
	DWORD stateNo = atoi((char*)pData->Data[0]); 
	WORD ServerNo = atoi((char*)pData->Data[1]); 
	DWORD UserIdx = atoi((char*)pData->Data[2]); 
///////////////////////////////////////////////////////// 
// °áÁ¦ °ü·Ã º¯¼ö (¾ÆÁ÷ »ç¿ë¾ÈÇÔ.) 
//	WORD Type = atoi((char*)pData->Data[3]);	//°áÁ¦¹æ½Ä 
//	WORD time = atoi((char*)pData->Data[4]);	//³²Àº½Ã°£?? 
//	WORD bTen = atoi((char*)pData->Data[5]);	//üÇèÆÇ¿©ºÎ 
///////////////////////////////////////////////////////// 
	DWORD AuthKey = atoi((char*)pData->Data[6]); 
	BYTE UserLevel = atoi((char*)pData->Data[7]); 
	WORD AgentNo = atoi((char*)pData->Data[8]); 
	DWORD dwConnectionIdx = pMessage->dwID; 
 
 
	USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx); 
 
	if(pUserInfo == NULL)		// ÀÌ¹Ì ³ª°£°æ¿ì 
	{ 
		LoginCheckDelete(UserIdx); 
		return; 
	} 
 
	ASSERT(pUserInfo->dwConnectionIndex == dwConnectionIdx); 
	if(pUserInfo->UserLevel == eUSERLEVEL_PROGRAMMER) 
	{ 
		////////////////////////////////////////////////////////////////////////// 
		// testcode 
		FILE* fp = fopen("loginchk.txt","a"); 
		fprintf(fp,"RLOGIN_Q %d\t%d\t%d\t%d\t%d\n",UserIdx,dwConnectionIdx,(DWORD)pUserInfo,pUserInfo->dwUniqueConnectIdx,AuthKey); 
		fclose(fp); 
		////////////////////////////////////////////////////////////////////////// 
	} 
 
	if(pUserInfo->dwUniqueConnectIdx != AuthKey)		// ÀÌ¹Ì ³ª°¡°í ´Ù¸¥ ³ÑÀÌ µé¾î¿Â °æ¿ì 
	{ 
		LoginCheckDelete(UserIdx); 
		return; 
	} 
 
	pUserInfo->dwUserID = UserIdx; 
	pUserInfo->UserLevel = UserLevel; 
	pUserInfo->State = stateNo; 
 
	// À̰÷¿¡¼­ ¸¸¾à À߸øµÈ UserIdx°¡ ³Ñ¾î¿Â °æ¿ì 
 
//	g_Console.Log(eLogDisplay, 4, "ID/PW Check Received dwConnectionIdx:%d",dwConnectionIdx); 
	 
	switch(stateNo) 
	{ 
	case 1: // Á¢¼Ó ¼º°ø. 
		{ 
			// À¯Àú·¹º§ °Ë»ç 
			if(gUserMGR.IsValidUserLevel(UserLevel) == FALSE) 
			{ 
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_INVALIDUSERLEVEL); 
 
				DisconnectUser(dwConnectionIdx); 
				LoginCheckDelete(UserIdx); // ¼öÁ¤¿ä!!! 
				return; 
			} 
//			g_Console.Log(eLogDisplay, 4, "  ID/PW Success : dwConnectionIdx: %d",dwConnectionIdx); 
			 
			if( UserLevel == eUSERLEVEL_GM ) 
			{ 
				char strIP[16] = {0,}; 
				WORD wPort; 
				g_Network.GetUserAddress( dwConnectionIdx, strIP, &wPort ); 
 
				IPCheckQuery( strIP, AuthKey, dwConnectionIdx ); 
			} 
			else 
			{	 
				SERVERINFO* pAgentServer = g_pServerTable->GetServer(AGENT_SERVER, AgentNo); 
				if(pAgentServer == NULL) 
				{ 
					LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_NOAGENTSERVER); 
					DisconnectUser(dwConnectionIdx); 
					LoginCheckDelete(UserIdx);	//OnDisconnectUser¿¡¼­ È£ÃâÇϴµ¥.. Ȥ½Ã³ªÇؼ­. 
					return; 
				} 
 
				MSG_DWORD2BYTE msg; 
				msg.Category	= MP_USERCONN; 
				msg.Protocol	= MP_USERCONN_NOTIFY_USERLOGIN_SYN; 
				msg.dwObjectID	= UserIdx; 
				msg.dwData1		= AuthKey; 
				msg.dwData2		= dwConnectionIdx; 
				msg.bData		= UserLevel; 
				 
				g_Network.Send2Server(pAgentServer->dwConnectionIndex,(char*)&msg,sizeof(msg)); 
			} 
		} 
		break; 
	case 2: // ID¾øÀ½. 
		{ 
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW); 
		} 
		break; 
	case 3: // ºñ¹Ð¹øÈ£¿À·ù. 
		{ 
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW);			 
		} 
		break; 
	case 4: // °ÔÀÓ¿¡ Á¢¼ÓÁß. 
		{ 
			if(g_nServerSetNum == ServerNo) 
			{ 
				MSG_DWORD msg; 
				msg.Category = MP_USERCONN; 
				msg.Protocol = MP_USERCONN_NOTIFY_OVERLAPPEDLOGIN; 
				msg.dwData = UserIdx; 
				g_Network.Broadcast2AgentServer((char*)&msg,sizeof(msg)); 
			 
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGIN,0); 
			} 
			else 
			{ 
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGININOTHERSERVER,ServerNo); 
			} 
		} 
		break; 
 
	case 5: // ºí·°µÈ °èÁ¤. @state_num = 6ÀÌ¸é °èÁ¤ºí·° (À¥ °ü¸®¸ðµå¿¡¼­ »ç¿ë) 
		{ 
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_BLOCKUSERLEVEL); 
		} 
		break; 
 
	case 7: // DB Connection Error 
		{ 
			ASSERTMSG(0, "login check error ret 0"); 
		} 
		break; 
 
	case 8: // ÀοøÃʰú 
		{			 
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER ); 
		} 
		break; 
	case 14: 
		{ 
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOT_CLOSEBETAWINNER ); 
		} 
		break; 
	case 15: //¼ºÀμ·¿¡ ¹Ì¼º³âÀÚ°¡ µé¾î¿À·Á°í Çß´Ù. 
		{ 
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MINOR_INADULTSERVER ); 
		} 
		break; 
	case 50: // ȸ¿øÅ»ÅðÇÑ °èÁ¤ÀÓ. 
		{ 
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_SECEDEDACCOUNT); 
		} 
		break; 
	default: 
		{ 
			ASSERT(0); 
		} 
	} 
} 
//*/ 
 
BOOL CheckMaxUser( char* id, char* pw, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIdx ) 
{ 
	char guery[128]; 
	sprintf( guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_CheckMaxUser", id, pw, ServerNo, AuthKey ); 
 
	if( g_DB.LoginQuery(eQueryType_FreeQuery, eCheckMaxUser, dwConnectionIdx, guery) == FALSE ) 
	{ 
		g_Console.Log( eLogDisplay, 4, "DB is Busy" ); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
void RCheckMaxUser( LPQUERY pData, LPDBMESSAGE pMessage ) 
{ 
	char id[20] = {0,}; 
	char pwd[20] = {0,}; 
 
	DWORD MaxUser = atoi((char*)pData->Data[0]); 
	DWORD AuthKey = atoi((char*)pData->Data[3]); 
	SafeStrCpy(id, (char*)pData->Data[1], 20); 
	SafeStrCpy(pwd, (char*)pData->Data[2], 20); 
 
	DWORD dwConnectionIdx = pMessage->dwID; 
 
	USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx); 
	if(pUserInfo == NULL)		// ÀÌ¹Ì ³ª°£°æ¿ì 
		return; 
	if(pUserInfo->dwUniqueConnectIdx != AuthKey)		// ÀÌ¹Ì ³ª°¡°í ´Ù¸¥ ³ÑÀÌ µé¾î¿Â °æ¿ì 
		return; 
 
	if( g_dwMaxUser <= MaxUser ) 
	{ 
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER ); 
		return; 
	}			 
				 
	// MemberDB ±³Ã¼¿¡ µû¸¥ 2004.03.22 
	char ip[20] = {0,}; 
	WORD port = 0; 
	g_Network.GetUserAddress(dwConnectionIdx, ip, &port); 
	 
//	LoginCheckQuery(id, pwd, ip, g_nServerSetNum, AuthKey, dwConnectionIdx); 
} 
 
 
enum CHItem			// ij¸¯ÅÍ ¾ÆÀÌÅÛ Á¤º¸¸¦ ¹ÞÀ»¶§ »ç¿ë 
{ 
	eCI_ObjectID = 0, eCI_DBIDX, eCI_IDX, eCI_Position, eCI_QPosition, eCI_Durability 
}; 
 
void RTest(LPQUERY pData, LPDBMESSAGE pMessage) 
{ 
}