From 1e3253a18d0be8e52f9d4cdecee979dc0ddc82c3 Mon Sep 17 00:00:00 2001 From: Albert Medela Date: Sun, 24 May 2020 21:24:15 +0200 Subject: [PATCH] add latereg timers --- src/net/common/servergame.cpp | 61 +++++++++++++++++++++++++++++- src/net/common/servergamestate.cpp | 19 +++++++++- src/net/servergame.h | 10 +++++ src/net/servergamestate.h | 1 + 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index 20a7ae22..b7b140d6 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -71,10 +71,15 @@ ServerGame::ServerGame(boost::shared_ptr lobbyThread, u_int32 m_gameData(gameData), m_curState(NULL), m_id(id), m_name(name), m_password(pwd), m_creatorPlayerDBId(creatorPlayerDBId), m_playerConfig(playerConfig), m_gameNum(1), m_curPetitionId(1), m_voteKickTimer(lobbyThread->GetIOService()), - m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()), - m_isNameReported(false) + m_stateTimer1(lobbyThread->GetIOService()), m_stateTimer2(lobbyThread->GetIOService()), m_allowEntryTimer(lobbyThread->GetIOService()), + m_isNameReported(false), m_isLateRegAllowed(false) { LOG_VERBOSE("Game object " << GetId() << " created."); + + // set late reg allowed + if ((m_gameData.gameType == GAME_TYPE_NORMAL || m_gameData.gameType == GAME_TYPE_REGISTERED_ONLY) && + (m_gameData.allowLateReg || m_gameData.allowReentries) && + m_gameData.maxTimeLateReg > 0) m_isLateRegAllowed = true; } ServerGame::~ServerGame() @@ -92,6 +97,7 @@ void ServerGame::Exit() { m_voteKickTimer.cancel(); + m_allowEntryTimer.cancel(); SetState(ServerGameStateFinal::Instance()); } @@ -353,6 +359,8 @@ ServerGame::InternalStartGame() if (GetGameData().gameType == GAME_TYPE_RANKING) StoreLastGames(playerData); + + setEntries(playerData); } return playerData; @@ -492,6 +500,7 @@ ServerGame::InternalEndGame() StoreAndResetRanking(); m_game.reset(); m_numJoinsPerPlayer.clear(); + m_numEntriesPlayer.clear(); } void @@ -1119,6 +1128,12 @@ ServerGame::GetStateTimer2() return m_stateTimer2; } +boost::asio::steady_timer & +ServerGame::GetAllowEntryTimer() +{ + return m_allowEntryTimer; +} + Game & ServerGame::GetGame() { @@ -1231,3 +1246,45 @@ ServerGame::GetNumJoinsPerPlayer(const std::string &playerName) } return num; } + +void +ServerGame::setEntries(const PlayerDataList &playerDataList) { + + PlayerDataList::const_iterator i = playerDataList.begin(); + PlayerDataList::const_iterator end = playerDataList.end(); + + while (i != end) { + boost::shared_ptr tmpPlayer(*i); + m_numEntriesPlayer[tmpPlayer->GetName()] = 0; + ++i; + } +} + +bool +ServerGame::admitReentries(boost::shared_ptr player) { // FIXME: maybe set a reason, to return appropiate message. eg: uint32 &reason + + bool retVal = false; + const GameData &tmpGameData = GetGameData(); + + if (!m_isLateRegAllowed) return retVal; + NumJoinsPerPlayerMap::iterator pos = m_numEntriesPlayer.find(player->GetName()); + if (pos != m_numEntriesPlayer.end()) { // is reentry + if (!tmpGameData.allowReentries || pos->second++ >= tmpGameData.numReentries ) return retVal; // number of entries exceeded + } + else { // is late reg + if (!tmpGameData.allowLateReg) return false; // does not allow late reg + m_numEntriesPlayer[player->GetName()] = 0; // add player as new entry. Perhaps this should be set otherplace + } + + return true; +} + +void +ServerGame::CancelLateReg() { + m_isLateRegAllowed = false; +} + +bool +ServerGame::IsLateReg() { + return m_isLateRegAllowed; +} diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index dd0718bb..8b351a0b 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -825,6 +825,14 @@ ServerGameStateStartGame::TimerTimeout(const boost::system::error_code &ec, boos } } +void +ServerGameStateStartGame::TimerAllowLateRegTimeout(const boost::system::error_code &ec, boost::shared_ptr server) +{ + if (!ec) { // ( && &server->GetState() != &ServerGameStateFinal::s_state ) I don't know how to check if state is not final + server->CancelLateReg(); + } +} + void ServerGameStateStartGame::DoStart(boost::shared_ptr server) { @@ -874,6 +882,15 @@ ServerGameStateStartGame::DoStart(boost::shared_ptr server) server->SendToAllPlayers(packet, SessionData::Game | SessionData::Spectating); + // set late reg timer (if allowed) + if (server->IsLateReg()) { + server->GetAllowEntryTimer().expires_from_now( + minutes(server->GetGameData().maxTimeLateReg)); + server->GetAllowEntryTimer().async_wait( + boost::bind( + &ServerGameStateStartGame::TimerAllowLateRegTimeout, this, boost::asio::placeholders::error, server)); + } + // Start the first hand. ServerGameStateHand::StartNewHand(server); server->SetState(ServerGameStateHand::Instance()); @@ -909,7 +926,7 @@ AbstractServerGameStateRunning::HandleNewPlayer(boost::shared_ptr se // Wait for rejoining player to confirm start of game. server->GetLobbyThread().GetSender().Send(session, packet); } - else if (session && session->GetPlayerData() && server->GetGameData().gameType == GAME_TYPE_NORMAL) { // only normal games + else if (session && session->GetPlayerData() && server->admitReentries(session->GetPlayerData())) { const GameData tmpGameData = server->GetGameData(); if (server->GetCurNumberOfPlayers() < tmpGameData.maxNumberOfPlayers) { // there is a seat available diff --git a/src/net/servergame.h b/src/net/servergame.h index e9ea5867..52ae1f1e 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -128,6 +128,10 @@ public: void AddPlayerToNumJoinsPerPlayer(const std::string &playerName); int GetNumJoinsPerPlayer(const std::string &playerName); + bool admitReentries(boost::shared_ptr player); + + void CancelLateReg(); + bool IsLateReg(); protected: @@ -184,6 +188,7 @@ protected: boost::asio::steady_timer &GetStateTimer1(); boost::asio::steady_timer &GetStateTimer2(); + boost::asio::steady_timer &GetAllowEntryTimer(); const StartData &GetStartData() const; void SetStartData(const StartData &startData); @@ -196,6 +201,8 @@ protected: SessionManager &GetSessionManager(); ServerDBInterface &GetDatabase(); + void setEntries(const PlayerDataList &playerData); + typedef std::map NumJoinsPerPlayerMap; private: @@ -247,7 +254,9 @@ private: boost::asio::steady_timer m_voteKickTimer; boost::asio::steady_timer m_stateTimer1; boost::asio::steady_timer m_stateTimer2; + boost::asio::steady_timer m_allowEntryTimer; bool m_isNameReported; + bool m_isLateRegAllowed; friend class ServerLobbyThread; friend class AbstractServerGameStateReceiving; @@ -260,6 +269,7 @@ private: friend class ServerGameStateWaitNextHand; NumJoinsPerPlayerMap m_numJoinsPerPlayer; + NumJoinsPerPlayerMap m_numEntriesPlayer; }; #endif diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 83058267..a091d6d1 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -145,6 +145,7 @@ protected: virtual void InternalProcessPacket(boost::shared_ptr server, boost::shared_ptr session, boost::shared_ptr packet); void TimerTimeout(const boost::system::error_code &ec, boost::shared_ptr server); + void TimerAllowLateRegTimeout(const boost::system::error_code &ec, boost::shared_ptr server); void DoStart(boost::shared_ptr server); private: