summaryrefslogblamecommitdiffstats
path: root/src/RankManager.cpp
blob: e77fb22b99119d08b2e46031bbbf7153ca2a29ca (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15














                                                                                                                                          
   























                                                                                                    
                                                                   






























                                                                                                                         

                                                                                                                                 


                                                                                                    
























                                                                                                                                                           
                                                                         


                                    


                                                                        
                                               
                                                                           





















                                                                              

                                                                                 
                                               
                                                                           















                                                           

// 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.GetPlayerGroups(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 INTEGER PRIMARY KEY, Name, MsgPrefix, MsgPostfix, MsgNameColorCode)");
	m_DB.exec("CREATE TABLE IF NOT EXISTS PlayerRank (PlayerUUID, PlayerName, RankID INTEGER)");
	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)");
	
	// 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::GetPlayerGroups(const AString & a_PlayerUUID)
{
	// Prepare the DB statement:
	SQLite::Statement stmt(m_DB,
		"SELECT Group.Name FROM Group "
			"LEFT JOIN RankGroups "
				"ON Group.GroupID = RankGroups.GroupID "
			"LEFT JOIN PlayerRank "
				"ON PlayerRank.RankID = RankGroups.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 RankGroups "
				"ON PermissionItem.GroupID = RankGroups.GroupID "
			"LEFT JOIN PlayerRank "
				"ON PlayerRank.RankID = RankGroups.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;
}