summaryrefslogtreecommitdiffstats
path: root/src/RankManager.cpp
diff options
context:
space:
mode:
authormadmaxoft <github@xoft.cz>2014-08-05 18:37:00 +0200
committermadmaxoft <github@xoft.cz>2014-08-05 18:37:00 +0200
commit40e15c5ad517a6f860b39d1b225596424c3d2506 (patch)
treeb08e74dbc710002222841f1b9f22cebc14d2a2a4 /src/RankManager.cpp
parentMojangAPI: Fixed PlayerNameToUUID(). (diff)
downloadcuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar.gz
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar.bz2
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar.lz
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar.xz
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.tar.zst
cuberite-40e15c5ad517a6f860b39d1b225596424c3d2506.zip
Diffstat (limited to 'src/RankManager.cpp')
-rw-r--r--src/RankManager.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/RankManager.cpp b/src/RankManager.cpp
new file mode 100644
index 000000000..954edd099
--- /dev/null
+++ b/src/RankManager.cpp
@@ -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;
+}
+
+
+
+