TTW_Bot/countermanager.cpp

216 lines
6.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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;
}