From cd085bf8be8007810e2be184beddcd5ddc56c6a8 Mon Sep 17 00:00:00 2001 From: Kai Philipp Date: Sat, 18 Jun 2016 18:34:25 +0200 Subject: [PATCH] limit enter-leave game done. --- src/net/common/servergame.cpp | 33 ++++++++++++++++++++++++++++++ src/net/common/servergamestate.cpp | 14 +++++++++++++ src/net/servergame.h | 8 ++++++++ 3 files changed, 55 insertions(+) diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index bf7102b0..27967451 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -457,6 +457,8 @@ ServerGame::InternalEndGame() { StoreAndResetRanking(); m_game.reset(); + // @XXX: reset NumJoinsPerPlayerMap (if a game restarts, the number of joins will be set to 0 for each player) + ResetNumJoinsPerPlayer(); } void @@ -1164,3 +1166,34 @@ ServerGame::GetNextGameNum() return m_gameNum++; } +void +ServerGame::AddPlayerToNumJoinsPerPlayer(const std::string &playerName) +{ + if(m_numjoinsp.find(playerName) != m_numjoinsp.end()){ + m_numjoinsp[playerName] = m_numjoinsp[playerName] + 1; + }else{ + m_numjoinsp[playerName] = 1; + } +} + +int +ServerGame::GetNumJoinsPerPlayer(const std::string &playerName) +{ + int num = 0; + if(m_numjoinsp.find(playerName) != m_numjoinsp.end()){ + num = m_numjoinsp[playerName]; + } + return num; +} + +void +ServerGame::ResetNumJoinsPerPlayer() +{ + NumJoinsPerPlayerMap::const_iterator numj_i = m_numjoinsp.begin(); + NumJoinsPerPlayerMap::const_iterator numj_end = m_numjoinsp.end(); + + while (numj_i != numj_end) { + m_numjoinsp[numj_i->first] = 0; + ++numj_i; + } +} diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 372e5165..b6930113 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -537,10 +537,24 @@ ServerGameStateInit::HandleNewPlayer(boost::shared_ptr server, boost { if (session && session->GetPlayerData()) { const GameData &tmpGameData = server->GetGameData(); + + // @XXX: debug + //LOG_ERROR("New Player: " << session->GetPlayerData()->GetName() << "."); + //server->AddPlayerToNumJoinsPerPlayer(session->GetPlayerData()->GetName()); + //LOG_ERROR("Num joins of " << session->GetPlayerData()->GetName() << " = " << server->GetNumJoinsPerPlayer(session->GetPlayerData()->GetName()) << "."); + + // @XXX: check if player joined the game more than 9 times - decline if > 9 + if (server->GetNumJoinsPerPlayer(session->GetPlayerData()->GetName()) > 9) { + server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); + return; + } + // Check the number of players. if (server->GetCurNumberOfPlayers() >= tmpGameData.maxNumberOfPlayers) { server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); } else { + // @XXX: add player to NumJoinsPerPlayerMap + server->AddPlayerToNumJoinsPerPlayer(session->GetPlayerData()->GetName()); AcceptNewSession(server, session, false); diff --git a/src/net/servergame.h b/src/net/servergame.h index 560c54aa..ab351b80 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -125,6 +125,10 @@ public: void KickPlayer(unsigned playerId); + void AddPlayerToNumJoinsPerPlayer(const std::string &playerName); + int GetNumJoinsPerPlayer(const std::string &playerName); + void ResetNumJoinsPerPlayer(); + protected: struct RankingData { @@ -191,6 +195,8 @@ protected: SessionManager &GetSessionManager(); ServerDBInterface &GetDatabase(); + typedef std::map NumJoinsPerPlayerMap; + private: ServerGame(const ServerGame &other); @@ -251,6 +257,8 @@ private: friend class ServerGameStateHand; friend class ServerGameStateWaitPlayerAction; friend class ServerGameStateWaitNextHand; + + NumJoinsPerPlayerMap m_numjoinsp; }; #endif