From 5239f496f38777bf1e83b6a8d18903ee8a0e2d85 Mon Sep 17 00:00:00 2001 From: lotodore Date: Tue, 30 Mar 2010 17:10:37 +0000 Subject: [PATCH] Finishing server side invitation system. --- src/net/common/clientstate.cpp | 2 +- src/net/common/servergame.cpp | 25 +++++++++++++++++++++ src/net/common/servergamestate.cpp | 12 +++++++--- src/net/common/serverlobbythread.cpp | 33 ++++++++++++++++++++++++++-- src/net/servergame.h | 7 ++++++ src/net/serverlobbythread.h | 1 + 6 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 983fe155..eabe9edc 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -1160,7 +1160,7 @@ ClientStateWaitAuthChallenge::~ClientStateWaitAuthChallenge() } void -ClientStateWaitAuthChallenge::Enter(boost::shared_ptr client) +ClientStateWaitAuthChallenge::Enter(boost::shared_ptr /*client*/) { } diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index 8edc30fc..10b63daf 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -482,6 +482,31 @@ ServerGame::SetAdminPlayerId(unsigned playerId) m_adminPlayerId = playerId; } +void +ServerGame::AddPlayerInvitation(unsigned playerId) +{ + boost::mutex::scoped_lock lock(m_playerInvitationListMutex); + m_playerInvitationList.push_back(playerId); +} + +void +ServerGame::RemovePlayerInvitation(unsigned playerId) +{ + boost::mutex::scoped_lock lock(m_playerInvitationListMutex); + m_playerInvitationList.remove(playerId); +} + +bool +ServerGame::IsPlayerInvited(unsigned playerId) const +{ + bool retVal = false; + boost::mutex::scoped_lock lock(m_playerInvitationListMutex); + PlayerIdList::const_iterator pos = find(m_playerInvitationList.begin(), m_playerInvitationList.end(), playerId); + if (pos != m_playerInvitationList.end()) + retVal = true; + return retVal; +} + void ServerGame::AddComputerPlayer(boost::shared_ptr player) { diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index 49ff3fcd..be5f5c3f 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -316,12 +316,13 @@ ServerGameStateInit::NotifyGameAdminChanged(boost::shared_ptr server void ServerGameStateInit::HandleNewSession(boost::shared_ptr server, SessionWrapper session) { - if (session.sessionData.get() && session.playerData.get()) + if (session.sessionData && session.playerData) { size_t curNumPlayers = server->GetCurNumberOfPlayers(); + const GameData &tmpGameData = server->GetGameData(); // Check the number of players. - if (curNumPlayers >= (size_t)server->GetGameData().maxNumberOfPlayers) + if (curNumPlayers >= (size_t)tmpGameData.maxNumberOfPlayers) { server->MoveSessionToLobby(session, NTF_NET_REMOVED_GAME_FULL); } @@ -477,7 +478,12 @@ ServerGameStateInit::InternalProcessPacket(boost::shared_ptr server, bool requestSent = server->GetLobbyThread().SendToLobbyPlayer(netInvite->playerId, packet); server->SendToAllPlayers(packet, SessionData::Game); - if (!requestSent) + if (requestSent) + { + // This player has been invited. + server->AddPlayerInvitation(netInvite->playerId); + } + else { // Player is not in lobby - send reject message. boost::shared_ptr p2(new NetPacket(NetPacket::Alloc)); diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 66d61710..cd9799ba 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -933,6 +933,8 @@ ServerLobbyThread::HandlePacket(SessionWrapper session, boost::shared_ptrGetMsg()->present == PokerTHMessage_PR_chatRequestMessage) HandleNetPacketChatRequest(session, packet->GetMsg()->choice.chatRequestMessage); + else if (packet->GetMsg()->present == PokerTHMessage_PR_rejectGameInvitationMessage) + HandleNetPacketRejectGameInvitation(session, packet->GetMsg()->choice.rejectGameInvitationMessage); else SessionError(session, ERR_SOCK_INVALID_STATE); } @@ -1318,6 +1320,12 @@ ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const std::st SendJoinGameFailed(session.sessionData, NTF_NET_JOIN_GUEST_FORBIDDEN); joinGame = false; } + else if (tmpData.gameType == GAME_TYPE_INVITE_ONLY + && !game.IsPlayerInvited(session.playerData->GetUniqueId())) + { + SendJoinGameFailed(session.sessionData, NTF_NET_JOIN_NOT_INVITED); + joinGame = false; + } else if (!game.CheckPassword(password)) { SendJoinGameFailed(session.sessionData, NTF_NET_JOIN_INVALID_PASSWORD); @@ -1328,8 +1336,7 @@ ServerLobbyThread::HandleNetPacketJoinGame(SessionWrapper session, const std::st } else { - // TODO do not remove session - SessionError(session, ERR_NET_UNKNOWN_GAME); + SendJoinGameFailed(session.sessionData, NTF_NET_JOIN_GAME_INVALID); } } @@ -1366,6 +1373,28 @@ ServerLobbyThread::HandleNetPacketChatRequest(SessionWrapper session, const Chat } } +void +ServerLobbyThread::HandleNetPacketRejectGameInvitation(SessionWrapper session, const RejectGameInvitationMessage_t &reject) +{ + GameMap::iterator pos = m_gameMap.find(reject.gameId); + + if (pos != m_gameMap.end() && session.playerData) + { + ServerGame &game = *pos->second; + if (game.IsPlayerInvited(session.playerData->GetUniqueId())) + { + boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); + packet->GetMsg()->present = PokerTHMessage_PR_rejectInvNotifyMessage; + RejectInvNotifyMessage_t *netReject = &packet->GetMsg()->choice.rejectInvNotifyMessage; + netReject->gameId = reject.gameId; + netReject->playerId = session.playerData->GetUniqueId(); + netReject->playerRejectReason = reject.myRejectReason; + + game.SendToAllPlayers(packet, SessionData::Game); + } + } +} + void ServerLobbyThread::AuthChallenge(SessionWrapper session, const string &secret) { diff --git a/src/net/servergame.h b/src/net/servergame.h index 1ac1f46d..9f3d8151 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -78,6 +78,10 @@ public: unsigned GetAdminPlayerId() const; void SetAdminPlayerId(unsigned playerId); + void AddPlayerInvitation(unsigned playerId); + void RemovePlayerInvitation(unsigned playerId); + bool IsPlayerInvited(unsigned playerId) const; + // should be protected, but is needed in function. const Game &GetGame() const; Game &GetGame(); @@ -141,6 +145,9 @@ private: PlayerDataList m_computerPlayerList; mutable boost::mutex m_computerPlayerListMutex; + PlayerIdList m_playerInvitationList; + mutable boost::mutex m_playerInvitationListMutex; + unsigned m_adminPlayerId; boost::shared_ptr m_voteKickData; diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index a2f96467..892677e2 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -140,6 +140,7 @@ protected: void HandleNetPacketCreateGame(SessionWrapper session, const std::string &password, const JoinNewGame_t &newGame); void HandleNetPacketJoinGame(SessionWrapper session, const std::string &password, const JoinExistingGame_t &joinGame); void HandleNetPacketChatRequest(SessionWrapper session, const ChatRequestMessage_t &chatRequest); + void HandleNetPacketRejectGameInvitation(SessionWrapper session, const RejectGameInvitationMessage_t &reject); void AuthChallenge(SessionWrapper session, const std::string &secret); void InitAfterLogin(SessionWrapper session); void EstablishSession(SessionWrapper session);