diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp index df7346a2..d54aefab 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp @@ -2202,8 +2202,8 @@ void gameLobbyDialogImpl::adminActionCloseGame() int ret = MyMessageBox::question(this, tr("PokerTH - Question"), tr("Are you sure you want to close the game:\n\"%1\"?").arg(QString::fromUtf8(info.name.c_str())), QMessageBox::Yes | QMessageBox::No); - if(ret == QMessageBox::Yes) { - //TODO mySession->adminActionCloseGame(gameId); + if (ret == QMessageBox::Yes) { + mySession->adminActionCloseGame(gameId); } } } diff --git a/src/net/clientthread.h b/src/net/clientthread.h index d2f70b22..844a37f2 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -98,6 +98,7 @@ public: void SendRejectGameInvitation(unsigned gameId, DenyGameInvitationReason reason); void SendReportAvatar(unsigned reportedPlayerId, const std::string &avatarHash); void SendReportGameName(unsigned reportedGameId); + void SendAdminRemoveGame(unsigned removeGameId); void StartAsyncRead(); virtual void CloseSession(boost::shared_ptr session); diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index e483f529..c4b4423b 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -376,6 +376,16 @@ ClientThread::SendReportGameName(unsigned reportedGameId) m_ioService->post(boost::bind(&ClientThread::SendSessionPacket, shared_from_this(), packet)); } +void +ClientThread::SendAdminRemoveGame(unsigned removeGameId) +{ + boost::shared_ptr packet(new NetPacket); + packet->GetMsg()->set_messagetype(PokerTHMessage::Type_AdminRemoveGameMessage); + AdminRemoveGameMessage *netRemove = packet->GetMsg()->mutable_adminremovegamemessage(); + netRemove->set_removegameid(removeGameId); + m_ioService->post(boost::bind(&ClientThread::SendSessionPacket, shared_from_this(), packet)); +} + void ClientThread::StartAsyncRead() { diff --git a/src/net/common/netpacketvalidator.cpp b/src/net/common/netpacketvalidator.cpp index 499aa24c..8c26140b 100644 --- a/src/net/common/netpacketvalidator.cpp +++ b/src/net/common/netpacketvalidator.cpp @@ -128,6 +128,8 @@ NetPacketValidator::NetPacketValidator() m_validationMap.insert(make_pair(PokerTHMessage_PokerTHMessageType_Type_ReportGameMessage, ValidateReportGameMessage)); m_validationMap.insert(make_pair(PokerTHMessage_PokerTHMessageType_Type_ReportGameAckMessage, ValidateReportGameAckMessage)); m_validationMap.insert(make_pair(PokerTHMessage_PokerTHMessageType_Type_ErrorMessage, ValidateErrorMessage)); + m_validationMap.insert(make_pair(PokerTHMessage_PokerTHMessageType_Type_AdminRemoveGameMessage, ValidateAdminRemoveGameMessage)); + m_validationMap.insert(make_pair(PokerTHMessage_PokerTHMessageType_Type_AdminBanPlayerMessage, ValidateAdminBanPlayerMessage)); } bool @@ -1145,6 +1147,32 @@ NetPacketValidator::ValidateErrorMessage(const NetPacket &packet) return retVal; } +bool +NetPacketValidator::ValidateAdminRemoveGameMessage(const NetPacket &packet) +{ + bool retVal = false; + if (packet.GetMsg()->has_adminremovegamemessage()) { + const AdminRemoveGameMessage &msg = packet.GetMsg()->adminremovegamemessage(); + if (msg.removegameid() != 0) { + retVal = true; + } + } + return retVal; +} + +bool +NetPacketValidator::ValidateAdminBanPlayerMessage(const NetPacket &packet) +{ + bool retVal = false; + if (packet.GetMsg()->has_adminbanplayermessage()) { + const AdminBanPlayerMessage &msg = packet.GetMsg()->adminbanplayermessage(); + if (msg.banplayerid() != 0) { + retVal = true; + } + } + return retVal; +} + bool NetPacketValidator::ValidateGameInfo(const NetGameInfo &gameInfo) { diff --git a/src/net/common/serverbanmanager.cpp b/src/net/common/serverbanmanager.cpp index c3890317..99951f21 100644 --- a/src/net/common/serverbanmanager.cpp +++ b/src/net/common/serverbanmanager.cpp @@ -45,7 +45,7 @@ ServerBanManager::~ServerBanManager() } void -ServerBanManager::SetAdminPlayerIds(const std::list adminList) +ServerBanManager::SetAdminPlayerIds(const std::list &adminList) { boost::mutex::scoped_lock lock(m_banMutex); m_adminPlayers.resize(adminList.size()); diff --git a/src/net/netpacketvalidator.h b/src/net/netpacketvalidator.h index 30338a80..ed159b3a 100644 --- a/src/net/netpacketvalidator.h +++ b/src/net/netpacketvalidator.h @@ -119,6 +119,8 @@ protected: static bool ValidateReportGameMessage(const NetPacket &packet); static bool ValidateReportGameAckMessage(const NetPacket &packet); static bool ValidateErrorMessage(const NetPacket &packet); + static bool ValidateAdminRemoveGameMessage(const NetPacket &packet); + static bool ValidateAdminBanPlayerMessage(const NetPacket &packet); static bool ValidateGameInfo(const NetGameInfo &gameInfo); diff --git a/src/net/serverbanmanager.h b/src/net/serverbanmanager.h index 5a9d7fce..22336adb 100644 --- a/src/net/serverbanmanager.h +++ b/src/net/serverbanmanager.h @@ -48,7 +48,7 @@ public: ServerBanManager(boost::shared_ptr ioService); virtual ~ServerBanManager(); - void SetAdminPlayerIds(const std::list adminList); + void SetAdminPlayerIds(const std::list &adminList); void BanPlayerName(const std::string &playerName, unsigned durationHours = 0); void BanPlayerRegex(const std::string &playerRegex, unsigned durationHours = 0); diff --git a/src/session.cpp b/src/session.cpp index 63d35a20..a6042747 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -420,6 +420,13 @@ void Session::resetNetworkTimeout() myNetClient->SendResetTimeout(); } +void Session::adminActionCloseGame(unsigned gameId) +{ + if (!myNetClient) + return; // only act if client is running. + myNetClient->SendAdminRemoveGame(gameId); +} + void Session::kickPlayer(const string &playerName) { if (!myNetClient) diff --git a/src/session.h b/src/session.h index dbdded3a..3315558f 100755 --- a/src/session.h +++ b/src/session.h @@ -116,6 +116,8 @@ public: void resetNetworkTimeout(); + void adminActionCloseGame(unsigned gameId); + bool isNetworkClientRunning() const; // TODO hack bool isNetworkServerRunning() const; // TODO hack