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

📄 pay.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
#include "pay.h"
//#include "StdAfx.h"

#include "MAIN.H"
//#include "NPC_Pattern.h"
//#include "Map.h"
//#include "Scrp_exe.h"
#include "monitor.h"
#include "servertable.h"
//#include "Id.h"
//趣矫扼档 巩力积扁搁 林籍 钱巴
const int month_tbl[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };	
extern HDBC  hDBC_TotalDB;
		
extern int GetUserAge(const char* szID);	// 030929 kyo
extern bool IsLimitedTime();				// 030929 kyo

COnePass onepass;
		
COnePass::COnePass()
{
}		

COnePass::~COnePass()
{		
}		
		
int COnePass::InsertUsedID_SQL_ForPay( LPSTR szMapName, LPSTR szUID, 
									  char *IP , char *joint_id, 
									  int type, WORD wPort, DWORD dwID )
{
	HSTMT		hStmt = NULL;
	RETCODE		retCode = 0;
	
	char		szQuerry[512] = {0,};
	::sprintf(szQuerry, "insert into logintable (servername, user_id, type, ip, joint_id, port, agent_id, server_set_num, d_kyulje) values "
						"('%s','%s',"
						"'%d','%s','%s',"
						"'%d','%d','%d','%d')",
						szMapName, szUID , 
						type , IP, joint_id, 
						wPort, dwID,  g_pServerTable->GetServerSetNum(), this->d_kyulje);

	::SQLAllocStmt(hDBC_TotalDB, &hStmt);
	retCode = ::SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	::SQLFreeStmt(hStmt, SQL_DROP);
			
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{		
		return 1;
	}		

	return 0;
}

//1207 zhh
int COnePass::DeleteUsedID_SQL_ForPay(LPSTR szMapName, LPSTR szUID,int port)
{	
	char	szQuerry[255]={0,};
	HSTMT		hStmt = NULL;
	RETCODE		retCode;
	//001218 zhh
	if(port==0)
	{
		if(szUID == NULL)
			sprintf(szQuerry, "delete from logintable where servername='%s' AND server_set_num = %d", szMapName, g_pServerTable->GetServerSetNum() );
		else
			sprintf(szQuerry, "delete from logintable where user_id='%s'", szUID);
	}		
	else	
	{		
		sprintf(szQuerry, "DELETE FROM logintable WHERE port=%d AND server_set_num = %d ", port,  g_pServerTable->GetServerSetNum());
		MyLog( LOG_NORMAL, szQuerry);
	}
			
	SQLAllocStmt(hDBC_TotalDB, &hStmt);
	retCode = SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	SQLFreeStmt(hStmt, SQL_DROP);
		
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{	
		return 1;
	}	
	else
	{	
		MyLog( LOG_FATAL, "<< QUERY FAIL >> User '%s's DELETE QUERY has Failed!!!", szUID );
	}	
		
	return 0;
}
	
//2001/02/19 zhh
#include "./China/QueryDBSocket.h"
extern CQueryDBSocket *ConQ;

OUTPUT COnePass::OnePassID(const short nCn,LoginInfoPay &LIP,const bool bIsGMTool)
{
	OUTPUT Output = {0,};
	if(LocalMgr.IsAbleNation(JAPAN) && !bIsGMTool)//老夯牢单 老馆 蜡历老 版快
	{
		Output.nRet		=	CheckLoginIDForJapan(nCn,LIP);
		Output.nType	=	LIP.type;
		Output.dwIndex	=	LIP.index;
	}
	else
	{
		Output.nRet		=	CheckPW_TotalDB_SQL(nCn,LIP);//肺弊牢 啊瓷茄瘤俊 措茄 函荐 涝聪促.
		Output.nType	=	LIP.type;//搬力 鸥涝涝聪促.
		Output.dwIndex	=	LIP.index;//
		// 吝惫狼 苞陛俊辑 IP窜困狼 苞陛捞 甸绢啊搁 捞何盒俊 眠啊等促. 
		if(LocalMgr.IsAbleNation(TAIWAN|CHINA|HONGKONG))//021007 lsw//吝惫全尼措父 葛滴 酒捞乔甫 眠啊茄促. 
		{
			if( Output.nRet > 0 || Output.nRet == BT_NEED_PAY )//0焊促 努 版快绰 巢篮 朝楼啊 乐绰 巴捞绊
			{
				ConQ->AskCheckLoginWithIP( LIP.id, LIP.ip );
				Output.nRet = COnePass::BT_WAIT_BILLING_MSG;//吝惫狼 版快绰
			}
		}
	}
	return Output;
}


