Preparing admin functions in PokerTH client.

This commit is contained in:
lotodore
2013-02-24 16:22:51 +01:00
parent 6d85adf7e2
commit 883ccdcf44
13 changed files with 77 additions and 15 deletions
+7 -3
View File
@@ -35,6 +35,8 @@
#include <db/dbdefs.h> #include <db/dbdefs.h>
#include <string> #include <string>
#include <list>
#include <boost/shared_ptr.hpp>
// Callback operations are posted using the io service, // Callback operations are posted using the io service,
// and will therefore be executed in the io service thread. // and will therefore be executed in the io service thread.
@@ -44,11 +46,11 @@ public:
virtual ~ServerDBCallback(); virtual ~ServerDBCallback();
virtual void ConnectSuccess() = 0; virtual void ConnectSuccess() = 0;
virtual void ConnectFailed(const std::string &error) = 0; virtual void ConnectFailed(std::string error) = 0;
virtual void QueryError(const std::string &error) = 0; virtual void QueryError(std::string error) = 0;
virtual void PlayerLoginSuccess(unsigned requestId, const DBPlayerData &dbPlayerData) = 0; virtual void PlayerLoginSuccess(unsigned requestId, boost::shared_ptr<DBPlayerData> dbPlayerData) = 0;
virtual void PlayerLoginFailed(unsigned requestId) = 0; virtual void PlayerLoginFailed(unsigned requestId) = 0;
virtual void PlayerLoginBlocked(unsigned requestId) = 0; virtual void PlayerLoginBlocked(unsigned requestId) = 0;
@@ -63,6 +65,8 @@ public:
virtual void ReportGameSuccess(unsigned requestId, unsigned replyId) = 0; virtual void ReportGameSuccess(unsigned requestId, unsigned replyId) = 0;
virtual void ReportGameFailed(unsigned requestId, unsigned replyId) = 0; virtual void ReportGameFailed(unsigned requestId, unsigned replyId) = 0;
virtual void PlayerAdminList(unsigned requestId, std::list<DB_id> adminList) = 0;
}; };
#endif #endif
+3
View File
@@ -62,6 +62,9 @@ public:
virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, const std::string &avatarType, DB_id *byPlayerId); virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, const std::string &avatarType, DB_id *byPlayerId);
virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId); virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId);
virtual void AsyncQueryAdminPlayers(unsigned requestId);
virtual void AsyncBlockPlayer(unsigned requestId, DB_id playerId, int valid, int active);
private: private:
boost::shared_ptr<boost::asio::io_service> m_ioService; boost::shared_ptr<boost::asio::io_service> m_ioService;
ServerDBCallback &m_callback; ServerDBCallback &m_callback;
+3
View File
@@ -61,6 +61,9 @@ public:
virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, const std::string &avatarType, DB_id *byPlayerId) = 0; virtual void AsyncReportAvatar(unsigned requestId, unsigned replyId, DB_id reportedPlayerId, const std::string &avatarHash, const std::string &avatarType, DB_id *byPlayerId) = 0;
virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId) = 0; virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId) = 0;
virtual void AsyncQueryAdminPlayers(unsigned requestId) = 0;
virtual void AsyncBlockPlayer(unsigned requestId, DB_id playerId, int valid, int active) = 0;
}; };
#endif #endif
+3
View File
@@ -59,6 +59,9 @@ public:
virtual void AsyncReportAvatar(unsigned /*requestId*/, unsigned /*replyId*/, DB_id /*reportedPlayerId*/, const std::string &/*avatarHash*/, const std::string &/*avatarType*/, DB_id * /*byPlayerId*/) {} virtual void AsyncReportAvatar(unsigned /*requestId*/, unsigned /*replyId*/, DB_id /*reportedPlayerId*/, const std::string &/*avatarHash*/, const std::string &/*avatarType*/, DB_id * /*byPlayerId*/) {}
virtual void AsyncReportGame(unsigned /*requestId*/, unsigned /*replyId*/, DB_id * /*creatorPlayerId*/, unsigned /*gameId*/, const std::string &/*gameName*/, DB_id * /*byPlayerId*/) {} virtual void AsyncReportGame(unsigned /*requestId*/, unsigned /*replyId*/, DB_id * /*creatorPlayerId*/, unsigned /*gameId*/, const std::string &/*gameName*/, DB_id * /*byPlayerId*/) {}
virtual void AsyncQueryAdminPlayers(unsigned /*requestId*/) {}
virtual void AsyncBlockPlayer(unsigned /*requestId*/, DB_id /*playerId*/, int /*valid*/, int /*active*/) {}
}; };
#endif // _SERVERDBNOACTION_H_ #endif // _SERVERDBNOACTION_H_
@@ -2179,7 +2179,7 @@ void gameLobbyDialogImpl::reportBadGameName()
{ {
assert(mySession); assert(mySession);
if (myGameListSelectionModel->hasSelection()) { if (myGameListSelectionModel->hasSelection()) {
unsigned gameId = selection->selectedRows().first().data(Qt::UserRole).toUInt(); unsigned gameId = myGameListSelectionModel->selectedRows().first().data(Qt::UserRole).toUInt();
GameInfo info(mySession->getClientGameInfo(gameId)); GameInfo info(mySession->getClientGameInfo(gameId));
int ret = MyMessageBox::question(this, tr("PokerTH - Question"), int ret = MyMessageBox::question(this, tr("PokerTH - Question"),
@@ -2196,14 +2196,14 @@ void gameLobbyDialogImpl::adminActionCloseGame()
{ {
assert(mySession); assert(mySession);
if (myGameListSelectionModel->hasSelection()) { if (myGameListSelectionModel->hasSelection()) {
unsigned gameId = selection->selectedRows().first().data(Qt::UserRole).toUInt(); unsigned gameId = myGameListSelectionModel->selectedRows().first().data(Qt::UserRole).toUInt();
GameInfo info(mySession->getClientGameInfo(gameId)); GameInfo info(mySession->getClientGameInfo(gameId));
int ret = MyMessageBox::question(this, tr("PokerTH - Question"), 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); 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) { if(ret == QMessageBox::Yes) {
mySession->adminActionCloseGame(gameId); //TODO mySession->adminActionCloseGame(gameId);
} }
} }
} }
@@ -2212,14 +2212,14 @@ void gameLobbyDialogImpl::adminActionTotalKickBan()
{ {
assert(mySession); assert(mySession);
if (myNickListSelectionModel->hasSelection()) { if (myNickListSelectionModel->hasSelection()) {
unsigned playerId = selection->selectedRows().first().data(Qt::UserRole).toUInt(); unsigned playerId = myGameListSelectionModel->selectedRows().first().data(Qt::UserRole).toUInt();
PlayerInfo info(mySession->getClientPlayerInfo(playerId)); PlayerInfo info(mySession->getClientPlayerInfo(playerId));
int ret = MyMessageBox::question(this, tr("PokerTH - Question"), int ret = MyMessageBox::question(this, tr("PokerTH - Question"),
tr("Are you sure you want to total kickban the player: \"%1\"?").arg(QString::fromUtf8(info.playerName.c_str())), QMessageBox::Yes | QMessageBox::No); tr("Are you sure you want to total kickban the player: \"%1\"?").arg(QString::fromUtf8(info.playerName.c_str())), QMessageBox::Yes | QMessageBox::No);
if(ret == QMessageBox::Yes) { if(ret == QMessageBox::Yes) {
mySession->adminActionTotalKickBan(playerId); // TODO mySession->adminActionTotalKickBan(playerId);
} }
} }
} }
+1
View File
@@ -549,6 +549,7 @@ AbstractClientStateReceiving::HandlePacket(boost::shared_ptr<ClientThread> clien
tmpInfo.playerName = netInfo.playername(); tmpInfo.playerName = netInfo.playername();
tmpInfo.ptype = netInfo.ishuman() ? PLAYER_TYPE_HUMAN : PLAYER_TYPE_COMPUTER; tmpInfo.ptype = netInfo.ishuman() ? PLAYER_TYPE_HUMAN : PLAYER_TYPE_COMPUTER;
tmpInfo.isGuest = netInfo.playerrights() == netPlayerRightsGuest; tmpInfo.isGuest = netInfo.playerrights() == netPlayerRightsGuest;
tmpInfo.isAdmin = netInfo.playerrights() == netPlayerRightsAdmin;
if (netInfo.has_countrycode()) { if (netInfo.has_countrycode()) {
tmpInfo.countryCode = netInfo.countrycode(); tmpInfo.countryCode = netInfo.countrycode();
} }
+1 -1
View File
@@ -52,7 +52,7 @@ NetPacket::~NetPacket()
} }
boost::shared_ptr<NetPacket> boost::shared_ptr<NetPacket>
NetPacket::Create(char *data, size_t dataSize) NetPacket::Create(const char *data, size_t dataSize)
{ {
boost::shared_ptr<NetPacket> tmpPacket; boost::shared_ptr<NetPacket> tmpPacket;
+24
View File
@@ -30,6 +30,7 @@
*****************************************************************************/ *****************************************************************************/
#include <net/serverbanmanager.h> #include <net/serverbanmanager.h>
#include <algorithm>
using namespace std; using namespace std;
@@ -43,6 +44,15 @@ ServerBanManager::~ServerBanManager()
{ {
} }
void
ServerBanManager::SetAdminPlayerIds(const std::list<DB_id> adminList)
{
boost::mutex::scoped_lock lock(m_banMutex);
m_adminPlayers.resize(adminList.size());
copy(adminList.begin(), adminList.end(), m_adminPlayers.begin());
sort(m_adminPlayers.begin(), m_adminPlayers.end());
}
void void
ServerBanManager::BanPlayerName(const std::string &playerName, unsigned durationHours) ServerBanManager::BanPlayerName(const std::string &playerName, unsigned durationHours)
{ {
@@ -140,6 +150,20 @@ ServerBanManager::ClearBanList()
m_banIPAddressMap.clear(); m_banIPAddressMap.clear();
} }
bool
ServerBanManager::IsAdminPlayer(DB_id playerId) const
{
bool retVal = false;
if (playerId != DB_ID_INVALID) {
boost::mutex::scoped_lock lock(m_banMutex);
if (binary_search(m_adminPlayers.begin(), m_adminPlayers.end(), playerId)) {
retVal = true;
}
}
return retVal;
}
bool bool
ServerBanManager::IsPlayerBanned(const std::string &name) const ServerBanManager::IsPlayerBanned(const std::string &name) const
{ {
+13 -4
View File
@@ -146,16 +146,16 @@ public:
LOG_MSG("Successfully connected to database."); LOG_MSG("Successfully connected to database.");
} }
virtual void ConnectFailed(const string &error) { virtual void ConnectFailed(string error) {
LOG_ERROR("DB connect error: " << error); LOG_ERROR("DB connect error: " << error);
} }
virtual void QueryError(const std::string &error) { virtual void QueryError(string error) {
LOG_ERROR("DB query error: " << error); LOG_ERROR("DB query error: " << error);
} }
virtual void PlayerLoginSuccess(unsigned requestId, const DBPlayerData &dbPlayerData) { virtual void PlayerLoginSuccess(unsigned requestId, boost::shared_ptr<DBPlayerData> dbPlayerData) {
m_server.UserValid(requestId, dbPlayerData); m_server.UserValid(requestId, *dbPlayerData);
} }
virtual void PlayerLoginFailed(unsigned requestId) { virtual void PlayerLoginFailed(unsigned requestId) {
@@ -199,6 +199,10 @@ public:
m_server.SendReportGameResult(requestId, replyId, false); m_server.SendReportGameResult(requestId, replyId, false);
} }
virtual void PlayerAdminList(unsigned requestId, std::list<DB_id> adminList) {
m_server.GetBanManager().SetAdminPlayerIds(adminList);
}
private: private:
ServerLobbyThread &m_server; ServerLobbyThread &m_server;
}; };
@@ -242,6 +246,7 @@ ServerLobbyThread::Init(const string &logDir)
m_serverConfig.readConfigString("DBServerPassword"), m_serverConfig.readConfigString("DBServerPassword"),
m_serverConfig.readConfigString("DBServerDatabaseName"), m_serverConfig.readConfigString("DBServerDatabaseName"),
m_serverConfig.readConfigString("DBServerEncryptionKey")); m_serverConfig.readConfigString("DBServerEncryptionKey"));
m_database->AsyncQueryAdminPlayers(0);
GetBanManager().InitGameNameBadWordList(m_serverConfig.readConfigStringList("GameNameBadWordList")); GetBanManager().InitGameNameBadWordList(m_serverConfig.readConfigStringList("GameNameBadWordList"));
} }
@@ -1074,6 +1079,10 @@ ServerLobbyThread::HandleNetPacketAuthClientResponse(boost::shared_ptr<SessionDa
GetSender().Send(session, packet); GetSender().Send(session, packet);
// The last message is only for server verification. // The last message is only for server verification.
// We are done now, the user has logged in. // We are done now, the user has logged in.
boost::shared_ptr<PlayerData> tmpPlayerData = session->GetPlayerData();
if (GetBanManager().IsAdminPlayer(tmpPlayerData->GetDBId())) {
session->GetPlayerData()->SetRights(PLAYER_RIGHTS_ADMIN);
}
CheckAvatarBlacklist(session); CheckAvatarBlacklist(session);
} else } else
SessionError(session, ERR_NET_INVALID_PASSWORD); SessionError(session, ERR_NET_INVALID_PASSWORD);
+1 -1
View File
@@ -63,7 +63,7 @@ public:
NetPacket(PokerTHMessage *msg); NetPacket(PokerTHMessage *msg);
~NetPacket(); ~NetPacket();
static boost::shared_ptr<NetPacket> Create(char *data, size_t dataSize); static boost::shared_ptr<NetPacket> Create(const char *data, size_t dataSize);
const PokerTHMessage *GetMsg() const { const PokerTHMessage *GetMsg() const {
return m_msg; return m_msg;
+6
View File
@@ -33,6 +33,7 @@
#ifndef _SERVERBANMANAGER_H_ #ifndef _SERVERBANMANAGER_H_
#define _SERVERBANMANAGER_H_ #define _SERVERBANMANAGER_H_
#include <db/dbdefs.h>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
@@ -47,6 +48,8 @@ public:
ServerBanManager(boost::shared_ptr<boost::asio::io_service> ioService); ServerBanManager(boost::shared_ptr<boost::asio::io_service> ioService);
virtual ~ServerBanManager(); virtual ~ServerBanManager();
void SetAdminPlayerIds(const std::list<DB_id> adminList);
void BanPlayerName(const std::string &playerName, unsigned durationHours = 0); void BanPlayerName(const std::string &playerName, unsigned durationHours = 0);
void BanPlayerRegex(const std::string &playerRegex, unsigned durationHours = 0); void BanPlayerRegex(const std::string &playerRegex, unsigned durationHours = 0);
void BanIPAddress(const std::string &ipAddress, unsigned durationHours); void BanIPAddress(const std::string &ipAddress, unsigned durationHours);
@@ -54,6 +57,7 @@ public:
void GetBanList(std::list<std::string> &list) const; void GetBanList(std::list<std::string> &list) const;
void ClearBanList(); void ClearBanList();
bool IsAdminPlayer(DB_id playerId) const;
bool IsPlayerBanned(const std::string &name) const; bool IsPlayerBanned(const std::string &name) const;
bool IsIPAddressBanned(const std::string &ipAddress) const; bool IsIPAddressBanned(const std::string &ipAddress) const;
@@ -75,6 +79,7 @@ protected:
typedef std::map<unsigned, TimedPlayerBan> RegexMap; typedef std::map<unsigned, TimedPlayerBan> RegexMap;
typedef std::map<unsigned, TimedIPBan> IPAddressMap; typedef std::map<unsigned, TimedIPBan> IPAddressMap;
typedef std::list<boost::regex> RegexList; typedef std::list<boost::regex> RegexList;
typedef std::vector<DB_id> DBPlayerIdList;
boost::shared_ptr<boost::asio::deadline_timer> InternalRegisterTimedBan(unsigned timerId, unsigned durationHours); boost::shared_ptr<boost::asio::deadline_timer> InternalRegisterTimedBan(unsigned timerId, unsigned durationHours);
void TimerRemoveBan(const boost::system::error_code &ec, unsigned banId, boost::shared_ptr<boost::asio::deadline_timer> timer); void TimerRemoveBan(const boost::system::error_code &ec, unsigned banId, boost::shared_ptr<boost::asio::deadline_timer> timer);
@@ -87,6 +92,7 @@ private:
RegexMap m_banPlayerNameMap; RegexMap m_banPlayerNameMap;
RegexList m_gameNameBadWordFilter; RegexList m_gameNameBadWordFilter;
IPAddressMap m_banIPAddressMap; IPAddressMap m_banIPAddressMap;
DBPlayerIdList m_adminPlayers;
unsigned m_curBanId; unsigned m_curBanId;
mutable boost::mutex m_banMutex; mutable boost::mutex m_banMutex;
}; };
+7
View File
@@ -137,6 +137,13 @@ PlayerData::GetRights() const
return m_rights; return m_rights;
} }
void
PlayerData::SetRights(PlayerRights rights)
{
boost::mutex::scoped_lock lock(m_dataMutex);
m_rights = rights;
}
bool bool
PlayerData::IsGameAdmin() const PlayerData::IsGameAdmin() const
{ {
+3 -1
View File
@@ -70,10 +70,11 @@ struct AvatarFile {
}; };
struct PlayerInfo { struct PlayerInfo {
PlayerInfo() : ptype(PLAYER_TYPE_HUMAN), isGuest(false), hasAvatar(false), avatarType(AVATAR_FILE_TYPE_UNKNOWN) {} PlayerInfo() : ptype(PLAYER_TYPE_HUMAN), isGuest(false), isAdmin(false), hasAvatar(false), avatarType(AVATAR_FILE_TYPE_UNKNOWN) {}
std::string playerName; std::string playerName;
PlayerType ptype; PlayerType ptype;
bool isGuest; bool isGuest;
bool isAdmin;
std::string countryCode; std::string countryCode;
bool hasAvatar; bool hasAvatar;
MD5Buf avatar; MD5Buf avatar;
@@ -100,6 +101,7 @@ public:
PlayerType GetType() const; PlayerType GetType() const;
void SetType(PlayerType type); void SetType(PlayerType type);
PlayerRights GetRights() const; PlayerRights GetRights() const;
void SetRights(PlayerRights rights);
bool IsGameAdmin() const; bool IsGameAdmin() const;
void SetGameAdmin(bool isAdmin); void SetGameAdmin(bool isAdmin);
unsigned GetUniqueId() const; unsigned GetUniqueId() const;