clloginhandler.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 1,033 行 · 第 1/2 页

CPP
1,033
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CLLoginHandler.cpp// Written By  : Reiot// Description : //// 捞 菩哦篮 努扼捞攫飘啊 酒捞叼客 菩胶况靛甫 鞠龋拳秦辑 // 肺弊牢 辑滚肺 傈价茄促. 肺弊牢 辑滚绰 捞 菩哦阑 罐酒辑// 敲饭捞绢狼 酒捞叼客 菩胶况靛啊 沥犬茄瘤 DB肺何磐 佬绢辑// 厚背茄 饶, 肺弊牢狼 己傍 咯何甫 傈价茄促.//// *CAUTION*//// 漂沥 酒捞叼客 菩胶况靛甫 啊柳 敲饭捞绢甫 八祸窍绰 SQL 巩栏肺 绢恫 巴捞 // 歹 瓤啦利老鳖?//// (1) SELECT Password FROM Player WHERE ID = 'AAA' 栏肺 八祸茄 饶, //     菩胶况靛甫 厚背茄促.// (2) SELECT ID FROM Player WHERE ID = 'AAA' AND Password = 'BBB' 栏肺 //     八祸秦辑 府畔窍绰 row 啊 乐绰瘤 眉农茄促.//// 捞俊 蝶扼辑, 牢郸胶甫 绢痘霸 汲沥窍绰瘤啊 搬沥登摆促.//// (1) - CREATE INDEX PlayerIDIndex ON Player (ID)// (2) - CREATE INDEX PlayerIDPasswordIndex ON Player (ID , Password)//// 泅犁狼 急琶篮 (2) 登摆促.//// *CAUTION*// // 鞍篮 敲饭捞绢狼 悼矫 立加阑 阜扁 困秦辑 Player 抛捞喉狼 LogOn 拿烦蔼阑// 眉农秦具 茄促. 父距 LogOn = 'LOGON' 老 版快, 捞固 立加窍绊 乐促绊 埃林// 秦具 窍骨肺, 捞繁 荤恩篮 立加阑 瞒窜秦具 茄促. (拱沸 利例茄 皋矫瘤甫// 免仿秦拎具 茄促.)//// 林狼且 痢篮, 辑滚啊 crash 瞪 版快 货肺 剁况龙锭 LogOn 鞘靛甫 葛滴// LOGOFF 肺 檬扁拳秦拎具 茄促绰 痢捞促.///////////////////////////////////////////////////////////////////////////////*   // 齿付喉狼 Player table俊 鞘夸茄巴 沥府. by sigi. 2002.10.23   PlayerID,   Password,	// 促弗 狼固.   CurrentWorldID,    CurrentServerGroupID,    CurrentLoginServerID,    SpecialEventCount,   LogOn,    Access,    LoginIP,    PayType, PayPlayDate, PayPlayHours, PayPlayFlag    LastSlot,    LastLoginDate,    LoginIP   // 齿付喉俊辑 累诀秦拎具窍绰 巴   UPDATE Player SET Password='12345678' WHERE PlayerID='playerid';   if (getAffectedRowCount()==0)   {   		INSERT INTO Player (PlayerID, Password) Values ( 'playerid', '12345678' );   }*/#include "CLLogin.h"#ifdef __LOGIN_SERVER__	#include "LoginPlayer.h"	#include "DatabaseManager.h"	#include "GameServerGroupInfoManager.h"	#include "GameServerInfoManager.h"	#include "Lpackets/LCLoginOK.h"	#include "Lpackets/LCLoginError.h"	#include "UserInfoManager.h"	#include "Assert.h"	#include "Properties.h"	#include "DB.h"	#include <sys/time.h>	#include <time.h>	#include "gameserver/billing/BillingPlayerManager.h"	#include "types/ServerType.h"	#include "chinabilling/CBillingInfo.h"#ifdef __CONNECT_CBILLING_SYSTEM__	#include "chinabilling/CBillingPlayerManager.h"#endif#endif#define SYMBOL_TEST_CLIENT '#'	// 荤郴抛胶飘 滚傈牢 版快#define SYMBOL_NET_MARBLE_CLIENT '@'	// 齿付喉俊辑 立加窍绰 版快bool isAdultByBirthday(const string& birthday);void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, const string& zipcode);bool isBlockIP(const string& ip);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CLLoginHandler::execute (CLLogin* pPacket , Player* pPlayer)	 throw (ProtocolException , Error){	__BEGIN_TRY __BEGIN_DEBUG_EX		#ifdef __LOGIN_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	//cout << pPacket->toString().c_str() << endl;	LoginPlayer* pLoginPlayer = dynamic_cast<LoginPlayer*>(pPlayer);	Statement*   pStmt        = NULL;	// 谅快 傍归 力芭. by sigi. 2002.12.6	pPacket->setID( trim(pPacket->getID()) );	string          connectIP            = pLoginPlayer->getSocket()->getHost();	string			connectMAC			 = pPacket->getMacAddress();	string          ID                   = pPacket->getID();	// MAC address setting	pLoginPlayer->setMacAddress( pPacket->getRareMacAddress() );	bool bFreePass = false;	//by sigi. 2002.10.23j//	cout << pPacket->toString() << endl;	if ( isBlockIP(connectIP) )	{		LCLoginError lcLoginError;		lcLoginError.setErrorID(IP_DENYED);		pLoginPlayer->sendPacket(&lcLoginError);		return;	}	// 荤郴抛胶飘 滚傈俊辑绰 '#sigi'  <-- 捞繁 侥栏肺 拌沥捞 甸绢柯促.	if (ID[0]==SYMBOL_TEST_CLIENT)	{		ID = ID.c_str()+1;		pPacket->setID( ID );			// 齿付喉俊辑 立加窍绰 版快		// by sigi. 2002.10.23		if (!checkNetMarbleClient( pPacket, pPlayer ))		{			return;		}		bFreePass = pLoginPlayer->isFreePass();		if (bFreePass)		{			ID = ID.c_str()+1;			pPacket->setID( ID );		}//		cout << "抛胶飘 努扼捞攫飘" << endl;		BEGIN_DB		{			// 刘芭甫 巢变促.			pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();			pStmt->executeQuery(				"INSERT INTO TestClientUser (PlayerID, IP, LoginDate) VALUES ('%s', '%s', now())", 				ID.c_str(), connectIP.c_str());			SAFE_DELETE(pStmt);		} 		END_DB(pStmt)	}	// 齿付喉俊辑 立加窍绰 版快	else 	{		// by sigi. 2002.10.23		if (!checkNetMarbleClient( pPacket, pPlayer ))		{			return;		}		bFreePass = pLoginPlayer->isFreePass();		/*		if (bFreePass)		{			ID = ID.c_str()+1;			pPacket->setID( ID );		}		*/	}	string          PASSWORD             = pPacket->getPassword();	string          SSN                  = "";	ServerGroupID_t CurrentServerGroupID = 0;	string          logon                = "";	string          access               = "";	string          zipcode              = "";	string          lastIP       	     = "";	string          lastMacAddress		 = "";	// 呼傅~ by sigi. 2002.5.31	PayType			payType;	string			payPlayDate;	string			familyPayPlayDate;	uint			payPlayHours;	uint			payPlayFlag;	bool			bAdult = false;	try 	{		////////////////////////////////////////////////////////////		// ID尔 PASSWORD俊 捞惑茄 巩磊啊 甸绢乐栏搁		// 给 甸绢坷霸 阜绰促.		////////////////////////////////////////////////////////////		bool bError = false;		if (ID.find_first_of("'\\", 0) < ID.size()) bError = true;		if (PASSWORD.find_first_of("'\\", 0) < PASSWORD.size()) bError = true;		if (bError)		{//			cout << "捞惑茄 臂磊" << endl;			//cout << "Error" << endl;			LCLoginError lcLoginError;			lcLoginError.setErrorID(INVALID_ID_PASSWORD);				pLoginPlayer->sendPacket(&lcLoginError);			return;		}		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		Result* pResult = NULL;				// BINARY甫 嘿捞搁. 措家巩磊 备盒阑 窍霸 等促. 		// 瘤陛鳖瘤绰 措家巩磊 包拌绝捞 login且 荐 乐菌绰单..		// 捞霸 呼傅矫胶袍率俊辑 巩力啊 蹬辑 荐沥沁促. by sigi. 2002.12.20		// BINARY PlayerID='%s'看绰单.. 弊成 PlayerID甫 促矫 佬绢客辑 静绰霸 唱阑芭 鞍酒辑..		if (bFreePass)	// by sigi. 2002.10.23		{			pResult = pStmt->executeQuery(//				"SELECT PlayerID, CurrentServerGroupID, LogOn, Access, LoginIP, MacAddress,PayType, PayPlayDate, PayPlayHours, PayPlayFlag, FamilyPayPlayDate FROM Player WHERE PlayerID = '%s'", 				"SELECT PlayerID, CurrentServerGroupID, LogOn, Access, LoginIP, PayType, PayPlayDate, PayPlayHours, PayPlayFlag, FamilyPayPlayDate FROM Player WHERE PlayerID = '%s'", 				ID.c_str());		}		else		{			pResult = pStmt->executeQuery(//				"SELECT PlayerID, SSN, CurrentServerGroupID, LogOn, Access, ZipCode, LoginIP, MacAddress,PayType, PayPlayDate, PayPlayHours, PayPlayFlag, FamilyPayPlayDate FROM Player WHERE PlayerID = '%s' AND Password = PASSWORD('%s')", 				"SELECT PlayerID, SSN, CurrentServerGroupID, LogOn, Access, ZipCode, LoginIP, PayType, PayPlayDate, PayPlayHours, PayPlayFlag, FamilyPayPlayDate FROM Player WHERE PlayerID = '%s' AND Password = PASSWORD('%s')", 				ID.c_str() , PASSWORD.c_str());		}		// by sigi. 2002.10.30		// Player啊 绝促 : 绝绊 齿付喉捞 酒囱 版快		bool bNoPlayer = ((pResult->getRowCount() == 0) && !bFreePass);		// 孽府 搬苞 ROW 狼 俺荐啊 0 捞扼绰 舵篮 		// invalid ID or Password 扼绰 舵捞促.		if (bNoPlayer)	//pResult->getRowCount() == 0) 		{			//cout << "no Result : " << ID.c_str() << endl;//			cout << "敲饭捞绢 绝澜" << endl;			LCLoginError lcLoginError;			lcLoginError.setErrorID(INVALID_ID_PASSWORD);			pLoginPlayer->sendPacket(&lcLoginError);			// 角菩 雀荐啊 3焊促 努 版快, 楷搬阑 辆丰茄促.			uint nFailed = pLoginPlayer->getFailureCount();//			cout << "角菩 雀荐 " << nFailed << endl;			if (nFailed > 3) 			{				SAFE_DELETE(pStmt);				throw DisconnectException("too many failure");			}			pLoginPlayer->setFailureCount(nFailed);			pLoginPlayer->setPlayerStatus(LPS_BEGIN_SESSION);			return;		} 		// 孽府 搬苞啊 乐促绰 富篮		// 棵官弗 ID客 菩胶况靛扼绰 富捞促...		else		{			int i = 0;			if (bFreePass)			{				// 齿付喉牢 版快俊.. 拌沥捞 绝促搁.. 官肺 积己秦具 茄促.				if (pResult->getRowCount() == 0) 				{					/*					cout << "NetMarble New Player: " << ID.c_str() << endl;					pStmt->executeQuery("INSERT INTO Player (PlayerID, Password, Name, SSN, Event) Values ('%s', '%s', '%s', '123456-1122339', 0)",											ID.c_str(), PASSWORD.c_str(), ID.c_str());															CurrentServerGroupID = 0;					logon                = "LOGOFF";					access               = "ALLOW";					zipcode				=  "000-000";					lastIP               = "255.255.255.255";					payType              = PAY_TYPE_PERIOD;					payPlayDate          = "2002-07-15 00:00:00";					payPlayHours         = 0;					payPlayFlag          = 0;					*/					// checkFreePass()俊辑 眠啊窍骨肺 乐绢具 茄促.					LCLoginError lcLoginError;					lcLoginError.setErrorID(ETC_ERROR);					pLoginPlayer->sendPacket(&lcLoginError);					pLoginPlayer->setPlayerStatus(LPS_BEGIN_SESSION);					SAFE_DELETE(pStmt);				}				else				{					cout << "NetMarble Player: " << ID.c_str() << endl;					pResult->next();					pPacket->setID( pResult->getString(++i) );	ID=pPacket->getID(); // by sigi. 2002.12.21					CurrentServerGroupID = pResult->getInt(++i);					logon                = pResult->getString(++i);					access               = pResult->getString(++i);					zipcode				= "000-000";					lastIP               = pResult->getString(++i);//					/*inthesky*/lastMacAddress    = pResult->getString(++i);					payType              = (PayType)pResult->getInt(++i);					payPlayDate          = pResult->getString(++i);					payPlayHours         = pResult->getInt(++i);					payPlayFlag          = pResult->getInt(++i);					familyPayPlayDate    = pResult->getString(++i);				}			}			else			{				cout << "Normal Player: " << ID.c_str() << endl;				pResult->next();				pPacket->setID( pResult->getString(++i) );	ID=pPacket->getID(); // by sigi. 2002.12.21				SSN                  = pResult->getString(++i);				CurrentServerGroupID = pResult->getInt(++i);				logon                = pResult->getString(++i);				access               = pResult->getString(++i);				zipcode              = pResult->getString(++i);				lastIP               = pResult->getString(++i);//				/*inthesky*/lastMacAddress	 = pResult->getString(++i);				payType              = (PayType)pResult->getInt(++i);				payPlayDate          = pResult->getString(++i);				payPlayHours         = pResult->getInt(++i);				payPlayFlag          = pResult->getInt(++i);				familyPayPlayDate    = pResult->getString(++i);			}			pLoginPlayer->setServerGroupID(CurrentServerGroupID);//			if (access == "DENY" || access == "WAIT") 			if (access != "ALLOW")			{				LCLoginError lcLoginError;				lcLoginError.setErrorID(ETC_ERROR);				pLoginPlayer->sendPacket(&lcLoginError);				pLoginPlayer->setPlayerStatus(LPS_BEGIN_SESSION);				SAFE_DELETE(pStmt);				return;			}#ifdef __PAY_SYSTEM_LOGIN__			// 呼傅 by sigi. 2002.5.31			if (!pLoginPlayer->loginPayPlay(payType, 											payPlayDate, payPlayHours, payPlayFlag,											connectIP, ID))			{				// 捣 救 辰 拌沥捞促. 成~~				LCLoginError lcLoginError;				lcLoginError.setErrorID(NOT_PAY_ACCOUNT);				pLoginPlayer->sendPacket(&lcLoginError);				pLoginPlayer->setPlayerStatus(LPS_BEGIN_SESSION);				SAFE_DELETE(pStmt);				return;			}#elif defined(__PAY_SYSTEM_FREE_LIMIT__)			// 呼傅 by sigi. 2002.11.21			if (pLoginPlayer->loginPayPlay(payType, 											payPlayDate, payPlayHours, payPlayFlag,											connectIP, ID))			{				// 老窜 弊成 甸绢啊敌促.			}#else //elif defined(__PAY_SYSTEM_ZONE__)	        pLoginPlayer->setPayPlayValue(payType, payPlayDate, payPlayHours, payPlayFlag, familyPayPlayDate);#endif			// 捞固 霸烙 吝俊 立加登绢 乐促搁, 立加且 荐 绝促.			bool bSameIP = false;			if (logon == "LOGON" || 				logon == "GAME")			{				// LOGON惑怕扼搁 鞍篮 IP俊辑 立加沁栏搁 立加 啊瓷				//if (logon=="LOGON" && connectIP==lastIP)				//{				//}				// (!) IP啊 促福搁 犁立阂啊促.				//else 				// LOGON惑怕俊辑绰 犁立 阂啊窍促.				// IP 立加瘤啊 促福搁.. GAME捞扼档 立加阂啊促.				if (logon=="LOGON" || connectIP!=lastIP)// || !pPacket->checkMacAddress(lastMacAddress))				{					LCLoginError lcLoginError;					//lcLoginError.setMessage("already connected");						lcLoginError.setErrorID(ALREADY_CONNECTED);						pLoginPlayer->sendPacket(&lcLoginError);					// 角菩 雀荐啊 3焊促 努 版快, 楷搬阑 辆丰茄促.					uint nFailed = pLoginPlayer->getFailureCount();					if (nFailed > 3) 					{						SAFE_DELETE(pStmt);						throw DisconnectException("too many failure");					}					SAFE_DELETE(pStmt);					pLoginPlayer->setFailureCount(nFailed);					pLoginPlayer->setPlayerStatus(LPS_BEGIN_SESSION);					return;					//bSameIP = false;				}					// GAME捞绊 IP啊 鞍篮 版快				else				{					bSameIP = true;				}			}			// -- 捣 汗荤 锭巩俊 泪矫 豪牢			// '捞固 立加 吝'牢单..			// 碍力 立加 秦力甫 矫虐辨 扁促府绰 惑怕肺 汲沥茄促.			if (bSameIP)			{				if (!bFreePass)	// by sigi. 2002.10.23				{					// 茄惫					if ( strstr(SSN.c_str(), "-") != NULL )					{						bAdult = isAdultByBirthday( SSN.substr(0, 6) );					}					// 吝惫					else 					{#ifdef __CHINA_SERVER__						// 吝惫篮 公炼扒 己牢						bAdult = true;#else						if (SSN.size() == 15)						{							bAdult = isAdultByBirthday( SSN.substr(6, 12) );						}						else if (SSN.size() == 18)						{							bAdult = isAdultByBirthday( SSN.substr(8, 14) );						}						else						{							// 捞繁 版快绰 绝促绊 窍绰单 -_-a							bAdult = false;						}#endif					}				}				// 老窜 PlayerID甫 历厘秦敌促.				pLoginPlayer->setID(ID);				pLoginPlayer->setSSN( SSN );				pLoginPlayer->setZipcode( zipcode );				// 捞 版快绰 GameServer狼 览翠阑 罐酒具瘤 LCLoginOK甫 焊郴扁 锭巩俊				// 老窜, 孽府 搬苞甫 捞侩秦辑 蔼阑 历厘秦敌促.				pLoginPlayer->setAdult( bAdult );				pLoginPlayer->sendLGKickCharacter();				SAFE_DELETE(pStmt);				return;			}			//if (logon == "LOGOFF" || bSameIP)			if (logon == "LOGOFF"				|| logon=="LOGON")			{				__BEGIN_DEBUG				/*				if (bSameIP)				{					// 肺弊牢俊 己傍沁栏搁, LogOn 沥焊甫 LOGOFF 俊辑 LOGON 栏肺 函版茄促.					pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON' WHERE PlayerID = '%s'",ID.c_str());				}				else				{				*/					// LOGOFF牢 版快父 LOGON栏肺 官槽促.					// by sigi. 2002.5.15//					pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON', LoginIP = '%s',MacAddress = '%s', CurrentLoginServerID=%d, LastLoginDate=now() WHERE PlayerID = '%s' AND LogOn='LOGOFF'",connectIP.c_str(), connectMAC.c_str(),g_pConfig->getPropertyInt("LoginServerID"), ID.c_str());					pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON', LoginIP = '%s', CurrentLoginServerID=%d, LastLoginDate=now() WHERE PlayerID = '%s' AND LogOn='LOGOFF'",connectIP.c_str(), g_pConfig->getPropertyInt("LoginServerID"), ID.c_str());

⌨️ 快捷键说明

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