diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index ef9e639a..7044bea3 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -644,6 +644,24 @@ ServerGame::IsPlayerInvited(unsigned playerId) const return retVal; } +void +ServerGame::AddReportedAvatar(unsigned playerId) +{ + boost::mutex::scoped_lock lock(m_reportedAvatarListMutex); + m_reportedAvatarList.push_back(playerId); +} + +bool +ServerGame::IsAvatarReported(unsigned playerId) const +{ + bool retVal = false; + boost::mutex::scoped_lock lock(m_reportedAvatarListMutex); + PlayerIdList::const_iterator pos = find(m_reportedAvatarList.begin(), m_reportedAvatarList.end(), playerId); + if (pos != m_reportedAvatarList.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 c3502953..94ec7501 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -312,15 +312,32 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se memcpy(tmpMD5.GetData(), netReport->reportedAvatar.buf, MD5_DATA_SIZE); if (tmpPlayer && tmpPlayer->GetDBId() && tmpPlayer->GetAvatarMD5() == tmpMD5) { - DB_id myDBid = session.playerData->GetDBId(); - // Do not use the "game" database object, but the global one. - server->GetLobbyThread().GetDatabase()->AsyncReportAvatar( - session.playerData->GetUniqueId(), - tmpPlayer->GetUniqueId(), - tmpPlayer->GetDBId(), - tmpPlayer->GetAvatarMD5().ToString(), - myDBid != 0 ? &myDBid : NULL - ); + if (!server->IsAvatarReported(tmpPlayer->GetUniqueId())) + { + // Temporarily note that this avatar was reported. + // This prevents spamming of the avatar report. + server->AddReportedAvatar(tmpPlayer->GetUniqueId()); + DB_id myDBid = session.playerData->GetDBId(); + // Do not use the "game" database object, but the global one. + // The entry should be created even if we are not running a + // ranking game. + server->GetLobbyThread().GetDatabase()->AsyncReportAvatar( + session.playerData->GetUniqueId(), + tmpPlayer->GetUniqueId(), + tmpPlayer->GetDBId(), + tmpPlayer->GetAvatarMD5().ToString(), + myDBid != 0 ? &myDBid : NULL + ); + } + else + { + boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); + packet->GetMsg()->present = PokerTHMessage_PR_reportAvatarAckMessage; + ReportAvatarAckMessage_t *netReportAck = &packet->GetMsg()->choice.reportAvatarAckMessage; + netReportAck->reportedPlayerId = netReport->reportedPlayerId; + netReportAck->reportResult = reportResult_avatarReportDuplicate; + server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + } } else { diff --git a/src/net/servergame.h b/src/net/servergame.h index 89e4ad5a..22658a2d 100644 --- a/src/net/servergame.h +++ b/src/net/servergame.h @@ -87,6 +87,9 @@ public: void RemovePlayerInvitation(unsigned playerId); bool IsPlayerInvited(unsigned playerId) const; + void AddReportedAvatar(unsigned playerId); + bool IsAvatarReported(unsigned playerId) const; + unsigned GetSmallDelaySec() const; // should be protected, but is needed in function. @@ -168,6 +171,9 @@ private: PlayerIdList m_playerInvitationList; mutable boost::mutex m_playerInvitationListMutex; + PlayerIdList m_reportedAvatarList; + mutable boost::mutex m_reportedAvatarListMutex; + RankingMap m_rankingMap; unsigned m_adminPlayerId;