Files
TTW_Bot/countermanager.cpp
T

216 lines
6.1 KiB
C++

// countermanager.cpp
#include "countermanager.h"
#include <QTableWidget>
#include <QDebug>
CounterManager::CounterManager(QObject *parent)
: QObject(parent)
, m_database(nullptr)
{
}
CounterManager::~CounterManager()
{
if (m_database) {
saveToDatabase();
}
}
bool CounterManager::initialize(uDataBase *database)
{
if (!database || !database->isConnected()) {
qWarning() << "CounterManager: База данных не подключена";
return false;
}
m_database = database;
return loadFromDatabase();
}
bool CounterManager::addCounter(const QString &name, int initialValue)
{
if (name.isEmpty()) {
qWarning() << "CounterManager: Нельзя добавить счётчик с пустым именем";
return false;
}
if (contains(name)) {
qWarning() << "CounterManager: Счётчик с именем" << name << "уже существует";
return false;
}
Counter newCounter(name, initialValue);
m_counters.append(newCounter);
if (!saveToDatabase()) {
m_counters.removeLast();
return false;
}
emit counterAdded(name, initialValue);
emit dataChanged();
return true;
}
bool CounterManager::removeCounter(const QString &name)
{
int index = findIndex(name);
if (index == -1) {
qWarning() << "CounterManager: Счётчик" << name << "не найден";
return false;
}
Counter removed = m_counters.at(index);
m_counters.removeAt(index);
if (!saveToDatabase()) {
m_counters.insert(index, removed);
return false;
}
emit counterRemoved(name);
emit dataChanged();
return true;
}
bool CounterManager::updateCounter(const QString &oldName, const QString &newName, int newValue)
{
int index = findIndex(oldName);
if (index == -1) {
qWarning() << "CounterManager: Счётчик" << oldName << "не найден";
return false;
}
if (oldName != newName && contains(newName)) {
qWarning() << "CounterManager: Имя" << newName << "уже занято";
return false;
}
Counter oldCounter = m_counters.at(index);
m_counters[index].name = newName;
m_counters[index].count = newValue;
if (!saveToDatabase()) {
m_counters[index] = oldCounter;
return false;
}
emit counterUpdated(oldName, newName);
emit dataChanged();
return true;
}
bool CounterManager::incrementCounter(const QString &name, int step)
{
int index = findIndex(name);
if (index == -1) return false;
m_counters[index].count += step;
if (!saveToDatabase()) {
m_counters[index].count -= step; // откат
return false;
}
emit counterIncremented(name, m_counters[index].count);
emit dataChanged();
return true;
}
bool CounterManager::decrementCounter(const QString &name, int step)
{
return incrementCounter(name, -step);
}
int CounterManager::getCount(const QString &name) const
{
int index = findIndex(name);
return (index != -1) ? m_counters.at(index).count : 0;
}
void CounterManager::processMessage(const QString &message)
{
for (const Counter &c : m_counters) {
if (message.contains(c.name, Qt::CaseInsensitive)) {
// Увеличиваем счётчик, но без повторного сохранения после каждого (один общий save)
// Здесь мы меняем значение, но сохраним после цикла, чтобы не делать много запросов
// Для простоты используем incrementCounter, который сам сохраняет, но это будет много раз.
// Лучше собрать имена, которые нужно увеличить, а потом применить.
// Но в данном случае можно просто вызывать incrementCounter, это не критично.
incrementCounter(c.name);
}
}
}
bool CounterManager::contains(const QString &name) const
{
return findIndex(name) != -1;
}
bool CounterManager::saveToDatabase()
{
if (!m_database) {
qWarning() << "CounterManager: База данных не установлена";
return false;
}
QTableWidget tempTable;
QStringList headers = {"Имя", "Значение"};
tempTable.setColumnCount(2);
tempTable.setHorizontalHeaderLabels(headers);
tempTable.setRowCount(m_counters.size());
for (int i = 0; i < m_counters.size(); ++i) {
const Counter &c = m_counters.at(i);
tempTable.setItem(i, 0, new QTableWidgetItem(c.name));
tempTable.setItem(i, 1, new QTableWidgetItem(QString::number(c.count)));
}
tempTable.setObjectName("sgCounters");
// Сохраняем через общий метод (предполагаем, что таблица в БД называется "sgCounters")
m_database->SaveTableWidget(&tempTable);
return true;
}
bool CounterManager::loadFromDatabase()
{
if (!m_database) {
qWarning() << "CounterManager: База данных не установлена";
return false;
}
QTableWidget tempTable;
QStringList headers = {"Имя", "Значение"};
tempTable.setColumnCount(2);
tempTable.setHorizontalHeaderLabels(headers);
tempTable.setObjectName("sgCounters");
m_database->LoadTableWidget(&tempTable);
m_counters.clear();
for (int row = 0; row < tempTable.rowCount(); ++row) {
QTableWidgetItem *nameItem = tempTable.item(row, 0);
QTableWidgetItem *valueItem = tempTable.item(row, 1);
if (!nameItem || !valueItem) continue;
QString name = nameItem->text().trimmed();
if (name.isEmpty()) continue;
bool ok;
int value = valueItem->text().toInt(&ok);
if (!ok) continue;
m_counters.append(Counter(name, value));
}
emit dataChanged();
return true;
}
int CounterManager::findIndex(const QString &name) const
{
for (int i = 0; i < m_counters.size(); ++i) {
if (m_counters.at(i).name == name)
return i;
}
return -1;
}