// 橇府 海鸥老 版快 立加 啊瓷茄 酒捞叼 牢瘤 朝磊肺 犬牢 且锭 荤侩
int GetAccessPossableDay( int &year, int &month, int &day )
{
	char szRegistDate[50]= {0,};
	// YYYY/MM/DD 屈侥捞绢具 窃
	if( GetPrivateProfileString( "nation_set", "RegistDate", "" , szRegistDate, 50,DB_DEMON_INI_ ) )
	{
		char *token = strtok( szRegistDate, "/" );
		if( !token ) return 0;
		year = atoi(token);
		
		token = strtok( NULL, "/" );
		if( !token ) return 0;
		month = atoi(token);

		token = strtok( NULL, "/" );
		if( !token ) return 0;
		day = atoi(token);

		return 1;
	}
	
	return 0;
}

// 府畔蔼..
// -1 : ID 绝澜. 
// -2 : PW 撇覆..
// -3 : 捣郴具窃..
//      巢篮 朝楼..
extern bool IsFreeLevel( char *szUID );
int COnePass::CheckPW_TotalDB_SQL(const short nCn,LoginInfoPay &LIP)//荤侩 啊瓷茄 朝楼甫 府畔 钦聪促.
{
	HSTMT		hStmt = NULL;
	RETCODE		retCode= 0;
	SDWORD		cbValue= 0;
	bool		bIsPwRight= 0;	
	int			User_TimeReamin=0;
	int			ip_idx=0;

	TIMESTAMP_STRUCT	date = {0,};

	if( LIP.pw == NULL || ::strlen(LIP.pw) <= 0 ){ return(BT_WRONG_PW); }

	::prepare( connections );

	::EatRearWhiteChar( LIP.id );

	char		szQuerry[ MAX_PATH ] = {0,};
    ::sprintf(szQuerry, "EXEC up_get_user_info2 '%s'", LIP.id);//	sprintf(szQuerry, "select id_index, passwd, d_eday from chr_log_info where login_id='%s'", LIP.id );

	::SQLAllocStmt(hDBC_TotalDB, &hStmt);
	retCode = ::SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{															
		retCode = ::SQLFetch(hStmt);
		if( retCode != SQL_SUCCESS) 
		{
			goto ERROR_NO_ID_;	// 殿废登瘤 臼篮 ID涝聪促. 
		}
		
		while(retCode == SQL_SUCCESS)
		{
			char PW[PW_LENGTH+1]= {0,};
			retCode = ::SQLGetData(hStmt, 1, SQL_C_ULONG,		&LIP.index,		0,		 &cbValue);
			retCode = ::SQLGetData(hStmt, 2, SQL_C_CHAR,		PW,				PW_LENGTH, &cbValue);
			retCode = ::SQLGetData(hStmt, 3, SQL_C_ULONG,		&this->d_kyulje,		0,		 &cbValue);
			retCode = ::SQLGetData(hStmt, 4, SQL_C_TIMESTAMP,	&date,			sizeof( TIMESTAMP_STRUCT ), &cbValue);
			retCode = ::SQLGetData(hStmt, 5, SQL_C_ULONG,		&User_TimeReamin, 0,		 &cbValue);

			::EatRearWhiteChar(PW);
			if(!::strcmp(LIP.pw, PW))
			{
				bIsPwRight = TRUE;
				break;
			}
		}
		::SQLFreeStmt(hStmt, SQL_DROP);

		if(!bIsPwRight){return(BT_WRONG_PW);}// password 撇覆..

		if(LocalMgr.IsFreeBeta())//021007 lsw
		{
			int year = 0, month = 0, day = 0;
			if( ::GetAccessPossableDay( year, month, day ) )//殿废 朝楼肺 橇府海鸥啊 啊瓷 茄瘤 眉农
			{
				sprintf(szQuerry, "login_id = '%s' AND d_regday > '%d-%d-%d' ", LIP.id, year, month, day);
				int nCount = 0;
				::GetRowLineOfSQL( "chr_log_info", "*", &nCount, szQuerry, hDBC_TotalDB );
				if( !nCount ) 
				{
					return BT_WRONG_ID;
				}
			}
			return BT_FREE;
		}

		const int iLimitDay = date.year * 365 + month_tbl[ date.month-1] + date.day; 
		const int iToday = g_year * 365 + g_yday;	
		if( iLimitDay >= iToday )// 1窜拌 : 蜡历朝楼 眉农.
		{
			return 1 + iLimitDay - iToday;// 菊栏肺 荤侩啊瓷茄 朝楼荐 
		}
		//< CSD-040127
		if (LocalMgr.IsAbleNation(TAIWAN|HONGKONG))
		{
			return BT_NEED_PAY;
		}

		if (LocalMgr.IsAbleNation(CHINA))
		{
			if (IsFreeLevel(LIP.id))
			{
				return BT_FREE;
			}

			return BT_NEED_PAY;
		}
		//> CSD-040127
		DWORD can_use = 0;
		int IP_TimeRemain=0;
		const int ret = CheckGameBangIP_SQL( &can_use, LIP.ip ,LIP.type,IP_TimeRemain,ip_idx);

		LIP.type = 0;
		
		if( ret > 0 )// 2窜拌 : IP朝楼 眉农..
		{	
			this->d_kyulje=0;
			return BT_COMMERCIAL_IP;
		}
		if(IP_TimeRemain>0)// 3窜拌 : IP 急阂辆樊力 眉农..
		{
			this->d_kyulje=0;	//ip客 包访瞪 版快 0栏肺 持绢崔扼绰 碍秦盔 评厘丛狼 夸备俊 蝶扼 0栏肺 技泼.
			LIP.type = ip_idx + 50000;
			return BT_COMMERCIAL_IP;
		}
		else if(User_TimeReamin>0)// 4窜拌 : 蜡历 急阂辆樊力 眉农..
		{
			this->d_kyulje=4000;	
			LIP.type = 4000; // 蜡历 矫埃 辆樊力 鸥涝
			return BT_COMMERCIAL_TIME_REMAIN; // 4老 捞惑巢篮巴栏肺 埃林. 
		}

		if (LocalMgr.IsAbleNation(KOREA))//捣阑 救辰 荤恩捞促
		{	//< CSD-040127
			if( ::IsFreeLevel( LIP.id ) )
			{
				return BT_FREE;
			}// 橇府饭骇蜡历捞骨肺 烹苞
		}	//> CSD-040127

		return BT_NEED_PAY;	// 捣郴具窃..
	}
	else
	{
		displaySQLError( hStmt, szQuerry ); // 030923 HK YGI
	}
ERROR_NO_ID_:
	::SQLFreeStmt(hStmt, SQL_DROP);	
	return BT_WRONG_ID;							// 弊繁 ID绝澜.
}



