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 + -
显示快捷键?