2014-08-05 12:37:00 -04:00
|
|
|
|
|
|
|
// RankManager.cpp
|
|
|
|
|
|
|
|
// Implements the cRankManager class that represents the rank manager responsible for assigning permissions and message visuals to players
|
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "RankManager.h"
|
2014-08-13 03:53:33 -04:00
|
|
|
#include "Protocol/MojangAPI.h"
|
2014-08-22 21:44:04 -04:00
|
|
|
#include "ClientHandle.h"
|
2014-08-05 12:37:00 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// cRankManager:
|
|
|
|
|
2014-08-05 12:37:00 -04:00
|
|
|
cRankManager::cRankManager(void) :
|
2020-05-09 10:51:15 -04:00
|
|
|
m_DB("Ranks.sqlite", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE),
|
2014-08-21 14:47:52 -04:00
|
|
|
m_IsInitialized(false),
|
2014-10-20 16:55:07 -04:00
|
|
|
m_MojangAPI(nullptr)
|
2014-08-13 03:53:33 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-21 14:47:52 -04:00
|
|
|
cRankManager::~cRankManager()
|
|
|
|
{
|
2014-10-20 16:55:07 -04:00
|
|
|
if (m_MojangAPI != nullptr)
|
2014-08-21 14:47:52 -04:00
|
|
|
{
|
2014-10-20 16:55:07 -04:00
|
|
|
m_MojangAPI->SetRankManager(nullptr);
|
2014-08-21 14:47:52 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
void cRankManager::Initialize(cMojangAPI & a_MojangAPI)
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(!m_IsInitialized); // Calling Initialize for the second time?
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-05 12:37:00 -04:00
|
|
|
// Create the DB tables, if they don't exist:
|
2014-08-08 04:02:25 -04:00
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS Rank (RankID INTEGER PRIMARY KEY, Name, MsgPrefix, MsgSuffix, MsgNameColorCode)");
|
2014-08-05 16:32:26 -04:00
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS PlayerRank (PlayerUUID, PlayerName, RankID INTEGER)");
|
2014-08-08 03:56:28 -04:00
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS PermGroup (PermGroupID INTEGER PRIMARY KEY, Name)");
|
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS RankPermGroup (RankID INTEGER, PermGroupID INTEGER)");
|
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS PermissionItem (PermGroupID INTEGER, Permission)");
|
2015-04-25 15:05:35 -04:00
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS RestrictionItem (PermGroupID INTEGER, Permission)");
|
2014-08-22 21:44:04 -04:00
|
|
|
m_DB.exec("CREATE TABLE IF NOT EXISTS DefaultRank (RankID INTEGER)");
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
m_IsInitialized = true;
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-21 14:47:52 -04:00
|
|
|
a_MojangAPI.SetRankManager(this);
|
|
|
|
|
2020-05-05 14:20:07 -04:00
|
|
|
// If tables are empty, create default ranks
|
2014-08-13 03:53:33 -04:00
|
|
|
if (AreDBTablesEmpty())
|
|
|
|
{
|
2020-05-05 14:20:07 -04:00
|
|
|
LOGINFO("Creating default ranks...");
|
2014-08-22 21:44:04 -04:00
|
|
|
CreateDefaults();
|
|
|
|
LOGINFO("Default ranks created.");
|
2014-08-13 03:53:33 -04:00
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-22 21:44:04 -04:00
|
|
|
// Load the default rank:
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT Rank.Name FROM Rank "
|
|
|
|
"LEFT JOIN DefaultRank ON Rank.RankID = DefaultRank.RankID"
|
|
|
|
);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
m_DefaultRank = stmt.getColumn(0).getText();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Cannot load default rank: %s", __FUNCTION__, ex.what());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the default rank cannot be loaded, use the first rank:
|
|
|
|
if (m_DefaultRank.empty())
|
|
|
|
{
|
|
|
|
SetDefaultRank(GetAllRanks()[0]);
|
|
|
|
}
|
2014-08-05 12:37:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString cRankManager::GetPlayerRankName(const cUUID & a_PlayerUUID)
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-08 04:02:25 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "SELECT Rank.Name FROM Rank LEFT JOIN PlayerRank ON Rank.RankID = PlayerRank.RankID WHERE PlayerRank.PlayerUUID = ?");
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(1, a_PlayerUUID.ToShortString());
|
2014-08-31 16:26:02 -04:00
|
|
|
// executeStep returns false on no data
|
|
|
|
if (!stmt.executeStep())
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
|
|
|
// No data returned from the DB
|
|
|
|
return AString();
|
|
|
|
}
|
|
|
|
return stmt.getColumn(0).getText();
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Cannot get player rank name: %s", __FUNCTION__, ex.what());
|
2014-08-05 12:37:00 -04:00
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return AString();
|
2014-08-05 12:37:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString cRankManager::GetPlayerName(const cUUID & a_PlayerUUID)
|
2014-09-27 20:17:32 -04:00
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// Prepare the DB statement:
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PlayerName FROM PlayerRank WHERE PlayerUUID = ?");
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(1, a_PlayerUUID.ToShortString());
|
2014-09-27 20:17:32 -04:00
|
|
|
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
return stmt.getColumn(0).getText();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Cannot get player name: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return AString();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AStringVector cRankManager::GetPlayerGroups(const cUUID & a_PlayerUUID)
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-05 12:37:00 -04:00
|
|
|
AStringVector res;
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-08 04:02:25 -04:00
|
|
|
// Prepare the DB statement:
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT PermGroup.Name FROM PermGroup "
|
2014-08-27 08:13:13 -04:00
|
|
|
"LEFT JOIN RankPermGroup ON PermGroup.PermGroupID = RankPermGroup.PermGroupID "
|
|
|
|
"LEFT JOIN PlayerRank ON PlayerRank.RankID = RankPermGroup.RankID "
|
2014-08-08 04:02:25 -04:00
|
|
|
"WHERE PlayerRank.PlayerUUID = ?"
|
|
|
|
);
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(1, a_PlayerUUID.ToShortString());
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Execute and get results:
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Cannot get player groups: %s", __FUNCTION__, ex.what());
|
2014-08-05 12:37:00 -04:00
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AStringVector cRankManager::GetPlayerPermissions(const cUUID & a_PlayerUUID)
|
2014-08-05 12:37:00 -04:00
|
|
|
{
|
2014-08-24 14:00:45 -04:00
|
|
|
AString Rank = GetPlayerRankName(a_PlayerUUID);
|
|
|
|
if (Rank.empty())
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
2014-08-24 14:00:45 -04:00
|
|
|
Rank = m_DefaultRank;
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
2014-08-24 14:00:45 -04:00
|
|
|
return GetRankPermissions(Rank);
|
2014-08-05 12:37:00 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AStringVector cRankManager::GetPlayerRestrictions(const cUUID & a_PlayerUUID)
|
2015-04-25 15:05:35 -04:00
|
|
|
{
|
|
|
|
AString Rank = GetPlayerRankName(a_PlayerUUID);
|
|
|
|
if (Rank.empty())
|
|
|
|
{
|
|
|
|
Rank = m_DefaultRank;
|
|
|
|
}
|
|
|
|
return GetRankRestrictions(Rank);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector cRankManager::GetRankGroups(const AString & a_RankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT PermGroup.Name FROM PermGroup "
|
|
|
|
"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermGroup.PermGroupID "
|
|
|
|
"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID "
|
|
|
|
"WHERE Rank.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get rank groups from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AStringVector cRankManager::GetGroupPermissions(const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT PermissionItem.Permission FROM PermissionItem "
|
|
|
|
"LEFT JOIN PermGroup ON PermGroup.PermGroupID = PermissionItem.PermGroupID "
|
|
|
|
"WHERE PermGroup.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get group permissions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector cRankManager::GetGroupRestrictions(const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector res;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT RestrictionItem.Permission FROM RestrictionItem "
|
|
|
|
"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RestrictionItem.PermGroupID "
|
|
|
|
"WHERE PermGroup.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get group restrictions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector cRankManager::GetRankPermissions(const AString & a_RankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT PermissionItem.Permission FROM PermissionItem "
|
|
|
|
"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermissionItem.PermGroupID "
|
|
|
|
"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID "
|
|
|
|
"WHERE Rank.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get rank permissions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector cRankManager::GetRankRestrictions(const AString & a_RankName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector res;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT RestrictionItem.Permission FROM RestrictionItem "
|
|
|
|
"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = RestrictionItem.PermGroupID "
|
|
|
|
"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID "
|
|
|
|
"WHERE Rank.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get rank restrictions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
std::vector<cUUID> cRankManager::GetAllPlayerUUIDs(void)
|
2014-09-27 20:17:32 -04:00
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
cUUID tempUUID;
|
|
|
|
std::vector<cUUID> res;
|
2014-09-27 20:17:32 -04:00
|
|
|
try
|
|
|
|
{
|
2014-09-29 16:00:14 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PlayerUUID FROM PlayerRank ORDER BY PlayerName COLLATE NOCASE");
|
2014-09-27 20:17:32 -04:00
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
2017-08-25 08:43:18 -04:00
|
|
|
if (!tempUUID.FromString(stmt.getColumn(0).getText()))
|
|
|
|
{
|
|
|
|
// Invalid UUID, ignore
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
res.push_back(tempUUID);
|
2014-09-27 20:17:32 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get players from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector cRankManager::GetAllRanks(void)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT Name FROM Rank");
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get ranks from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AStringVector cRankManager::GetAllGroups(void)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT Name FROM PermGroup");
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get groups from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AStringVector cRankManager::GetAllPermissions(void)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
AStringVector res;
|
2014-08-08 10:38:38 -04:00
|
|
|
try
|
|
|
|
{
|
2014-08-08 15:30:47 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "SELECT DISTINCT(Permission) FROM PermissionItem");
|
2014-08-08 10:38:38 -04:00
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get permissions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector cRankManager::GetAllRestrictions(void)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
AStringVector res;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT DISTINCT(Permission) FROM RestrictionItem");
|
|
|
|
while (stmt.executeStep())
|
|
|
|
{
|
|
|
|
res.push_back(stmt.getColumn(0).getText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get restrictions from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AStringVector cRankManager::GetAllPermissionsRestrictions(void)
|
|
|
|
{
|
|
|
|
AStringVector Permissions = GetAllPermissions();
|
|
|
|
AStringVector Restrictions = GetAllRestrictions();
|
|
|
|
for (auto & restriction: Restrictions)
|
|
|
|
{
|
|
|
|
Permissions.push_back(restriction);
|
|
|
|
}
|
|
|
|
return Permissions;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
bool cRankManager::GetPlayerMsgVisuals(
|
2017-08-25 08:43:18 -04:00
|
|
|
const cUUID & a_PlayerUUID,
|
2014-08-08 04:02:25 -04:00
|
|
|
AString & a_MsgPrefix,
|
|
|
|
AString & a_MsgSuffix,
|
|
|
|
AString & a_MsgNameColorCode
|
|
|
|
)
|
|
|
|
{
|
2014-08-24 14:00:45 -04:00
|
|
|
AString Rank = GetPlayerRankName(a_PlayerUUID);
|
|
|
|
if (Rank.empty())
|
2014-08-08 15:30:47 -04:00
|
|
|
{
|
2014-08-24 14:00:45 -04:00
|
|
|
// Rank not found, return failure:
|
|
|
|
a_MsgPrefix.clear();
|
|
|
|
a_MsgSuffix.clear();
|
|
|
|
a_MsgNameColorCode.clear();
|
|
|
|
return false;
|
2014-08-08 15:30:47 -04:00
|
|
|
}
|
2014-08-24 14:00:45 -04:00
|
|
|
return GetRankVisuals(Rank, a_MsgPrefix, a_MsgSuffix, a_MsgNameColorCode);
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cRankManager::AddRank(
|
|
|
|
const AString & a_RankName,
|
|
|
|
const AString & a_MsgPrefix,
|
|
|
|
const AString & a_MsgSuffix,
|
|
|
|
const AString & a_MsgNameColorCode
|
|
|
|
)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Check if such a rank name is already used:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
// Rank already exists, do nothing:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Insert a new rank:
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO Rank (Name, MsgPrefix, MsgSuffix, MsgNameColorCode) VALUES (?, ?, ?, ?)");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
stmt.bind(2, a_MsgPrefix);
|
|
|
|
stmt.bind(3, a_MsgSuffix);
|
|
|
|
stmt.bind(4, a_MsgNameColorCode);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add a new rank \"%s\".", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add a new rank \"%s\": %s", __FUNCTION__, a_RankName.c_str(), ex.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cRankManager::AddGroup(const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
2014-08-13 06:33:31 -04:00
|
|
|
// Check if such a group name is already used:
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
// Group already exists, do nothing:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 06:33:31 -04:00
|
|
|
// Insert a new group:
|
2014-08-08 04:02:25 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO PermGroup (Name) VALUES (?)");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add a new group \"%s\".", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add a new group \"%s\": %s", __FUNCTION__, a_GroupName.c_str(), ex.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 06:33:31 -04:00
|
|
|
void cRankManager::AddGroups(const AStringVector & a_GroupNames)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 06:33:31 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
for (AStringVector::const_iterator itr = a_GroupNames.begin(), end = a_GroupNames.end(); itr != end; ++itr)
|
|
|
|
{
|
|
|
|
// Check if such the group name is already used:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, *itr);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
// Group already exists, do nothing:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 06:33:31 -04:00
|
|
|
// Insert a new group:
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO PermGroup (Name) VALUES (?)");
|
|
|
|
stmt.bind(1, *itr);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add a new group \"%s\".", __FUNCTION__, itr->c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} // for itr - a_GroupNames[]
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add new groups: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
bool cRankManager::AddGroupToRank(const AString & a_GroupName, const AString & a_RankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the group's ID:
|
2014-08-13 06:33:31 -04:00
|
|
|
int GroupID;
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such group (%s), aborting.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Get the rank's ID:
|
2014-08-13 06:33:31 -04:00
|
|
|
int RankID;
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such rank (%s), aborting.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
RankID = stmt.getColumn(0);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Check if the group is already there:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM RankPermGroup WHERE RankID = ? AND PermGroupID = ?");
|
|
|
|
stmt.bind(1, RankID);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to check binding between rank %s and group %s, aborting.", __FUNCTION__, a_RankName.c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
LOGD("%s: Group %s already present in rank %s, skipping and returning success.",
|
|
|
|
__FUNCTION__, a_GroupName.c_str(), a_RankName.c_str()
|
|
|
|
);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Add the group:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO RankPermGroup (RankID, PermGroupID) VALUES (?, ?)");
|
|
|
|
stmt.bind(1, RankID);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add group %s to rank %s, aborting.", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Adding succeeded:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add group %s to rank %s: %s", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str(), ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::AddPermissionToGroup(const AString & a_Permission, const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the group's ID:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such group (%s), aborting.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Check if the permission is already present:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, a_Permission);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to check binding between permission %s and group %s, aborting.", __FUNCTION__, a_Permission.c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
LOGD("%s: Permission %s is already present in group %s, skipping and returning success.",
|
|
|
|
__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str()
|
|
|
|
);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Add the permission:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO PermissionItem (Permission, PermGroupID) VALUES (?, ?)");
|
|
|
|
stmt.bind(1, a_Permission);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add permission %s to group %s, aborting.", __FUNCTION__, a_Permission.c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Adding succeeded:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add permission %s to group %s: %s",
|
|
|
|
__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
bool cRankManager::AddRestrictionToGroup(const AString & a_Restriction, const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the group's ID:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such group (%s), aborting.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Check if the restriction is already present:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, a_Restriction);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to check binding between restriction %s and group %s, aborting.", __FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
LOGD("%s: Restriction %s is already present in group %s, skipping and returning success.",
|
|
|
|
__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str()
|
|
|
|
);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Add the restriction:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO RestrictionItem (Permission, PermGroupID) VALUES (?, ?)");
|
|
|
|
stmt.bind(1, a_Restriction);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add restriction %s to group %s, aborting.", __FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Adding succeeded:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add restriction %s to group %s: %s",
|
|
|
|
__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
bool cRankManager::AddPermissionsToGroup(const AStringVector & a_Permissions, const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the group's ID:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such group (%s), aborting.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
for (AStringVector::const_iterator itr = a_Permissions.begin(), end = a_Permissions.end(); itr != end; ++itr)
|
|
|
|
{
|
|
|
|
// Check if the permission is already present:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, *itr);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to check binding between permission %s and group %s, aborting.", __FUNCTION__, itr->c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
LOGD("%s: Permission %s is already present in group %s, skipping and returning success.",
|
|
|
|
__FUNCTION__, itr->c_str(), a_GroupName.c_str()
|
|
|
|
);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
// Add the permission:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO PermissionItem (Permission, PermGroupID) VALUES (?, ?)");
|
|
|
|
stmt.bind(1, *itr);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add permission %s to group %s, skipping.", __FUNCTION__, itr->c_str(), a_GroupName.c_str());
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // for itr - a_Permissions[]
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
// Adding succeeded:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add permissions to group %s: %s",
|
|
|
|
__FUNCTION__, a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
bool cRankManager::AddRestrictionsToGroup(const AStringVector & a_Restrictions, const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the group's ID:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: No such group (%s), aborting.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
for (auto itr = a_Restrictions.cbegin(), end = a_Restrictions.cend(); itr != end; ++itr)
|
|
|
|
{
|
|
|
|
// Check if the restriction is already present:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, *itr);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to check binding between restriction %s and group %s, aborting.", __FUNCTION__, itr->c_str(), a_GroupName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stmt.getColumn(0).getInt() > 0)
|
|
|
|
{
|
|
|
|
LOGD("%s: Restriction %s is already present in group %s, skipping and returning success.",
|
|
|
|
__FUNCTION__, itr->c_str(), a_GroupName.c_str()
|
|
|
|
);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Add the permission:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO RestrictionItem (Permission, PermGroupID) VALUES (?, ?)");
|
|
|
|
stmt.bind(1, *itr);
|
|
|
|
stmt.bind(2, GroupID);
|
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add restriction %s to group %s, skipping.", __FUNCTION__, itr->c_str(), a_GroupName.c_str());
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // for itr - a_Restrictions[]
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Adding succeeded:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to add restrictions to group %s: %s",
|
|
|
|
__FUNCTION__, a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
void cRankManager::RemoveRank(const AString & a_RankName, const AString & a_ReplacementRankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2014-08-22 21:44:04 -04:00
|
|
|
|
|
|
|
// Check if the default rank is being removed with a proper replacement:
|
|
|
|
if ((a_RankName == m_DefaultRank) && !RankExists(a_ReplacementRankName))
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Cannot remove rank %s, it is the default rank and the replacement rank doesn't exist.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
AStringVector res;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the RankID for the rank being removed:
|
|
|
|
int RemoveRankID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Rank %s was not found. Skipping.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
RemoveRankID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Get the RankID for the replacement rank:
|
|
|
|
int ReplacementRankID = -1;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_ReplacementRankName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
ReplacementRankID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the rank's bindings to groups:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM RankPermGroup WHERE RankID = ?");
|
|
|
|
stmt.bind(1, RemoveRankID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Adjust players:
|
|
|
|
if (ReplacementRankID == -1)
|
|
|
|
{
|
|
|
|
// No replacement, just delete all the players that have the rank:
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PlayerRank WHERE RankID = ?");
|
|
|
|
stmt.bind(1, RemoveRankID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Replacement available, change all the player records:
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE PlayerRank SET RankID = ? WHERE RankID = ?");
|
|
|
|
stmt.bind(1, ReplacementRankID);
|
|
|
|
stmt.bind(2, RemoveRankID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the rank from the DB:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM Rank WHERE RankID = ?");
|
|
|
|
stmt.bind(1, RemoveRankID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2014-08-22 21:44:04 -04:00
|
|
|
|
|
|
|
// Update the default rank, if it was the one being removed:
|
|
|
|
if (a_RankName == m_DefaultRank)
|
|
|
|
{
|
|
|
|
m_DefaultRank = a_RankName;
|
|
|
|
}
|
2014-08-08 15:30:47 -04:00
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove rank from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cRankManager::RemoveGroup(const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the ID of the group:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Group %s was not found, skipping.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove all permissions from the group:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PermissionItem WHERE PermGroupID = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the group from all ranks that contain it:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM RankPermGroup WHERE PermGroupID = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the group itself:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PermGroup WHERE PermGroupID = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove group %s from DB: %s", __FUNCTION__, a_GroupName.c_str(), ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
void cRankManager::RemoveGroupFromRank(const AString & a_GroupName, const AString & a_RankName)
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the IDs of the group and the rank:
|
|
|
|
int GroupID, RankID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT PermGroup.PermGroupID, Rank.RankID FROM PermGroup "
|
|
|
|
"LEFT JOIN RankPermGroup ON RankPermGroup.PermGroupID = PermGroup.PermGroupID "
|
|
|
|
"LEFT JOIN Rank ON Rank.RankID = RankPermGroup.RankID "
|
|
|
|
"WHERE PermGroup.Name = ? AND Rank.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
stmt.bind(2, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Group %s was not found in rank %s, skipping.", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
RankID = stmt.getColumn(1).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the group from all ranks that contain it:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM RankPermGroup WHERE PermGroupID = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the group-to-rank binding:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM RankPermGroup WHERE PermGroupID = ? AND RankID = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(1, RankID);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove group %s from rank %s in the DB: %s", __FUNCTION__, a_GroupName.c_str(), a_RankName.c_str(), ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cRankManager::RemovePermissionFromGroup(const AString & a_Permission, const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the ID of the group:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Group %s was not found, skipping.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Remove the permission from the group:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PermissionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, a_Permission);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove permission %s from group %s in DB: %s",
|
|
|
|
__FUNCTION__, a_Permission.c_str(), a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
void cRankManager::RemoveRestrictionFromGroup(const AString & a_Restriction, const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the ID of the group:
|
|
|
|
int GroupID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Group %s was not found, skipping.", __FUNCTION__, a_GroupName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
GroupID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
// Remove the permission from the group:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM RestrictionItem WHERE PermGroupID = ? AND Permission = ?");
|
|
|
|
stmt.bind(1, GroupID);
|
|
|
|
stmt.bind(2, a_Restriction);
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove restriction %s from group %s in DB: %s",
|
|
|
|
__FUNCTION__, a_Restriction.c_str(), a_GroupName.c_str(), ex.what()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
bool cRankManager::RenameRank(const AString & a_OldName, const AString & a_NewName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Check that NewName doesn't exist:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_NewName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
2014-08-22 21:44:04 -04:00
|
|
|
LOGINFO("%s: Rank %s is already present, cannot rename %s", __FUNCTION__, a_NewName.c_str(), a_OldName.c_str());
|
2014-08-08 15:30:47 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Rename:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE Rank SET Name = ? WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_NewName);
|
|
|
|
stmt.bind(2, a_OldName);
|
2014-08-22 21:44:04 -04:00
|
|
|
if (stmt.exec() <= 0)
|
|
|
|
{
|
|
|
|
LOGINFO("%s: There is no rank %s, cannot rename to %s.", __FUNCTION__, a_OldName.c_str(), a_NewName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
2014-08-08 15:30:47 -04:00
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-22 21:44:04 -04:00
|
|
|
// Update the default rank, if it was the one being renamed:
|
|
|
|
if (a_OldName == m_DefaultRank)
|
|
|
|
{
|
|
|
|
m_DefaultRank = a_NewName;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2014-08-08 15:30:47 -04:00
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to rename rank %s to %s in DB: %s",
|
|
|
|
__FUNCTION__, a_OldName.c_str(), a_NewName.c_str(), ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::RenameGroup(const AString & a_OldName, const AString & a_NewName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Check that NewName doesn't exist:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT PermGroupID FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_NewName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGD("%s: Group %s is already present, cannot rename %s", __FUNCTION__, a_NewName.c_str(), a_OldName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
// Rename:
|
|
|
|
bool res;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE PermGroup SET Name = ? WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_NewName);
|
|
|
|
stmt.bind(2, a_OldName);
|
|
|
|
res = (stmt.exec() > 0);
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to rename group %s to %s in DB: %s",
|
|
|
|
__FUNCTION__, a_OldName.c_str(), a_NewName.c_str(), ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
void cRankManager::SetPlayerRank(const cUUID & a_PlayerUUID, const AString & a_PlayerName, const AString & a_RankName)
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString StrUUID = a_PlayerUUID.ToShortString();
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Get the rank ID:
|
|
|
|
int RankID;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: There is no rank %s, aborting.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
RankID = stmt.getColumn(0).getInt();
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// Update the player's rank, if already in DB:
|
|
|
|
{
|
2014-08-08 15:30:47 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE PlayerRank SET RankID = ?, PlayerName = ? WHERE PlayerUUID = ?");
|
2014-08-08 04:02:25 -04:00
|
|
|
stmt.bind(1, RankID);
|
2014-08-08 15:30:47 -04:00
|
|
|
stmt.bind(2, a_PlayerName);
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(3, StrUUID);
|
2014-08-08 04:02:25 -04:00
|
|
|
if (stmt.exec() > 0)
|
|
|
|
{
|
|
|
|
// Successfully updated the player's rank
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
// The player is not yet in the DB, add them:
|
2014-08-08 15:30:47 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "INSERT INTO PlayerRank (RankID, PlayerUUID, PlayerName) VALUES (?, ?, ?)");
|
2014-08-08 04:02:25 -04:00
|
|
|
stmt.bind(1, RankID);
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(2, StrUUID);
|
2014-08-08 15:30:47 -04:00
|
|
|
stmt.bind(3, a_PlayerName);
|
2014-08-08 04:02:25 -04:00
|
|
|
if (stmt.exec() > 0)
|
|
|
|
{
|
|
|
|
// Successfully added the player
|
|
|
|
return;
|
|
|
|
}
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
LOGWARNING("%s: Failed to set player UUID %s to rank %s.",
|
2017-08-25 08:43:18 -04:00
|
|
|
__FUNCTION__, StrUUID.c_str(), a_RankName.c_str()
|
2014-08-08 04:02:25 -04:00
|
|
|
);
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to set player UUID %s to rank %s: %s",
|
2017-08-25 08:43:18 -04:00
|
|
|
__FUNCTION__, StrUUID.c_str(), a_RankName.c_str(), ex.what()
|
2014-08-08 04:02:25 -04:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
void cRankManager::RemovePlayerRank(const cUUID & a_PlayerUUID)
|
2014-08-21 10:55:39 -04:00
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString StrUUID = a_PlayerUUID.ToShortString();
|
|
|
|
|
2014-08-21 10:55:39 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PlayerRank WHERE PlayerUUID = ?");
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(1, StrUUID);
|
2014-08-21 10:55:39 -04:00
|
|
|
stmt.exec();
|
|
|
|
}
|
2014-08-27 08:13:13 -04:00
|
|
|
catch (const SQLite::Exception & ex)
|
2014-08-21 10:55:39 -04:00
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to remove rank from player UUID %s: %s",
|
2017-08-25 08:43:18 -04:00
|
|
|
__FUNCTION__, StrUUID.c_str(), ex.what()
|
2014-08-21 10:55:39 -04:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
void cRankManager::SetRankVisuals(
|
|
|
|
const AString & a_RankName,
|
|
|
|
const AString & a_MsgPrefix,
|
|
|
|
const AString & a_MsgSuffix,
|
|
|
|
const AString & a_MsgNameColorCode
|
|
|
|
)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 15:30:47 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE Rank SET MsgPrefix = ?, MsgSuffix = ?, MsgNameColorCode = ? WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_MsgPrefix);
|
|
|
|
stmt.bind(2, a_MsgSuffix);
|
2014-08-09 11:36:19 -04:00
|
|
|
stmt.bind(3, a_MsgNameColorCode);
|
|
|
|
stmt.bind(4, a_RankName);
|
2015-08-24 08:31:58 -04:00
|
|
|
if (stmt.exec() < 1)
|
2014-08-08 15:30:47 -04:00
|
|
|
{
|
|
|
|
LOGINFO("%s: Rank %s not found, visuals not set.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get ranks from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-09 11:36:19 -04:00
|
|
|
bool cRankManager::GetRankVisuals(
|
|
|
|
const AString & a_RankName,
|
|
|
|
AString & a_MsgPrefix,
|
|
|
|
AString & a_MsgSuffix,
|
|
|
|
AString & a_MsgNameColorCode
|
|
|
|
)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-09 11:36:19 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT MsgPrefix, MsgSuffix, MsgNameColorCode FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
// Rank not found
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
a_MsgPrefix = stmt.getColumn(0).getText();
|
|
|
|
a_MsgSuffix = stmt.getColumn(1).getText();
|
|
|
|
a_MsgNameColorCode = stmt.getColumn(2).getText();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to get ranks from DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
bool cRankManager::RankExists(const AString & a_RankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT * FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The rank was found
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB for rank %s: %s", __FUNCTION__, a_RankName.c_str(), ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::GroupExists(const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT * FROM PermGroup WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_GroupName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The group was found
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB for group %s: %s", __FUNCTION__, a_GroupName.c_str(), ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
bool cRankManager::IsPlayerRankSet(const cUUID & a_PlayerUUID)
|
2014-08-08 04:02:25 -04:00
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString StrUUID = a_PlayerUUID.ToShortString();
|
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT * FROM PlayerRank WHERE PlayerUUID = ?");
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(1, StrUUID);
|
2014-08-08 04:02:25 -04:00
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The player UUID was found, they have a rank
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
2017-08-25 08:43:18 -04:00
|
|
|
LOGWARNING("%s: Failed to query DB for player UUID %s: %s", __FUNCTION__, StrUUID.c_str(), ex.what());
|
2014-08-08 04:02:25 -04:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::IsGroupInRank(const AString & a_GroupName, const AString & a_RankName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT * FROM Rank "
|
|
|
|
"LEFT JOIN RankPermGroup ON Rank.RankID = RankPermGroup.RankID "
|
|
|
|
"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RankPermGroup.PermGroupID "
|
|
|
|
"WHERE Rank.Name = ? AND PermGroup.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
stmt.bind(2, a_GroupName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The group is in the rank
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::IsPermissionInGroup(const AString & a_Permission, const AString & a_GroupName)
|
|
|
|
{
|
2014-08-13 03:53:33 -04:00
|
|
|
ASSERT(m_IsInitialized);
|
2014-08-13 06:33:31 -04:00
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2014-08-08 04:02:25 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT * FROM PermissionItem "
|
|
|
|
"LEFT JOIN PermGroup ON PermGroup.PermGroupID = PermissionItem.PermGroupID "
|
|
|
|
"WHERE PermissionItem.Permission = ? AND PermGroup.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_Permission);
|
|
|
|
stmt.bind(2, a_GroupName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The permission is in the group
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
bool cRankManager::IsRestrictionInGroup(const AString & a_Restriction, const AString & a_GroupName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
2016-02-05 16:45:45 -05:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB,
|
|
|
|
"SELECT * FROM RestrictionItem "
|
|
|
|
"LEFT JOIN PermGroup ON PermGroup.PermGroupID = RestrictionItem.PermGroupID "
|
|
|
|
"WHERE RestrictionItem.Permission = ? AND PermGroup.Name = ?"
|
|
|
|
);
|
|
|
|
stmt.bind(1, a_Restriction);
|
|
|
|
stmt.bind(2, a_GroupName);
|
|
|
|
if (stmt.executeStep())
|
|
|
|
{
|
|
|
|
// The restriction is in the group
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
void cRankManager::NotifyNameUUID(const AString & a_PlayerName, const cUUID & a_UUID)
|
2014-08-21 14:47:52 -04:00
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE PlayerRank SET PlayerName = ? WHERE PlayerUUID = ?");
|
|
|
|
stmt.bind(1, a_PlayerName);
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(2, a_UUID.ToShortString());
|
2014-08-21 14:47:52 -04:00
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to update DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-22 21:44:04 -04:00
|
|
|
bool cRankManager::SetDefaultRank(const AString & a_RankName)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// Find the rank's ID:
|
|
|
|
int RankID = 0;
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT RankID FROM Rank WHERE Name = ?");
|
|
|
|
stmt.bind(1, a_RankName);
|
|
|
|
if (!stmt.executeStep())
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Cannot set rank %s as the default, it does not exist.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the rank as the default:
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE DefaultRank SET RankID = ?");
|
|
|
|
stmt.bind(1, RankID);
|
|
|
|
if (stmt.exec() < 1)
|
|
|
|
{
|
|
|
|
// Failed to update, there might be none in the DB, try inserting:
|
|
|
|
SQLite::Statement stmt2(m_DB, "INSERT INTO DefaultRank (RankID) VALUES (?)");
|
|
|
|
stmt2.bind(1, RankID);
|
|
|
|
if (stmt2.exec() < 1)
|
|
|
|
{
|
|
|
|
LOGINFO("%s: Cannot update the default rank in the DB to %s.", __FUNCTION__, a_RankName.c_str());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the internal cache:
|
|
|
|
m_DefaultRank = a_RankName;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to update DB: %s", __FUNCTION__, ex.what());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-09-28 09:16:11 -04:00
|
|
|
void cRankManager::ClearPlayerRanks(void)
|
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
2014-09-29 15:38:11 -04:00
|
|
|
try
|
|
|
|
{
|
2014-09-28 09:16:11 -04:00
|
|
|
SQLite::Statement stmt(m_DB, "DELETE FROM PlayerRank");
|
|
|
|
stmt.exec();
|
|
|
|
}
|
|
|
|
catch (SQLite::Exception & ex)
|
|
|
|
{
|
2015-05-09 03:25:09 -04:00
|
|
|
LOGWARNING("%s: Failed to remove / clear all players: %s", __FUNCTION__, ex.what());
|
2014-09-28 09:16:11 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
bool cRankManager::UpdatePlayerName(const cUUID & a_PlayerUUID, const AString & a_NewPlayerName)
|
2014-09-27 20:17:32 -04:00
|
|
|
{
|
|
|
|
ASSERT(m_IsInitialized);
|
|
|
|
cCSLock Lock(m_CS);
|
|
|
|
|
2017-08-25 08:43:18 -04:00
|
|
|
AString StrUUID = a_PlayerUUID.ToShortString();
|
|
|
|
|
2014-09-27 20:17:32 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "UPDATE PlayerRank SET PlayerName = ? WHERE PlayerUUID = ?");
|
|
|
|
stmt.bind(1, a_NewPlayerName);
|
2017-08-25 08:43:18 -04:00
|
|
|
stmt.bind(2, StrUUID);
|
2014-09-27 20:17:32 -04:00
|
|
|
if (stmt.exec() > 0)
|
|
|
|
{
|
|
|
|
// The player name was changed, returns true
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
2017-08-25 08:43:18 -04:00
|
|
|
LOGWARNING("%s: Failed to update player name from UUID %s: %s", __FUNCTION__, StrUUID.c_str(), ex.what());
|
2014-09-27 20:17:32 -04:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-13 03:53:33 -04:00
|
|
|
bool cRankManager::AreDBTablesEmpty(void)
|
|
|
|
{
|
|
|
|
return (
|
|
|
|
IsDBTableEmpty("Rank") &&
|
|
|
|
IsDBTableEmpty("PlayerRank") &&
|
|
|
|
IsDBTableEmpty("PermGroup") &&
|
|
|
|
IsDBTableEmpty("RankPermGroup") &&
|
2014-08-22 21:44:04 -04:00
|
|
|
IsDBTableEmpty("PermissionItem") &&
|
|
|
|
IsDBTableEmpty("DefaultRank")
|
2014-08-13 03:53:33 -04:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cRankManager::IsDBTableEmpty(const AString & a_TableName)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, "SELECT COUNT(*) FROM " + a_TableName);
|
|
|
|
return (stmt.executeStep() && (stmt.getColumn(0).getInt() == 0));
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-08-22 21:44:04 -04:00
|
|
|
|
|
|
|
void cRankManager::CreateDefaults(void)
|
|
|
|
{
|
|
|
|
// Wrap everything in a big transaction to speed things up:
|
|
|
|
cMassChangeLock Lock(*this);
|
|
|
|
|
|
|
|
// Create ranks:
|
|
|
|
AddRank("Default", "", "", "");
|
|
|
|
AddRank("VIP", "", "", "");
|
|
|
|
AddRank("Operator", "", "", "");
|
|
|
|
AddRank("Admin", "", "", "");
|
|
|
|
|
|
|
|
// Create groups:
|
|
|
|
AddGroup("Default");
|
|
|
|
AddGroup("Kick");
|
|
|
|
AddGroup("Teleport");
|
|
|
|
AddGroup("Everything");
|
|
|
|
|
|
|
|
// Add groups to ranks:
|
|
|
|
AddGroupToRank("Default", "Default");
|
|
|
|
AddGroupToRank("Teleport", "VIP");
|
|
|
|
AddGroupToRank("Teleport", "Operator");
|
|
|
|
AddGroupToRank("Kick", "Operator");
|
|
|
|
AddGroupToRank("Everything", "Admin");
|
|
|
|
|
|
|
|
// Add permissions to groups:
|
2016-01-10 11:40:14 -05:00
|
|
|
AddPermissionToGroup("core.help", "Default");
|
2015-10-28 04:24:48 -04:00
|
|
|
AddPermissionToGroup("core.build", "Default");
|
|
|
|
AddPermissionToGroup("core.teleport", "Teleport");
|
|
|
|
AddPermissionToGroup("core.kick", "Kick");
|
|
|
|
AddPermissionToGroup("*", "Everything");
|
2014-08-22 21:44:04 -04:00
|
|
|
|
|
|
|
// Set the default rank:
|
|
|
|
SetDefaultRank("Default");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-07-26 17:24:36 -04:00
|
|
|
|
2015-04-25 15:05:35 -04:00
|
|
|
bool cRankManager::DoesColumnExist(const char * a_TableName, const char * a_ColumnName)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
SQLite::Statement stmt(m_DB, Printf("PRAGMA table_info(%s)", a_TableName));
|
|
|
|
while (stmt.executeStep()) // Iterate over all table's columns
|
|
|
|
{
|
|
|
|
int NumColumns = stmt.getColumnCount();
|
|
|
|
for (int i = 0; i < NumColumns; i++) // Iterate over all reply's columns (table column's metadata)
|
|
|
|
{
|
|
|
|
auto column = stmt.getColumn(i);
|
|
|
|
if (strcmp(column.getName(), "name") == 0)
|
|
|
|
{
|
|
|
|
if (NoCaseCompare(column.getText(), a_ColumnName) == 0)
|
|
|
|
{
|
|
|
|
// Colun found
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // for i - stmt.getColumns()
|
|
|
|
} // while (stmt.executeStep())
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & ex)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, ex.what());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cRankManager::CreateColumnIfNotExists(const char * a_TableName, const char * a_ColumnName, const char * a_ColumnType)
|
|
|
|
{
|
|
|
|
// If the column already exists, bail out:
|
|
|
|
if (DoesColumnExist(a_TableName, a_ColumnName))
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add the column:
|
|
|
|
try
|
|
|
|
{
|
|
|
|
m_DB.exec(Printf("ALTER TABLE %s ADD COLUMN %s %s", a_TableName, a_ColumnName, a_ColumnType));
|
|
|
|
}
|
|
|
|
catch (const SQLite::Exception & exc)
|
|
|
|
{
|
|
|
|
LOGWARNING("%s: Failed to query DB: %s", __FUNCTION__, exc.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|