int COnePass::CheckGameBangIP_SQL( DWORD *can_use, LPSTR ip ,int &type, int &IP_TimeRemain,int &ip_idx)
{
	HSTMT		hStmt = NULL;
	RETCODE		retCode;
	SDWORD		cbValue;
	BOOL		bCheck;
	char		szQuerry[255];
	TIMESTAMP_STRUCT	date;
	int month_tbl[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };	
	int rt, ct;

	if(LocalMgr.IsAbleNation(TAIWAN|CHINA|HONGKONG))//021007 lsw
	{
		return BT_NEED_PAY;
	}

	bCheck = FALSE;
	//010104 zhh
	//sprintf(szQuerry, "select can_use, Billing_eday, ip_type from IP_USE where ip ='%s'", ip );
    /////////////////////////////////////////////////////////////////////////////
    sprintf(szQuerry, "EXEC up_get_ip_info '%s'", ip);
    /////////////////////////////////////////////////////////////////////////////
	SQLAllocStmt(hDBC_TotalDB, &hStmt);

	retCode = SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{		
		retCode = SQLFetch(hStmt);
			
		if( retCode == SQL_SUCCESS ) // 殿废等 IP啊 粮犁窃. 
		{	
			SQLGetData(hStmt, 1, SQL_C_ULONG, can_use, 0, &cbValue);
			SQLGetData(hStmt, 2, SQL_C_TIMESTAMP, &date,  sizeof( TIMESTAMP_STRUCT ), &cbValue);

			//1207 zhh
			SQLGetData(hStmt, 3, SQL_C_ULONG, &type, 0, &cbValue);
			SQLGetData(hStmt, 4, SQL_C_ULONG, &ip_idx, 0, &cbValue);
			
			SQLFreeStmt(hStmt, SQL_DROP);
			
			this->CheckGameBangIPAccount_SQL( ip_idx, IP_TimeRemain);
			//	朝楼 拌魂.. 
			if( *can_use == 1 ) // 荤侩啊瓷茄 IP..
			{	
				rt = date.year * 365 + month_tbl[ date.month-1] + date.day;
				ct = g_year * 365 + g_yday;
				
				if( rt < ct )	return BT_NEED_PAY;
				else			return 1 + rt - ct;	// 菊栏肺 荤侩啊瓷茄 朝楼俊 
			}	
			else
			{	
				return -2;
			}	
		}		
		else	
		{		
			SQLFreeStmt(hStmt, SQL_DROP);
			return -2;
		}		
	}			
	else
	{
		SQLFreeStmt(hStmt, SQL_DROP);	
		return -1;							// 弊繁 白规IP绝澜.
	}
	SQLFreeStmt(hStmt, SQL_DROP);			// 0414 YGI
	return(-2);
};

