1
0

RankMgr: Initial interface declaration.

This commit is contained in:
madmaxoft 2014-08-05 18:37:00 +02:00
parent 9113b45673
commit 40e15c5ad5
3 changed files with 258 additions and 0 deletions

View File

@ -52,6 +52,7 @@ SET (SRCS
MonsterConfig.cpp MonsterConfig.cpp
Noise.cpp Noise.cpp
ProbabDistrib.cpp ProbabDistrib.cpp
RankManager.cpp
RCONServer.cpp RCONServer.cpp
Root.cpp Root.cpp
Scoreboard.cpp Scoreboard.cpp
@ -121,6 +122,7 @@ SET (HDRS
MonsterConfig.h MonsterConfig.h
Noise.h Noise.h
ProbabDistrib.h ProbabDistrib.h
RankManager.h
RCONServer.h RCONServer.h
Root.h Root.h
Scoreboard.h Scoreboard.h

153
src/RankManager.cpp Normal file
View File

@ -0,0 +1,153 @@
// 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"
#include "Protocol/MojangAPI.h"
#include "inifile/iniFile.h"
#include <iostream>
/*
// This code is for internal testing while developing the cRankManager class
static class cRankMgrTest
{
public:
cRankMgrTest(void) :
m_Mgr()
{
// Initialize the cMojangAPI so that it can convert playernames to UUIDs:
cIniFile Ini;
Ini.ReadFile("settings.ini");
m_API.Start(Ini);
// Test the cRankManager class:
ReportPlayer("xoft");
}
void ReportPlayer(const AString & a_PlayerName)
{
// Get the player's UUID and rank:
AString UUID = m_API.GetUUIDFromPlayerName(a_PlayerName);
std::cout << "Player " << a_PlayerName << " has UUID '" << UUID <<"'." << std::endl;
std::cout << " Rank: '" << m_Mgr.GetPlayerRankName(UUID) << "'." << std::endl;
// List all the permission groups for the player:
AStringVector Groups = m_Mgr.GetPlayerPermissionGroups(UUID);
std::cout << " Groups(" << Groups.size() << "):" << std::endl;
for (AStringVector::const_iterator itr = Groups.begin(), end = Groups.end(); itr != end; ++itr)
{
std::cout << " '" << *itr << "'." << std::endl;
} // for itr - Groups[]
// List all the permissions for the player:
AStringVector Permissions = m_Mgr.GetPlayerPermissions(UUID);
std::cout << " Permissions(" << Permissions.size() << "):" << std::endl;
for (AStringVector::const_iterator itr = Permissions.begin(), end = Permissions.end(); itr != end; ++itr)
{
std::cout << " '" << *itr << "'." << std::endl;
} // for itr - Groups[]
std::cout << "Done." << std::endl;
}
protected:
cRankManager m_Mgr;
cMojangAPI m_API;
} g_RankMgrTest;
//*/
cRankManager::cRankManager(void) :
m_DB("Ranks.sqlite", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE)
{
// Create the DB tables, if they don't exist:
m_DB.exec("CREATE TABLE IF NOT EXISTS Rank (RankID, Name, MsgPrefix, MsgPostfix, MsgNameColorCode)");
m_DB.exec("CREATE TABLE IF NOT EXISTS PlayerRank (PlayerUUID, PlayerName, RankID)");
m_DB.exec("CREATE TABLE IF NOT EXISTS PermissionGroup (GroupID, Name)");
m_DB.exec("CREATE TABLE IF NOT EXISTS RankPermissionGroups (RankID, GroupID)");
m_DB.exec("CREATE TABLE IF NOT EXISTS PermissionItem (GroupID, Permission)");
// TODO: Check if tables empty, add some defaults then
}
AString cRankManager::GetPlayerRankName(const AString & a_PlayerUUID)
{
SQLite::Statement stmt(m_DB, "SELECT Rank.Name FROM Rank LEFT JOIN PlayerRank ON Rank.RankID = PlayerRank.RankID WHERE PlayerRank.PlayerUUID = ?");
stmt.bind(1, a_PlayerUUID);
stmt.executeStep();
if (stmt.isDone())
{
// No data returned from the DB
return AString();
}
return stmt.getColumn(0).getText();
}
AStringVector cRankManager::GetPlayerPermissionGroups(const AString & a_PlayerUUID)
{
// Prepare the DB statement:
SQLite::Statement stmt(m_DB,
"SELECT PermissionGroup.Name FROM PermissionGroup "
"LEFT JOIN RankPermissionGroups "
"ON PermissionGroup.GroupID = RankPermissionGroups.GroupID "
"LEFT JOIN PlayerRank "
"ON PlayerRank.RankID = RankPermissionGroups.RankID "
"WHERE PlayerRank.PlayerUUID = ?"
);
stmt.bind(1, a_PlayerUUID);
// Execute and get results:
AStringVector res;
while (stmt.executeStep())
{
res.push_back(stmt.getColumn(0).getText());
}
return res;
}
AStringVector cRankManager::GetPlayerPermissions(const AString & a_PlayerUUID)
{
// Prepare the DB statement:
SQLite::Statement stmt(m_DB,
"SELECT PermissionItem.Permission FROM PermissionItem "
"LEFT JOIN RankPermissionGroups "
"ON PermissionItem.GroupID = RankPermissionGroups.GroupID "
"LEFT JOIN PlayerRank "
"ON PlayerRank.RankID = RankPermissionGroups.RankID "
"WHERE PlayerRank.PlayerUUID = ?"
);
stmt.bind(1, a_PlayerUUID);
// Execute and get results:
AStringVector res;
while (stmt.executeStep())
{
res.push_back(stmt.getColumn(0).getText());
}
return res;
}

103
src/RankManager.h Normal file
View File

@ -0,0 +1,103 @@
// RankManager.h
// Declares the cRankManager class that represents the rank manager responsible for assigning permissions and message visuals to players
#pragma once
#include "SQLiteCpp/Database.h"
class cRankManager
{
public:
cRankManager(void);
/** Returns the name of the rank that the specified player has assigned to them. */
AString GetPlayerRankName(const AString & a_PlayerUUID);
/** Returns the names of PermissionGroups that the specified player has assigned to them. */
AStringVector GetPlayerPermissionGroups(const AString & a_PlayerUUID);
/** Returns the permissions that the specified player has assigned to them. */
AStringVector GetPlayerPermissions(const AString & a_PlayerUUID);
/** Returns the names of groups that the specified rank has assigned to it. */
AStringVector GetRankPermissionGroups(const AString & a_RankName);
/** Returns the permissions that the specified permission group has assigned to it. */
AStringVector GetPermissionGroupPermissiont(const AString & a_GroupName);
/** Returns the names of all defined ranks. */
AStringVector GetAllRanks(void);
/** Returns the names of all permission groups. */
AStringVector GetAllPermissionGroups(void);
/** Returns all the distinct permissions that are stored in the DB. */
AStringVector GetAllPermissions(void);
/** Returns the message visuals (prefix, postfix, color) for the specified player. */
void GetPlayerMsgVisuals(
const AString & a_PlayerUUID,
AString & a_MsgPrefix,
AString & a_MsgPostfix,
AString & a_MsgNameColorCode
);
/** Adds a new rank. No action if the rank already exists. */
void AddRank(const AString & a_RankName);
/** Adds a new permission group. No action if such a group already exists. */
void AddPermissionGroup(const AString & a_GroupName);
/** Adds the specified permission group to the specified rank.
Fails if the rank or group names are not found.
Returns true if successful, false on error. */
bool AddPermissionGroupToRank(const AString & a_RankName, const AString & a_GroupName);
/** Adds the specified permission to the specified permission group.
Fails if the permission group name is not found.
Returns true if successful, false on error. */
bool AddPermissionToPermissionGroup(const AString & a_Permission, const AString & a_GroupName);
/** Removes the specified rank.
All players assigned to that rank will be re-assigned to a_ReplacementRankName, unless it is empty. */
void RemoveRank(const AString & a_RankName, const AString & a_ReplacementRankName);
/** Removes the specified permission group. */
void RemovePermissionGroup(const AString & a_PermissionGroup);
/** Removes the specified permission from the specified permission group. */
void RemovePermission(const AString & a_Permission, const AString & a_PermissionGroup);
/** Renames the specified rank. No action if the rank name is not found.
Fails if the new name is already used.
Returns true on success, false on failure. */
bool RenameRank(const AString & a_OldName, const AString & a_NewName);
/** Renames the specified permission group. No action if the rank name is not found.
Fails if the new name is already used.
Returns true on success, false on failure. */
bool RenamePermissionGroup(const AString & a_OldName, const AString & a_NewName);
/** Sets the specified player's rank.
If the player already had rank assigned to them, it is overwritten with the new rank.
Note that this doesn't change the cPlayer if the player is already connected, you need to update all the
cPlayer instances manually. */
void SetPlayerRank(const AString & a_PlayerUUID, const AString & a_RankName);
protected:
SQLite::Database m_DB;
} ;