Ya funcionan las estadísticas online

This commit is contained in:
2022-11-22 10:42:30 +01:00
parent fd0bebf533
commit 0d586c0827
4 changed files with 111 additions and 66 deletions

View File

@@ -6,53 +6,61 @@
#include <sstream>
// Constructor
Stats::Stats(std::string file, options_t *options)
Stats::Stats(std::string file, std::string buffer, options_t *options)
{
this->options = options;
bufferPath = buffer;
filePath = file;
bufferList.clear();
list.clear();
dictionary.clear();
if (options->online.enabled)
{
loadFromServer();
}
else
{
loadFromFile();
}
}
// Destructor
Stats::~Stats()
{
// Calcula cual es la habitación con más muertes
checkWorstNightmare();
#ifndef DEBUG
if (options->online.enabled)
{
saveToServer();
}
else
{
saveToFile();
}
#endif
saveToServer();
// Vuelca los datos del buffer en la lista de estadisticas
updateListFromBuffer();
// Guarda las estadísticas
saveToServer();
saveToFile(bufferPath, bufferList);
saveToFile(filePath, list);
bufferList.clear();
list.clear();
dictionary.clear();
}
// Inicializador
// Se debe llamar a este procediiento una vez se haya creado el diccionario numero-nombre
void Stats::init()
{
loadFromFile(bufferPath, bufferList);
loadFromFile(filePath, list);
if (options->online.enabled)
{
loadFromServer();
}
// Vuelca los datos del buffer en la lista de estadisticas
updateListFromBuffer();
}
// Añade una muerte a las estadisticas
void Stats::addDeath(std::string name)
{
// Normaliza el nombre
std::replace(name.begin(), name.end(), ' ', '_');
// std::replace(name.begin(), name.end(), ' ', '_');
// Primero busca si ya hay una entrada con ese nombre
const int index = findByName(name);
const int index = findByName(name, bufferList);
if (index != -1)
{
list.at(index).died++;
bufferList.at(index).died++;
}
// En caso contrario crea la entrada
@@ -62,7 +70,7 @@ void Stats::addDeath(std::string name)
item.name = name;
item.visited = 0;
item.died = 1;
list.push_back(item);
bufferList.push_back(item);
}
}
@@ -70,13 +78,13 @@ void Stats::addDeath(std::string name)
void Stats::addVisit(std::string name)
{
// Normaliza el nombre
std::replace(name.begin(), name.end(), ' ', '_');
// std::replace(name.begin(), name.end(), ' ', '_');
// Primero busca si ya hay una entrada con ese nombre
const int index = findByName(name);
const int index = findByName(name, bufferList);
if (index != -1)
{
list.at(index).visited++;
bufferList.at(index).visited++;
}
// En caso contrario crea la entrada
@@ -86,13 +94,12 @@ void Stats::addVisit(std::string name)
item.name = name;
item.visited = 1;
item.died = 0;
list.push_back(item);
bufferList.push_back(item);
}
std::cout << "VISITADO: " << list.back().name << ";" << list.back().visited << ";" << list.back().died << std::endl;
}
// Busca una entrada en la lista por nombre
int Stats::findByName(std::string name)
int Stats::findByName(std::string name, std::vector<stats_t> &list)
{
int i = 0;
@@ -109,8 +116,10 @@ int Stats::findByName(std::string name)
}
// Carga las estadisticas desde un fichero
bool Stats::loadFromFile()
bool Stats::loadFromFile(std::string filePath, std::vector<stats_t> &list)
{
list.clear();
// Indicador de éxito en la carga
bool success = true;
@@ -154,7 +163,7 @@ bool Stats::loadFromFile()
// El fichero no existe
else
{ // Crea el fichero con los valores por defecto
saveToFile();
saveToFile(filePath, list);
}
return success;
@@ -163,7 +172,10 @@ bool Stats::loadFromFile()
// Carga las estadisticas desde un servidor
void Stats::loadFromServer()
{
// jscore::setUserData(options->online.gameID, options->online.jailerID, "");
// Limpia los datos del servidor
// eraseServerData();
list.clear();
std::string data;
if (options->online.enabled)
@@ -190,7 +202,7 @@ void Stats::loadFromServer()
// Obtiene el nombre
getline(ss, tmp, ';');
stat.name = tmp;
stat.name = numberToName(tmp);
// Obtiene las visitas
getline(ss, tmp, ';');
@@ -207,20 +219,11 @@ void Stats::loadFromServer()
}
// Guarda las estadisticas en un fichero
void Stats::saveToFile()
void Stats::saveToFile(std::string filePath, std::vector<stats_t> &list)
{
// Crea y abre el fichero de texto
std::ofstream file(filePath);
if (file.good())
{
std::cout << filePath << " open for writing" << std::endl;
}
else
{
std::cout << filePath << " can't be opened" << std::endl;
}
// Escribe en el fichero
file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl;
for (auto item : list)
@@ -240,9 +243,8 @@ void Stats::saveToServer()
{
for (auto item : list)
{
// data = data + nameToNumber(item.name) + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";";
data = data + item.name + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";";
std::cout << "GUARDADO: " << item.name << ";" << item.visited << ";" << item.died << std::endl;
data = data + nameToNumber(item.name) + ";" + std::to_string(item.visited) + ";" + std::to_string(item.died) + ";";
// std::cout << "GUARDADO: " << item.name << ";" << item.visited << ";" << item.died << std::endl;
}
jscore::setUserData(options->online.gameID, options->online.jailerID, data);
}
@@ -292,4 +294,44 @@ std::string Stats::nameToNumber(std::string name)
}
}
return "";
}
// Vuelca los datos del buffer en la lista de estadisticas
void Stats::updateListFromBuffer()
{
// Actualiza list desde bufferList
for (auto buffer : bufferList)
{
int index = findByName(buffer.name, list);
if (index != -1)
{ // Encontrado. Aumenta sus estadisticas
list.at(index).visited += buffer.visited;
list.at(index).died += buffer.died;
}
else
{ // En caso contrario crea la entrada
stats_t item;
item.name = buffer.name;
item.visited = buffer.visited;
item.died = buffer.died;
list.push_back(item);
}
}
// Sube los datos al servidor
if (options->online.enabled)
{
saveToServer();
bufferList.clear();
}
saveToFile(bufferPath, bufferList);
saveToFile(filePath, list);
}
// Limpia los datos del servidor
void Stats::eraseServerData()
{
jscore::setUserData(options->online.gameID, options->online.jailerID, "");
}