int COnePass::CheckLoginIDForJapan(const short nCn, LoginInfoPay &LIP)
{
	HSTMT	hStmt = NULL;
	RETCODE	retCode= 0;
	SDWORD	cbValue= 0;
	char	szQuerry[ MAX_PATH ] = {0,};
	int		rt = 0, ct= 0;

	EatRearWhiteChar( LIP.id );
	EatRearWhiteChar( LIP.pw );

	sprintf(szQuerry, "SELECT   Memidx,Uid FROM NgcTempUser WHERE (Utid = '%s%s')", LIP.id,LIP.pw);//老夯 DB曼炼//TID肺 ID 啊廉坷扁.

	SQLAllocStmt(hDBC_NGCDB, &hStmt);
	retCode = SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{															
		retCode = SQLFetch(hStmt);
		if( retCode != SQL_SUCCESS) 
		{
			goto ERROR_NO_ID_;	// 殿废登瘤 臼篮 ID涝聪促. 
		}
		retCode = ::SQLGetData(hStmt, 1, SQL_C_LONG,	&LIP.index,	ID_LENGTH, &cbValue);
		
		char szID[ID_LENGTH]= {0,};
		retCode = ::SQLGetData(hStmt, 2, SQL_C_CHAR,		szID,	ID_LENGTH, &cbValue);
		::EatRearWhiteChar( szID );
		::CharUpper( szID );
		::strcpy(connections[nCn].id,szID);
		::strcpy(LIP.id,szID);
		::SQLFreeStmt(hStmt, SQL_DROP);
		return 100;//老夯牢 版快 傍楼涝聪促. NGC俊辑 苞陛阑 窍扁 锭巩俊.
	}
ERROR_NO_ID_:

	::SQLFreeStmt(hStmt, SQL_DROP);	
	return BT_WRONG_ID;							// 弊繁 ID绝澜.
}

int COnePass::CheckGameBangIPAccount_SQL( DWORD ip_idx, int &IP_TimeRemain)
{
	HSTMT		hStmt = NULL;
	RETCODE		retCode;
	SDWORD		cbValue;
	char		szQuerry[255];

	if(LocalMgr.IsAbleNation(TAIWAN|CHINA|HONGKONG))//021007 lsw
	{
		IP_TimeRemain = 0;
		return 0;
	}

	sprintf(szQuerry, "select timeremain from IP_ACCOUNT where ip_idx ='%d'", ip_idx );

	SQLAllocStmt(hDBC_TotalDB, &hStmt);

	retCode = SQLExecDirect(hStmt, (UCHAR *)szQuerry, SQL_NTS);
	if(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
	{		
		retCode = SQLFetch(hStmt);
			
		if( retCode == SQL_SUCCESS ) // 殿废等 IP啊 粮犁窃. 
		{	
			SQLGetData(hStmt, 1, SQL_C_ULONG, &IP_TimeRemain, 0, &cbValue);
			SQLFreeStmt(hStmt, SQL_DROP);			
			return IP_TimeRemain;
		}
	}
	SQLFreeStmt(hStmt, SQL_DROP);	
	return -1;
}

bool COnePass::CheckLimitedAgeAndTime(const char* szID) // 30929 kyo
{
	if(NULL == szID )
	{
		return false;
	}

	::prepare( connections );
	if( IsLimitedTime() )
	{
		int nAge = GetUserAge( szID );
		int nLimitedAge = ::GetPrivateProfileInt( "Thai Limited", "Age", 18, DB_DEMON_INI_ );
		if( nAge < nLimitedAge || nAge <=0 )
		{
			return true;
		}		
	}
	return false;	
}

⌨️ 快捷键说明

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