uint32 CEbenezerDlg::Timer_UpdateSessions(void * lpParam) { while (g_bRunning) { SessionMap & sessMap = g_pMain->m_socketMgr.GetActiveSessionMap(); foreach (itr, sessMap) { CUser * pUser = TO_USER(itr->second); uint32 timeout = KOSOCKET_TIMEOUT; // User has authed, but isn't in-game yet (creating a character, or is waiting for the game to load). if (!pUser->m_strAccountID.empty() && !pUser->isInGame()) timeout = KOSOCKET_LOADING_TIMEOUT; // Disconnect timed out sessions if ((UNIXTIME - pUser->GetLastResponseTime()) >= timeout) { pUser->Disconnect(); continue; } // Update the player, and hence any skill effects while we're here. if (pUser->isInGame()) pUser->Update(); } g_pMain->m_socketMgr.ReleaseLock(); sleep(30 * SECOND); }
void CUser::SelCharToAgent(Packet & pkt) { Packet result(WIZ_SEL_CHAR); std::string strUserID, strAccountID; uint8 bInit; pkt >> strAccountID >> strUserID >> bInit; if (strAccountID.empty() || strAccountID.size() > MAX_ID_SIZE || strUserID.empty() || strUserID.size() > MAX_ID_SIZE || strAccountID != m_strAccountID) { Disconnect(); return; } // Disconnect any currently logged in sessions. CUser *pUser = g_pMain->GetUserPtr(strUserID, TYPE_CHARACTER); if (pUser && (pUser->GetSocketID() != GetSocketID())) { pUser->Disconnect(); // And reject the login attempt (otherwise we'll probably desync char data) result << uint8(0); Send(&result); return; } result << strUserID << bInit; g_pMain->AddDatabaseRequest(result, this); }
void CUser::LoginProcess(Packet & pkt) { // Enforce only one login request per session // It's common for players to spam this at the server list when a response isn't received immediately. if (!m_strAccountID.empty()) return; Packet result(WIZ_LOGIN); CUser * pUser; std::string strAccountID, strPasswd; pkt >> strAccountID >> strPasswd; if (strAccountID.empty() || strAccountID.size() > MAX_ID_SIZE || strPasswd.empty() || strPasswd.size() > MAX_PW_SIZE) goto fail_return; pUser = g_pMain->GetUserPtr(strAccountID, TYPE_ACCOUNT); if (pUser && (pUser->GetSocketID() != GetSocketID())) { pUser->Disconnect(); goto fail_return; } result << strPasswd; m_strAccountID = strAccountID; g_pMain->AddDatabaseRequest(result, this); return; fail_return: result << uint8(-1); Send(&result); }