From 36445a00e7b901bb513393c0883e9b95964ae109 Mon Sep 17 00:00:00 2001 From: lotodore Date: Fri, 24 Dec 2010 16:46:49 +0000 Subject: [PATCH] Support report bad avatar function on server side. --- src/db/common/serverdbgeneric.cpp | 6 ++++++ src/db/serverdbcallback.h | 3 +++ src/db/serverdbgeneric.h | 2 ++ src/db/serverdbinterface.h | 2 ++ src/db/serverdbnoaction.h | 2 ++ src/net/common/servergamestate.cpp | 24 +++++++++++++++++++++++ src/net/common/serverlobbythread.cpp | 29 +++++++++++++++++++++++++++- src/net/serverlobbythread.h | 1 + 8 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/db/common/serverdbgeneric.cpp b/src/db/common/serverdbgeneric.cpp index 246205fa..e327c495 100644 --- a/src/db/common/serverdbgeneric.cpp +++ b/src/db/common/serverdbgeneric.cpp @@ -79,3 +79,9 @@ void ServerDBGeneric::EndGame(DB_id /*gameId*/) { } + +void +ServerDBGeneric::AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id /*reportedPlayerId*/, const std::string &/*avatarHash*/, DB_id */*byPlayerId*/) +{ + m_ioService->post(boost::bind(&ServerDBCallback::ReportAvatarFailed, &m_callback, requestId, replyId)); +} diff --git a/src/db/serverdbcallback.h b/src/db/serverdbcallback.h index e19e8d2d..ef3bba0b 100644 --- a/src/db/serverdbcallback.h +++ b/src/db/serverdbcallback.h @@ -42,6 +42,9 @@ public: virtual void CreateGameSuccess(unsigned requestId, DB_id gameId) = 0; virtual void CreateGameFailed(unsigned requestId) = 0; + + virtual void ReportAvatarSuccess(unsigned requestId, unsigned replyId) = 0; + virtual void ReportAvatarFailed(unsigned requestId, unsigned replyId) = 0; }; #endif diff --git a/src/db/serverdbgeneric.h b/src/db/serverdbgeneric.h index 3fa598ec..4a0a64fa 100644 --- a/src/db/serverdbgeneric.h +++ b/src/db/serverdbgeneric.h @@ -46,6 +46,8 @@ public: virtual void SetGamePlayerPlace(DB_id gameId, DB_id playerId, unsigned place); virtual void EndGame(DB_id gameId); + virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, DB_id *byPlayerId); + private: boost::shared_ptr m_ioService; ServerDBCallback &m_callback; diff --git a/src/db/serverdbinterface.h b/src/db/serverdbinterface.h index ddced5fc..0abce9a5 100644 --- a/src/db/serverdbinterface.h +++ b/src/db/serverdbinterface.h @@ -45,6 +45,8 @@ public: virtual void AsyncCreateGame(unsigned requestId, const std::string &gameName) = 0; virtual void SetGamePlayerPlace(DB_id gameId, DB_id playerId, unsigned place) = 0; virtual void EndGame(DB_id gameId) = 0; + + virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, DB_id *byPlayerId) = 0; }; #endif diff --git a/src/db/serverdbnoaction.h b/src/db/serverdbnoaction.h index 28e68685..47accaaf 100644 --- a/src/db/serverdbnoaction.h +++ b/src/db/serverdbnoaction.h @@ -43,6 +43,8 @@ public: virtual void AsyncCreateGame(unsigned /*requestId*/, const std::string &/*gameName*/) {} virtual void SetGamePlayerPlace(DB_id /*gameId*/, DB_id /*playerId*/, unsigned /*place*/) {} virtual void EndGame(DB_id /*gameId*/) {} + + virtual void AsyncReportAvatar(unsigned /*requestId*/, unsigned /*replyId*/, DB_id /*reportedPlayerId*/, const std::string &/*avatarHash*/, DB_id */*byPlayerId*/) {} }; #endif // _SERVERDBNOACTION_H_ diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index e8cd4666..c3502953 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -307,6 +307,30 @@ AbstractServerGameStateReceiving::ProcessPacket(boost::shared_ptr se else if (packet->GetMsg()->present == PokerTHMessage_PR_reportAvatarMessage) { ReportAvatarMessage_t *netReport = &packet->GetMsg()->choice.reportAvatarMessage; + boost::shared_ptr tmpPlayer = server->GetPlayerDataByUniqueId(netReport->reportedPlayerId); + MD5Buf tmpMD5; + 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 + ); + } + 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_avatarReportInvalid; + server->GetLobbyThread().GetSender().Send(session.sessionData, packet); + } } else { diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 09a93fc4..f514c12f 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -157,6 +157,16 @@ public: LOG_ERROR("DB create game failed for request " << requestId); } + virtual void ReportAvatarSuccess(unsigned requestId, unsigned replyId) + { + m_server.SendReportAvatarResult(requestId, replyId, true); + } + + virtual void ReportAvatarFailed(unsigned requestId, unsigned replyId) + { + m_server.SendReportAvatarResult(requestId, replyId, false); + } + private: ServerLobbyThread &m_server; }; @@ -1623,6 +1633,23 @@ ServerLobbyThread::UserInvalid(unsigned playerId) SessionError(m_sessionManager.GetSessionByUniquePlayerId(playerId, true), ERR_NET_INVALID_PASSWORD); } +void +ServerLobbyThread::SendReportAvatarResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success) +{ + SessionWrapper session = m_sessionManager.GetSessionByUniquePlayerId(byPlayerId); + if (!session.sessionData) + session = m_gameSessionManager.GetSessionByUniquePlayerId(byPlayerId); + if (session.sessionData) + { + boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); + packet->GetMsg()->present = PokerTHMessage_PR_reportAvatarAckMessage; + ReportAvatarAckMessage_t *netReportAck = &packet->GetMsg()->choice.reportAvatarAckMessage; + netReportAck->reportedPlayerId = reportedPlayerId; + netReportAck->reportResult = success ? reportResult_avatarReportAccepted : reportResult_avatarReportInvalid; + GetSender().Send(session.sessionData, packet); + } +} + void ServerLobbyThread::UserBlocked(unsigned playerId) { @@ -1632,7 +1659,7 @@ ServerLobbyThread::UserBlocked(unsigned playerId) void ServerLobbyThread::RequestPlayerAvatar(SessionWrapper session) { - if (!session.playerData.get()) + if (!session.playerData) throw ServerException(__FILE__, __LINE__, ERR_NET_INVALID_SESSION, 0); // Ask the client to send its avatar. boost::shared_ptr packet(new NetPacket(NetPacket::Alloc)); diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 698bd9e4..2e70dc16 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -149,6 +149,7 @@ protected: void UserValid(unsigned playerId, const DBPlayerData &dbPlayerData); void UserInvalid(unsigned playerId); void UserBlocked(unsigned playerId); + void SendReportAvatarResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success); void RequestPlayerAvatar(SessionWrapper session); void TimerRemoveGame(const boost::system::error_code &ec); void TimerRemovePlayer(const boost::system::error_code &ec);