⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distributedbmsgparser.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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¾ÆÀÌÇÇ¿¡ ´ëÇÑ Ã¼Å©)
	RLoginCheckQueryTest,
	RCheckDynamicPW,
};

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(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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -