добавил обновление списков в реальном времени

исправил поиск пользователя
убрал лишние qDebug
This commit is contained in:
2026-02-09 22:24:24 +03:00
parent cbb875f3f8
commit 39f0c447c1
11 changed files with 440 additions and 189 deletions
+26 -44
View File
@@ -25,44 +25,27 @@ void CommandProcessor::setContext(const Context& context)
QString CommandProcessor::generateResponse(QString userIndex, const QString &command, const QString &message) QString CommandProcessor::generateResponse(QString userIndex, const QString &command, const QString &message)
{ {
qDebug() << "generateResponse: userIndex =" << userIndex << "command =" << command;
// Сначала пробуем найти пользователя по displayName // Сначала пробуем найти пользователя по displayName
QString username = ""; QString username = "";
if (m_context.userManager) { if (m_context.userManager) {
User* user = m_context.userManager->findUser(userIndex); User* user = m_context.userManager->findUserById(userIndex);
if (user) { if (user) {
username = user->displayName; username = user->displayName;
qDebug() << "Найден пользователь:" << username;
} else {
qDebug() << "Пользователь не найден в UserManager по displayName:" << userIndex;
// Попробуем найти по ID
user = m_context.userManager->findUserById(userIndex);
if (user) {
username = user->displayName;
qDebug() << "Найден пользователь по ID:" << username;
}
} }
} }
if (username.isEmpty()) { if (username.isEmpty()) {
// Если не нашли в UserManager, используем переданное имя // Если не нашли в UserManager, используем переданное имя
username = userIndex; username = userIndex;
qDebug() << "Используем переданное имя:" << username;
} }
Command cmd = findCommand(command); Command cmd = findCommand(command);
if (cmd.command.isEmpty()) { if (cmd.command.isEmpty()) {
qDebug() << "Команда не найдена:" << command;
return ""; return "";
} }
qDebug() << "Найдена команда:" << cmd.command << "ответ:" << cmd.response;
QString fullCommand = command + (message.isEmpty() ? "" : " " + message); QString fullCommand = command + (message.isEmpty() ? "" : " " + message);
QString result = processCommand(username, fullCommand, cmd.response); QString result = processCommand(username, fullCommand, cmd.response);
qDebug() << "Итоговый результат:" << result;
return result; return result;
} }
@@ -175,26 +158,18 @@ QString CommandProcessor::parseRandomNumbers(const QString &response)
QRegularExpression regex("\\[\\[([^\\]]+)\\]\\]"); QRegularExpression regex("\\[\\[([^\\]]+)\\]\\]");
QRegularExpressionMatchIterator matches = regex.globalMatch(response); QRegularExpressionMatchIterator matches = regex.globalMatch(response);
qDebug() << "parseRandomNumbers: исходная строка:" << response;
qDebug() << "Найдено совпадений:" << matches.hasNext();
while (matches.hasNext()) { while (matches.hasNext()) {
QRegularExpressionMatch match = matches.next(); QRegularExpressionMatch match = matches.next();
QString rangeName = match.captured(1); QString rangeName = match.captured(1);
qDebug() << "Найден диапазон:" << rangeName;
if (m_context.randomManager) { if (m_context.randomManager) {
int randomNumber = m_context.randomManager->getRandomValue(rangeName); int randomNumber = m_context.randomManager->getRandomValue(rangeName);
qDebug() << "Получено случайное число:" << randomNumber << "для диапазона" << rangeName;
result.replace("[[" + rangeName + "]]", QString::number(randomNumber)); result.replace("[[" + rangeName + "]]", QString::number(randomNumber));
} else { } else {
qDebug() << "RandomManager не инициализирован!";
int fallbackNumber = QRandomGenerator::global()->bounded(1, 101); int fallbackNumber = QRandomGenerator::global()->bounded(1, 101);
result.replace("[[" + rangeName + "]]", QString::number(fallbackNumber)); result.replace("[[" + rangeName + "]]", QString::number(fallbackNumber));
} }
} }
qDebug() << "Результат после замены:" << result;
return result; return result;
} }
@@ -271,7 +246,6 @@ QString CommandProcessor::parseBan(const QString &response, const QString &sende
if (m_context.twitchAPI) { if (m_context.twitchAPI) {
if (m_context.userManager) { if (m_context.userManager) {
User* user = m_context.userManager->findUser(sender); User* user = m_context.userManager->findUser(sender);
qDebug() << user->displayName;
if (user && !user->id.isEmpty()) { if (user && !user->id.isEmpty()) {
if (banSeconds > 0) { if (banSeconds > 0) {
m_context.twitchAPI->banUserTime(user->id, banSeconds); m_context.twitchAPI->banUserTime(user->id, banSeconds);
@@ -487,7 +461,6 @@ QString CommandProcessor::getPeriodEnding(int n, int r)
QString CommandProcessor::parseNeuralTemplates(const QString &response, const QString &sender, const QString &parameters) QString CommandProcessor::parseNeuralTemplates(const QString &response, const QString &sender, const QString &parameters)
{ {
QString result = response; QString result = response;
qDebug() << "parseNeuralTemplates: входная строка:" << response;
// Исправленное регулярное выражение // Исправленное регулярное выражение
QRegularExpression regex("<\\|([^<]+)<\\|"); QRegularExpression regex("<\\|([^<]+)<\\|");
@@ -500,11 +473,9 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
matchCount++; matchCount++;
QRegularExpressionMatch match = matches.next(); QRegularExpressionMatch match = matches.next();
QString templateName = match.captured(1).trimmed(); QString templateName = match.captured(1).trimmed();
qDebug() << "Найден шаблон:" << templateName << "на позиции" << match.capturedStart();
if (m_context.neuralTemplateManager) { if (m_context.neuralTemplateManager) {
QString templateText = m_context.neuralTemplateManager->getTemplateText(templateName); QString templateText = m_context.neuralTemplateManager->getTemplateText(templateName);
qDebug() << "Текст шаблона:" << templateText;
if (!templateText.isEmpty()) { if (!templateText.isEmpty()) {
// Заменяем плейсхолдеры в шаблоне // Заменяем плейсхолдеры в шаблоне
@@ -512,8 +483,6 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
processedTemplate.replace("[TO]", parameters); processedTemplate.replace("[TO]", parameters);
processedTemplate.replace("[USERNAME]", sender); processedTemplate.replace("[USERNAME]", sender);
qDebug() << "Шаблон после замены плейсхолдеров:" << processedTemplate;
// Получаем ответ от нейросети // Получаем ответ от нейросети
QString aiResponse; QString aiResponse;
if (m_context.neuralManager) { if (m_context.neuralManager) {
@@ -539,7 +508,6 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
}); });
// Отправляем запрос к нейросети // Отправляем запрос к нейросети
qDebug() << "Отправляем запрос к нейросети:" << processedTemplate;
m_context.neuralManager->sendMessage(processedTemplate); m_context.neuralManager->sendMessage(processedTemplate);
// Таймаут 30 секунд // Таймаут 30 секунд
@@ -551,16 +519,11 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
if (errorOccurred) { if (errorOccurred) {
aiResponse = QString("Ошибка нейросети: %1").arg(errorMessage); aiResponse = QString("Ошибка нейросети: %1").arg(errorMessage);
qDebug() << "Ошибка нейросети:" << errorMessage;
} else if (!responseReceived) { } else if (!responseReceived) {
aiResponse = "Таймаут при ожидании ответа от нейросети"; aiResponse = "Таймаут при ожидании ответа от нейросети";
qDebug() << "Таймаут нейросети";
} else {
qDebug() << "Получен ответ от нейросети:" << aiResponse;
} }
} else { } else {
aiResponse = "Нейросеть недоступна"; aiResponse = "Нейросеть недоступна";
qDebug() << "NeuralManager не доступен";
} }
// Заменяем шаблон на ответ от нейросети // Заменяем шаблон на ответ от нейросети
@@ -570,7 +533,6 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
repl.text = aiResponse; repl.text = aiResponse;
replacements.append(repl); replacements.append(repl);
} else { } else {
qDebug() << "Шаблон не найден или пустой:" << templateName;
// Если шаблон не найден, оставляем как есть или заменяем на заглушку // Если шаблон не найден, оставляем как есть или заменяем на заглушку
Replacement repl; Replacement repl;
repl.start = match.capturedStart(); repl.start = match.capturedStart();
@@ -579,7 +541,6 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
replacements.append(repl); replacements.append(repl);
} }
} else { } else {
qDebug() << "NeuralTemplateManager не доступен";
// Если менеджер не доступен, заменяем на заглушку // Если менеджер не доступен, заменяем на заглушку
Replacement repl; Replacement repl;
repl.start = match.capturedStart(); repl.start = match.capturedStart();
@@ -589,8 +550,6 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
} }
} }
qDebug() << "Всего найдено шаблонов:" << matchCount;
// Выполняем замены с конца к началу // Выполняем замены с конца к началу
std::sort(replacements.begin(), replacements.end(), std::sort(replacements.begin(), replacements.end(),
[](const Replacement &a, const Replacement &b) { [](const Replacement &a, const Replacement &b) {
@@ -600,8 +559,31 @@ QString CommandProcessor::parseNeuralTemplates(const QString &response, const QS
for (const auto &replacement : replacements) { for (const auto &replacement : replacements) {
result.replace(replacement.start, replacement.length, replacement.text); result.replace(replacement.start, replacement.length, replacement.text);
} }
qDebug() << "parseNeuralTemplates: результат:" << result;
return result; return result;
} }
void CommandProcessor::editCommand(const QString &oldCommand,const QString &newCommand,const QString &response)
{
Command oldCom = findCommand(oldCommand);
if (oldCom.command.isEmpty()) return;
for (int i = 0; i < m_commands.size(); ++i) {
if (m_commands[i].command.compare(oldCommand, Qt::CaseInsensitive) == 0) {
// Обновляем команду
m_commands[i].command = newCommand;
m_commands[i].response = response;
return;
}
}
}
void CommandProcessor::deleteCommand(const QString &commandName)
{
Command oldCom = findCommand(commandName);
if (oldCom.command.isEmpty()) return;
for (int i = 0; i < m_commands.size(); ++i) {
if (m_commands[i].command.compare(commandName, Qt::CaseInsensitive) == 0) {
m_commands.remove(i);
return;
}
}
}
+3
View File
@@ -45,6 +45,9 @@ public:
QString generateResponse(QString userIndex, const QString &command, const QString &message = ""); QString generateResponse(QString userIndex, const QString &command, const QString &message = "");
void addCommand(const QString &command, const QString &response); void addCommand(const QString &command, const QString &response);
void editCommand(const QString &oldCommand,const QString &newCommand,const QString &response);
void deleteCommand(const QString &commandName);
void addCommands(const QVector<Command> &commands); void addCommands(const QVector<Command> &commands);
void clearCommands(); void clearCommands();
+180 -19
View File
@@ -55,10 +55,41 @@ void FSingleGrid::toGrid(QString aName, QString aFile)
void FSingleGrid::on_btnAdd_clicked() void FSingleGrid::on_btnAdd_clicked()
{ {
toGrid(ui->edtName->text(), ui->edtFileName->text()); QString name = ui->edtName->text().trimmed();
QString filePath = ui->edtFileName->text().trimmed();
if (name.isEmpty()) {
QMessageBox::warning(this, "Внимание", "Введите название!");
return;
}
if (filePath.isEmpty()) {
QMessageBox::warning(this, "Внимание", "Введите путь к файлу!");
return;
}
// Добавляем в соответствующий менеджер
if (!addToManager(name, filePath)) {
QMessageBox::warning(this, "Ошибка",
currentManagerType == TemplateManager ?
"Не удалось добавить шаблон. Возможно, такое имя уже существует." :
"Не удалось добавить файл. Возможно, такое имя уже существует.");
return;
}
// Добавляем в таблицу
toGrid(name, filePath);
// Сохраняем в БД
if (db) {
db->SaveTableWidget(ui->sg); db->SaveTableWidget(ui->sg);
} }
// Очищаем поля
ui->edtName->clear();
ui->edtFileName->clear();
}
void FSingleGrid::setDatabase(uDataBase *database) void FSingleGrid::setDatabase(uDataBase *database)
{ {
db = database; db = database;
@@ -66,62 +97,90 @@ void FSingleGrid::setDatabase(uDataBase *database)
void FSingleGrid::on_btnDel_clicked() void FSingleGrid::on_btnDel_clicked()
{ {
// Проверяем, есть ли выделенная строка
if (!ui->sg->currentItem()) { if (!ui->sg->currentItem()) {
QMessageBox::warning(this, "Внимание", "Выберите строку для удаления!"); QMessageBox::warning(this, "Внимание", "Выберите строку для удаления!");
return; return;
} }
// Получаем индекс выделенной строки
int row = ui->sg->currentItem()->row(); int row = ui->sg->currentItem()->row();
QString name = ui->sg->item(row, 0)->text();
// Удаляем строку // Удаляем из менеджера
if (!removeFromManager(name)) {
QMessageBox::warning(this, "Ошибка", "Не удалось удалить из менеджера!");
return;
}
// Удаляем строку из таблицы
ui->sg->removeRow(row); ui->sg->removeRow(row);
// Сохраняем в БД
if (db) {
db->SaveTableWidget(ui->sg); db->SaveTableWidget(ui->sg);
} }
}
void FSingleGrid::on_btnEdt_clicked() void FSingleGrid::on_btnEdt_clicked()
{ {
// Проверяем, есть ли выделенная строка
if (!ui->sg->currentItem()) { if (!ui->sg->currentItem()) {
QMessageBox::warning(this, "Внимание", "Выберите строку для редактирования!"); QMessageBox::warning(this, "Внимание", "Выберите строку для редактирования!");
return; return;
} }
// Получаем индекс выделенной строки
int row = ui->sg->currentItem()->row(); int row = ui->sg->currentItem()->row();
QString oldName = ui->sg->item(row, 0)->text();
QString newName = ui->edtName->text().trimmed();
QString newFilePath = ui->edtFileName->text().trimmed();
// Получаем данные из выбранной строки if (newName.isEmpty()) {
ui->sg->item(row, 0)->setText(ui->edtName->text()); QMessageBox::warning(this, "Внимание", "Введите новое название!");
ui->sg->item(row, 1)->setText(ui->edtFileName->text()); return;
db->SaveTableWidget(ui->sg);
} }
if (newFilePath.isEmpty()) {
QMessageBox::warning(this, "Внимание", "Введите новый путь к файлу!");
return;
}
// Обновляем в менеджере
if (!updateInManager(oldName, newName, newFilePath)) {
QMessageBox::warning(this, "Ошибка",
currentManagerType == TemplateManager ?
"Не удалось обновить шаблон. Возможно, новое имя уже существует." :
"Не удалось обновить файл. Возможно, новое имя уже существует.");
return;
}
// Обновляем в таблице
ui->sg->item(row, 0)->setText(newName);
ui->sg->item(row, 1)->setText(newFilePath);
// Сохраняем в БД
if (db) {
db->SaveTableWidget(ui->sg);
}
}
void FSingleGrid::on_btnOpen_clicked() void FSingleGrid::on_btnOpen_clicked()
{ {
// Диалог выбора файла // Диалог выбора файла
QString fileName = QFileDialog::getOpenFileName( QString fileName = QFileDialog::getOpenFileName(
this, // родительское окно this,
"Выберите файл", // заголовок окна "Выберите файл",
QDir::homePath(), // начальная директория QDir::homePath(),
"Все файлы (*.*);;" // фильтры файлов "Все файлы (*.*);;"
"Текстовые файлы (*.txt);;" "Текстовые файлы (*.txt);;"
"Аудио (*.mp3);;" "Аудио (*.mp3);;"
"Приложения (*.exe *.bat *.cmd)" "Приложения (*.exe *.bat *.cmd)"
); );
// Если файл выбран (не нажата кнопка "Отмена")
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
// Записываем путь к файлу в поле ввода
ui->edtFileName->setText(fileName); ui->edtFileName->setText(fileName);
// Опционально: автоматически заполняем поле имени из названия файла
if (ui->edtName->text().isEmpty()) { if (ui->edtName->text().isEmpty()) {
QFileInfo fileInfo(fileName); QFileInfo fileInfo(fileName);
QString baseName = fileInfo.baseName(); // Имя файла без расширения ui->edtName->setText(fileInfo.baseName());
ui->edtName->setText(baseName);
} }
} }
} }
@@ -129,8 +188,110 @@ void FSingleGrid::on_btnOpen_clicked()
void FSingleGrid::on_sg_cellClicked(int row, int column) void FSingleGrid::on_sg_cellClicked(int row, int column)
{ {
Q_UNUSED(column);
if (row >= 0 && row < ui->sg->rowCount()) {
ui->edtName->setText(ui->sg->item(row, 0)->text()); ui->edtName->setText(ui->sg->item(row, 0)->text());
ui->edtFileName->setText(ui->sg->item(row, 1)->text()); ui->edtFileName->setText(ui->sg->item(row, 1)->text());
}
} }
void FSingleGrid::setSoundManager(MediaFileManager *manager)
{
soundManager = manager;
currentManagerType = SoundManager;
}
void FSingleGrid::setTextManager(MediaFileManager *manager)
{
textManager = manager;
currentManagerType = TextManager;
}
void FSingleGrid::setTemplateManager(NeuralTemplateManager *manager)
{
templateManager = manager;
currentManagerType = TemplateManager;
}
void FSingleGrid::setManagerType(ManagerType type)
{
currentManagerType = type;
}
bool FSingleGrid::addToManager(const QString& name, const QString& filePath)
{
switch (currentManagerType) {
case SoundManager:
if (soundManager) {
qDebug() << "добавляем ебаный звук";
return soundManager->addFile(name, filePath);
}
break;
case TextManager:
if (textManager) {
qDebug() << "добавляем ебаный текст";
return textManager->addFile(name, filePath);
}
break;
case TemplateManager:
if (templateManager) {
qDebug() << "добавляем ебаный шаблон";
return templateManager->addTemplate(name, filePath);
}
break;
default:
qDebug() << "добавляем ебаный нихуя";
break;
}
return false;
}
bool FSingleGrid::removeFromManager(const QString& name)
{
switch (currentManagerType) {
case SoundManager:
if (soundManager) {
return soundManager->removeFile(name);
}
break;
case TextManager:
if (textManager) {
return textManager->removeFile(name);
}
break;
case TemplateManager:
if (templateManager) {
return templateManager->removeTemplate(name);
}
break;
default:
break;
}
return false;
}
bool FSingleGrid::updateInManager(const QString& oldName, const QString& newName, const QString& newFilePath)
{
switch (currentManagerType) {
case SoundManager:
if (soundManager) {
return soundManager->updateFile(oldName, newName, newFilePath);
}
break;
case TextManager:
if (textManager) {
return textManager->updateFile(oldName, newName, newFilePath);
}
break;
case TemplateManager:
if (templateManager) {
return templateManager->updateTemplate(oldName, newName, newFilePath);
}
break;
default:
break;
}
return false;
}
+21
View File
@@ -3,6 +3,8 @@
#include <QWidget> #include <QWidget>
#include <QTableWidget> #include <QTableWidget>
#include "mediafilemanager.h"
#include "neuraltemplatemanager.h"
#include "udatabase.h" #include "udatabase.h"
namespace Ui { namespace Ui {
@@ -14,12 +16,24 @@ class FSingleGrid : public QWidget
Q_OBJECT Q_OBJECT
public: public:
enum ManagerType {
NoManager,
SoundManager,
TextManager,
TemplateManager
};
explicit FSingleGrid(QWidget *parent = nullptr); explicit FSingleGrid(QWidget *parent = nullptr);
~FSingleGrid(); ~FSingleGrid();
void initForm(QString aBlockName, QString aNewName, bool btnOpen = false); void initForm(QString aBlockName, QString aNewName, bool btnOpen = false);
void toGrid(QString aName, QString aFile); void toGrid(QString aName, QString aFile);
QTableWidget* tableWidget() const; QTableWidget* tableWidget() const;
void setDatabase(uDataBase *database); void setDatabase(uDataBase *database);
void setSoundManager(MediaFileManager *manager);
void setTextManager(MediaFileManager *manager);
void setTemplateManager(NeuralTemplateManager *manager);
void setManagerType(ManagerType type);
private slots: private slots:
void on_btnAdd_clicked(); void on_btnAdd_clicked();
@@ -34,6 +48,13 @@ private slots:
private: private:
Ui::FSingleGrid *ui; Ui::FSingleGrid *ui;
uDataBase *db = nullptr; uDataBase *db = nullptr;
ManagerType currentManagerType = NoManager;
MediaFileManager *soundManager = nullptr;
MediaFileManager *textManager = nullptr;
NeuralTemplateManager *templateManager = nullptr;
bool addToManager(const QString& name, const QString& filePath);
bool removeFromManager(const QString& name);
bool updateInManager(const QString& oldName, const QString& newName, const QString& newFilePath);
}; };
#endif // FSINGLEGRID_H #endif // FSINGLEGRID_H
+39
View File
@@ -8,6 +8,7 @@ MediaFileManager::MediaFileManager()
bool MediaFileManager::addFile(const QString& name, const QString& filePath) bool MediaFileManager::addFile(const QString& name, const QString& filePath)
{ {
qDebug() << "Добавляем ебаный файл";
// Проверка на пустые значения // Проверка на пустые значения
if (name.isEmpty() || filePath.isEmpty()) { if (name.isEmpty() || filePath.isEmpty()) {
qWarning() << "Имя файла или путь не могут быть пустыми"; qWarning() << "Имя файла или путь не могут быть пустыми";
@@ -99,3 +100,41 @@ int MediaFileManager::findFileIndex(const QString& name) const
} }
return -1; return -1;
} }
bool MediaFileManager::renameFile(const QString& oldName, const QString& newName)
{
int index = findFileIndex(oldName);
if (index == -1) {
qWarning() << "Файл с именем" << oldName << "не найден";
return false;
}
// Проверяем, не используется ли новое имя другим файлом
if (oldName != newName && contains(newName)) {
qWarning() << "Файл с именем" << newName << "уже существует";
return false;
}
QString oldPath = mediaFiles[index].filePath;
mediaFiles[index].name = newName;
qDebug() << "Файл переименован:" << oldName << "->" << newName;
return true;
}
bool MediaFileManager::updateFilePath(const QString& name, const QString& newFilePath)
{
int index = findFileIndex(name);
if (index == -1) {
qWarning() << "Файл с именем" << name << "не найден";
return false;
}
QString oldPath = mediaFiles[index].filePath;
mediaFiles[index].filePath = newFilePath;
qDebug() << "Путь файла обновлен:" << name << "новый путь:" << newFilePath;
return true;
}
+10 -19
View File
@@ -4,47 +4,38 @@
#include <QString> #include <QString>
#include <QVector> #include <QVector>
// Структура для хранения информации о медиафайле
struct MediaFile { struct MediaFile {
QString name; // Имя файла QString name;
QString filePath; // Полный путь к файлу QString filePath;
MediaFile() = default; MediaFile() = default;
MediaFile(const QString& name, const QString& filePath) MediaFile(const QString& n, const QString& p) : name(n), filePath(p) {}
: name(name), filePath(filePath) {}
}; };
class MediaFileManager class MediaFileManager
{ {
public: public:
MediaFileManager(); MediaFileManager();
~MediaFileManager() = default;
// Добавление файла
bool addFile(const QString& name, const QString& filePath); bool addFile(const QString& name, const QString& filePath);
// Удаление файла по имени
bool removeFile(const QString& name); bool removeFile(const QString& name);
// Изменение информации о файле
bool updateFile(const QString& oldName, const QString& newName, const QString& newFilePath); bool updateFile(const QString& oldName, const QString& newName, const QString& newFilePath);
// Получение пути к файлу по имени
QString getFilePathByName(const QString& name) const; QString getFilePathByName(const QString& name) const;
// Получение количества файлов
int getFileCount() const; int getFileCount() const;
// Получение всех файлов (для отладки или отображения)
QVector<MediaFile> getAllFiles() const; QVector<MediaFile> getAllFiles() const;
// Проверка существования файла по имени
bool contains(const QString& name) const; bool contains(const QString& name) const;
private: // Новые методы для управления файлами
QVector<MediaFile> mediaFiles; bool renameFile(const QString& oldName, const QString& newName);
bool updateFilePath(const QString& name, const QString& newFilePath);
// Поиск индекса файла по имени private:
int findFileIndex(const QString& name) const; int findFileIndex(const QString& name) const;
QVector<MediaFile> mediaFiles;
}; };
#endif // MEDIAFILEMANAGER_H #endif // MEDIAFILEMANAGER_H
+69 -15
View File
@@ -8,45 +8,99 @@ NeuralTemplateManager::NeuralTemplateManager(QObject *parent)
{ {
} }
void NeuralTemplateManager::addTemplate(const QString &name, const QString &templateText) bool NeuralTemplateManager::addTemplate(const QString &name, const QString &templateText)
{ {
// Проверяем, нет ли уже шаблона с таким именем if (name.isEmpty()) {
for (int i = 0; i < m_templates.size(); ++i) { qWarning() << "Имя шаблона не может быть пустым";
if (m_templates[i].name.compare(name, Qt::CaseInsensitive) == 0) { return false;
m_templates[i].templateText = templateText;
return;
} }
if (containsTemplate(name)) {
qWarning() << "Шаблон с именем" << name << "уже существует";
return false;
} }
m_templates.append({name, templateText});
templates.append(NeuralTemplate(name, templateText));
// emit templateAdded(name, templateText);
return true;
} }
QString NeuralTemplateManager::getTemplateText(const QString &name) const QString NeuralTemplateManager::getTemplateText(const QString &name) const
{ {
for (const Template &t : m_templates) { int index = findTemplateIndex(name);
if (t.name.compare(name, Qt::CaseInsensitive) == 0) { if (index == -1) {
return t.templateText;
}
}
return QString(); return QString();
} }
return templates[index].templateText;
}
bool NeuralTemplateManager::removeTemplate(const QString& name)
{
int index = findTemplateIndex(name);
if (index == -1) {
qWarning() << "Шаблон с именем" << name << "не найден";
return false;
}
templates.remove(index);
// emit templateRemoved(name);
return true;
}
bool NeuralTemplateManager::updateTemplate(const QString& oldName, const QString& newName, const QString& newTemplateText)
{
int index = findTemplateIndex(oldName);
if (index == -1) {
qWarning() << "Шаблон с именем" << oldName << "не найден";
return false;
}
// Проверяем, не используется ли новое имя другим шаблоном
if (oldName != newName && containsTemplate(newName)) {
qWarning() << "Шаблон с именем" << newName << "уже существует";
return false;
}
templates[index].name = newName;
templates[index].templateText = newTemplateText;
// emit templateUpdated(oldName, newName, newTemplateText);
return true;
}
int NeuralTemplateManager::findTemplateIndex(const QString& name) const
{
for (int i = 0; i < templates.size(); ++i) {
if (templates[i].name == name) {
return i;
}
}
return -1;
}
bool NeuralTemplateManager::containsTemplate(const QString& name) const
{
return findTemplateIndex(name) != -1;
}
void NeuralTemplateManager::clear() void NeuralTemplateManager::clear()
{ {
m_templates.clear(); templates.clear();
} }
void NeuralTemplateManager::loadFromTableWidget(QTableWidget *table) void NeuralTemplateManager::loadFromTableWidget(QTableWidget *table)
{ {
clear(); clear();
if (!table) return; if (!table) return;
qDebug()<< "Table Found";
for (int row = 0; row < table->rowCount(); ++row) { for (int row = 0; row < table->rowCount(); ++row) {
QTableWidgetItem *nameItem = table->item(row, 0); QTableWidgetItem *nameItem = table->item(row, 0);
QTableWidgetItem *templateItem = table->item(row, 1); QTableWidgetItem *templateItem = table->item(row, 1);
if (nameItem && templateItem) { if (nameItem && templateItem) {
QString name = nameItem->text().trimmed(); QString name = nameItem->text().trimmed();
QString templateText = templateItem->text().trimmed(); QString templateText = templateItem->text().trimmed();
qDebug()<< "Template add " << name;
if (!name.isEmpty() && !templateText.isEmpty()) { if (!name.isEmpty() && !templateText.isEmpty()) {
addTemplate(name, templateText); addTemplate(name, templateText);
} }
+15 -7
View File
@@ -12,22 +12,30 @@ class NeuralTemplateManager : public QObject
Q_OBJECT Q_OBJECT
public: public:
struct Template {
QString name;
QString templateText;
};
explicit NeuralTemplateManager(QObject *parent = nullptr); explicit NeuralTemplateManager(QObject *parent = nullptr);
void addTemplate(const QString &name, const QString &templateText); bool addTemplate(const QString &name, const QString &templateText);
bool removeTemplate(const QString& name);
bool updateTemplate(const QString& oldName, const QString& newName, const QString& newTemplateText);
QString getTemplateText(const QString &name) const; QString getTemplateText(const QString &name) const;
void clear(); void clear();
void loadFromTableWidget(QTableWidget *table); void loadFromTableWidget(QTableWidget *table);
bool containsTemplate(const QString& name) const;
const QVector<Template>& templates() const { return m_templates; }
private: private:
QVector<Template> m_templates;
struct NeuralTemplate {
QString name;
QString templateText;
NeuralTemplate(const QString& n = "", const QString& t = "")
: name(n), templateText(t) {}
};
QVector<NeuralTemplate> templates;
int findTemplateIndex(const QString& name) const;
}; };
#endif // NEURALTEMPLATEMANAGER_H #endif // NEURALTEMPLATEMANAGER_H
-2
View File
@@ -319,8 +319,6 @@ bool uDataBase::SaveTimers(QTableWidget *tableWidget, const QList<TimerInfo> &ti
m_db.rollback(); m_db.rollback();
return false; return false;
} }
qDebug() << "Saved" << savedRows << "timers to database";
return true; return true;
} }
+69 -68
View File
@@ -162,11 +162,6 @@ uGeneral::uGeneral(QWidget *parent)
// ============================================================================ // ============================================================================
setupAuthHandlers(); setupAuthHandlers();
// ============================================================================
// ИНИЦИАЛИЗАЦИЯ НЕЙРОННОЙ СЕТИ
// ============================================================================
initializeNeuralNetwork();
loadEmoties(); loadEmoties();
// Настройка таблицы веб-серверов // Настройка таблицы веб-серверов
@@ -416,9 +411,7 @@ void uGeneral::initializeManagers()
// Менеджер случайных ответов (групп) // Менеджер случайных ответов (групп)
m_randomResponses = new RandomResponses(this); m_randomResponses = new RandomResponses(this);
m_neuralTemplateManager = new NeuralTemplateManager(this);
QTableWidget* table = ui->widget_3->tableWidget();
m_neuralTemplateManager->loadFromTableWidget(table);
// Менеджер нейросети (если есть) // Менеджер нейросети (если есть)
nnManager = new NeuralNetworkManager(this); nnManager = new NeuralNetworkManager(this);
// Настройка нейросети (пример) // Настройка нейросети (пример)
@@ -427,32 +420,38 @@ void uGeneral::initializeManagers()
// GigaChat // GigaChat
nnManager->setCurrentNetworkType(NeuralNetworkManager::GigaChat); nnManager->setCurrentNetworkType(NeuralNetworkManager::GigaChat);
nnManager->setGigaChatCredentials(ui->edtAIP1->text(), ui->edtAIP2->text()); nnManager->setGigaChatCredentials(ui->edtAIP1->text(), ui->edtAIP2->text());
qDebug() << "GigaChat";
} }
else if (ui->rbDS->isChecked()) { else if (ui->rbDS->isChecked()) {
// DeepSeek // DeepSeek
nnManager->setCurrentNetworkType(NeuralNetworkManager::DeepSeek); nnManager->setCurrentNetworkType(NeuralNetworkManager::DeepSeek);
nnManager->setApiKey(NeuralNetworkManager::DeepSeek, ui->edtAIP1->text()); nnManager->setApiKey(NeuralNetworkManager::DeepSeek, ui->edtAIP1->text());
qDebug() << "DeepSeek";
} }
else if (ui->rbCG->isChecked()) { else if (ui->rbCG->isChecked()) {
// ChatGPT // ChatGPT
nnManager->setCurrentNetworkType(NeuralNetworkManager::ChatGPT); nnManager->setCurrentNetworkType(NeuralNetworkManager::ChatGPT);
nnManager->setApiKey(NeuralNetworkManager::ChatGPT, ui->edtAIP1->text()); nnManager->setApiKey(NeuralNetworkManager::ChatGPT, ui->edtAIP1->text());
qDebug() << "ChatGPT";
} }
else if (ui->RBCustom->isChecked()) { else if (ui->RBCustom->isChecked()) {
// Ollama // Ollama
nnManager->setCurrentNetworkType(NeuralNetworkManager::Ollama); nnManager->setCurrentNetworkType(NeuralNetworkManager::Ollama);
nnManager->setApiKey(NeuralNetworkManager::Ollama, ui->edtAIP1->text()); nnManager->setApiKey(NeuralNetworkManager::Ollama, ui->edtAIP1->text());
nnManager->setOllamaUrl(ui->edtAIP2->text()); nnManager->setOllamaUrl(ui->edtAIP2->text());
qDebug() << "Ollama";
} }
m_SoundFiles = new MediaFileManager(); m_SoundFiles = new MediaFileManager();
ui->widget->setSoundManager(m_SoundFiles);
ui->widget->setManagerType(FSingleGrid::SoundManager);
ui->widget->setDatabase(db);
m_TextFiles = new MediaFileManager();
ui->widget_2->setTextManager(m_TextFiles); // Нужно создать m_TextFiles
ui->widget_2->setManagerType(FSingleGrid::TextManager);
ui->widget_2->setDatabase(db);
m_neuralTemplateManager = new NeuralTemplateManager(this);
ui->widget_3->setTemplateManager(m_neuralTemplateManager);
ui->widget_3->setManagerType(FSingleGrid::TemplateManager);
ui->widget_3->setDatabase(db);
// Менеджер команд // Менеджер команд
m_commandProcessor = new CommandProcessor(this); m_commandProcessor = new CommandProcessor(this);
@@ -469,7 +468,10 @@ void uGeneral::initializeManagers()
// Загрузка звуков // Загрузка звуков
loadSoundsFromDatabase(); loadSoundsFromDatabase();
// Загрузка текстов
loadTextFromDatabase();
// Загрузка шаблонов
loadTemplatesFromDatabase();
// Настройка контекста для обработчика команд // Настройка контекста для обработчика команд
CommandProcessor::Context context; CommandProcessor::Context context;
@@ -531,6 +533,50 @@ void uGeneral::loadSoundsFromDatabase()
} }
} }
} }
/**
* @brief Загрузка текстов
*/
void uGeneral::loadTextFromDatabase()
{
if (!db || !m_TextFiles) return;
QTableWidget* table = ui->widget_2->tableWidget();
if (!table) return;
for (int row = 0; row < table->rowCount(); ++row) {
QTableWidgetItem *nameItem = table->item(row, 0);
QTableWidgetItem *fileItem = table->item(row, 1);
if (nameItem && fileItem) {
QString name = nameItem->text().trimmed();
QString file = fileItem->text().trimmed();
if (!name.isEmpty() && !file.isEmpty()) {
m_TextFiles->addFile(name, file);
}
}
}
}
/**
* @brief Загрузка шаблонов
*/
void uGeneral::loadTemplatesFromDatabase()
{
if (!db || !m_neuralTemplateManager) return;
QTableWidget* table = ui->widget_3->tableWidget();
if (!table) return;
for (int row = 0; row < table->rowCount(); ++row) {
QTableWidgetItem *nameItem = table->item(row, 0);
QTableWidgetItem *fileItem = table->item(row, 1);
if (nameItem && fileItem) {
QString name = nameItem->text().trimmed();
QString file = fileItem->text().trimmed();
if (!name.isEmpty() && !file.isEmpty()) {
m_neuralTemplateManager->addTemplate(name, file);
}
}
}
}
/** /**
* @brief Загрузка случайных диапазонов из таблицы sgRandomInt в RandomManager * @brief Загрузка случайных диапазонов из таблицы sgRandomInt в RandomManager
*/ */
@@ -796,19 +842,6 @@ void uGeneral::setupAuthHandlers()
}); });
} }
/**
* @brief Инициализация нейронной сети
*/
void uGeneral::initializeNeuralNetwork()
{
nnManager = new NeuralNetworkManager(this);
// Подключение сигналов менеджера нейронной сети
connect(nnManager, &NeuralNetworkManager::responseReceived,
this, &uGeneral::onNeuralResponse);
connect(nnManager, &NeuralNetworkManager::errorOccurred,
this, &uGeneral::onNeuralError);
}
uGeneral::~uGeneral() uGeneral::~uGeneral()
{ {
@@ -1174,20 +1207,11 @@ void uGeneral::sendRequestToAI(const QString &q)
nnManager->sendMessage(q, type); nnManager->sendMessage(q, type);
} }
void uGeneral::onNeuralResponse(const QString &response) {
// Отправляем ответ в Twitch чат
qDebug() << "Ответ нейросети:" << response;
}
void uGeneral::onNeuralError(const QString &error) {
LogManager::instance()->error("General", "onNeuralError", error);
}
void uGeneral::onSoundGridDoubleClicked() void uGeneral::onSoundGridDoubleClicked()
{ {
QTextCursor cursor = ui->textBrowser->textCursor(); QTextCursor cursor = ui->textBrowser->textCursor();
cursor.insertText("||" + ui->widget->tableWidget()->item(ui->widget->tableWidget()->currentRow(), 0)->text() + "||"); cursor.insertText("||" + ui->widget->tableWidget()->item(ui->widget->tableWidget()->currentRow(), 0)->text() + "||");
} }
void uGeneral::onFilesGridDoubleClicked() void uGeneral::onFilesGridDoubleClicked()
@@ -1837,28 +1861,6 @@ void uGeneral::on_btnNotifyOpenSub_clicked()
ui->edtNotifyFileNameSub->setText(sourceFile); ui->edtNotifyFileNameSub->setText(sourceFile);
} }
void uGeneral::onStatus(const QString &statusText, int statusCode)
{
qDebug() << "[STATUS]" << statusCode << statusText;
}
void uGeneral::onDisconnected(const QString &reason)
{
qDebug() << "[DISCONNECTED]" << reason;
}
void uGeneral::onJoined(const QString &nickname)
{
qDebug() << "[JOINED]" << nickname << "joined";
}
void uGeneral::onMessage(const QString &message)
{
qDebug() << "[MESSAGE]" << message;
}
void uGeneral::playNotify(const bool &isMod, const bool &isVip, const bool &isSub) void uGeneral::playNotify(const bool &isMod, const bool &isVip, const bool &isSub)
{ {
// Проверяем модератора (самый высокий приоритет) // Проверяем модератора (самый высокий приоритет)
@@ -2362,6 +2364,8 @@ void uGeneral::on_btnRandomAdd_clicked()
// Очищаем поля ввода // Очищаем поля ввода
ui->edtRandomRespons->clear(); ui->edtRandomRespons->clear();
m_randomResponses->addResponse(groupName, response);
} }
@@ -2369,6 +2373,7 @@ void uGeneral::on_btnRandomDel_clicked()
{ {
db->DeleteResponse(ui->lbRandomGroup->currentItem()->text(), ui->lbRandomRespons->currentItem()->text()); db->DeleteResponse(ui->lbRandomGroup->currentItem()->text(), ui->lbRandomRespons->currentItem()->text());
db->LoadRandomResponses(ui->lbRandomGroup->currentItem()->text(), ui->lbRandomRespons); db->LoadRandomResponses(ui->lbRandomGroup->currentItem()->text(), ui->lbRandomRespons);
m_randomResponses->removeResponse(ui->lbRandomGroup->currentItem()->text(), ui->lbRandomRespons->currentItem()->text());
} }
@@ -2376,6 +2381,7 @@ void uGeneral::on_btnRmGroup_clicked()
{ {
db->DeleteGroup(ui->lbRandomGroup->currentItem()->text()); db->DeleteGroup(ui->lbRandomGroup->currentItem()->text());
db->LoadRandomGroups(ui->lbRandomGroup); db->LoadRandomGroups(ui->lbRandomGroup);
m_randomResponses->removeGroup(ui->lbRandomGroup->currentItem()->text());
} }
void uGeneral::on_btnGetDateFollow_clicked() void uGeneral::on_btnGetDateFollow_clicked()
@@ -2443,7 +2449,7 @@ void uGeneral::on_btnAddCommand_clicked()
// Сохраняем в БД // Сохраняем в БД
db->SaveTableWidget(ui->sgCommands); db->SaveTableWidget(ui->sgCommands);
m_commandProcessor->addCommand(name, response);
LogManager::instance()->info("uGeneral", "on_btnAddCommand_clicked", LogManager::instance()->info("uGeneral", "on_btnAddCommand_clicked",
QString("Добавлена команда: %1").arg(name)); QString("Добавлена команда: %1").arg(name));
} }
@@ -2463,7 +2469,7 @@ void uGeneral::on_btnRmCommand_clicked()
ui->sgCommands->removeRow(row); ui->sgCommands->removeRow(row);
db->SaveTableWidget(ui->sgCommands); db->SaveTableWidget(ui->sgCommands);
m_commandProcessor->deleteCommand(commandName);
LogManager::instance()->info("uGeneral", "on_btnRmCommand_clicked", LogManager::instance()->info("uGeneral", "on_btnRmCommand_clicked",
QString("Удалена команда: %1").arg(commandName)); QString("Удалена команда: %1").arg(commandName));
} }
@@ -2486,11 +2492,11 @@ void uGeneral::on_btnEdtCommand_clicked()
QMessageBox::warning(this, "Внимание", "Введите новое имя команды!"); QMessageBox::warning(this, "Внимание", "Введите новое имя команды!");
return; return;
} }
QString oldCommand = ui->sgCommands->item(row, 0)->text();
ui->sgCommands->item(row, 0)->setText(newName); ui->sgCommands->item(row, 0)->setText(newName);
ui->sgCommands->item(row, 1)->setText(response); ui->sgCommands->item(row, 1)->setText(response);
db->SaveTableWidget(ui->sgCommands); db->SaveTableWidget(ui->sgCommands);
m_commandProcessor->editCommand(oldCommand, newName, response);
LogManager::instance()->info("uGeneral", "on_btnEdtCommand_clicked", LogManager::instance()->info("uGeneral", "on_btnEdtCommand_clicked",
QString("Отредактирована команда в строке %1").arg(row)); QString("Отредактирована команда в строке %1").arg(row));
} }
@@ -2507,7 +2513,6 @@ void uGeneral::loadQssFiles()
QDir systemStylesDir(systemStylesPath); QDir systemStylesDir(systemStylesPath);
if (systemStylesDir.exists()) { if (systemStylesDir.exists()) {
qDebug() << "Системные стили из:" << systemStylesPath;
loadStylesFromDirectory(systemStylesDir, "Системные"); loadStylesFromDirectory(systemStylesDir, "Системные");
} else { } else {
qWarning() << "Папка системных стилей не найдена:" << systemStylesPath; qWarning() << "Папка системных стилей не найдена:" << systemStylesPath;
@@ -2521,7 +2526,6 @@ void uGeneral::loadQssFiles()
QDir userStylesDir(userStylesPath); QDir userStylesDir(userStylesPath);
if (userStylesDir.exists()) { if (userStylesDir.exists()) {
qDebug() << "Пользовательские стили из:" << userStylesPath;
loadStylesFromDirectory(userStylesDir, "Пользовательские"); loadStylesFromDirectory(userStylesDir, "Пользовательские");
} else { } else {
qWarning() << "Папка пользовательских стилей не найдена:" << userStylesPath; qWarning() << "Папка пользовательских стилей не найдена:" << userStylesPath;
@@ -2537,8 +2541,6 @@ void uGeneral::loadQssFiles()
qWarning() << "Темы не найдены, создаем базовые"; qWarning() << "Темы не найдены, создаем базовые";
} }
qDebug() << "Загружено тем:" << ui->cbTheme->count() - 1; // Минус "Без темы"
} }
@@ -2954,7 +2956,6 @@ void uGeneral::sendMessageToServer(HttpServerChat *server, const QString &nickna
style.timeMsg = server->getMessageTimeout(); style.timeMsg = server->getMessageTimeout();
style.bColor = server->getBackgroundColor(); style.bColor = server->getBackgroundColor();
style.transparency = server->getTransparency(); style.transparency = server->getTransparency();
qDebug() << "sendMessageToServer";
// Убираем HTML теги из обычного текста для совместимости // Убираем HTML теги из обычного текста для совместимости
// (если сервер их не поддерживает, можно оставить только для ника) // (если сервер их не поддерживает, можно оставить только для ника)
style.nick = nickname; // Ник уже с цветом style.nick = nickname; // Ник уже с цветом
+2 -9
View File
@@ -136,10 +136,6 @@ private slots:
// ======================================================================== // ========================================================================
// СЛОТЫ ДЛЯ РАБОТЫ С WEBSOCKET (TWITCH) // СЛОТЫ ДЛЯ РАБОТЫ С WEBSOCKET (TWITCH)
// ======================================================================== // ========================================================================
void onStatus(const QString &statusText, int statusCode);
void onDisconnected(const QString &reason);
void onJoined(const QString &nickname);
void onMessage(const QString &message);
void handleNewMessage(const QString &message); void handleNewMessage(const QString &message);
void handleError(const QString &errorMessage); void handleError(const QString &errorMessage);
void handleConnected(); void handleConnected();
@@ -156,8 +152,6 @@ private slots:
// ======================================================================== // ========================================================================
void onAIResponseReceived(const QString &response); void onAIResponseReceived(const QString &response);
void onAIErrorOccurred(const QString &error); void onAIErrorOccurred(const QString &error);
void onNeuralResponse(const QString &response);
void onNeuralError(const QString &error);
void sendRequestToAI(const QString &q); void sendRequestToAI(const QString &q);
// ======================================================================== // ========================================================================
@@ -452,7 +446,8 @@ private:
void loadRandomRangesFromTableWidget(); void loadRandomRangesFromTableWidget();
void loadRandomResponseGroupsFromDatabase(); void loadRandomResponseGroupsFromDatabase();
void loadSoundsFromDatabase(); void loadSoundsFromDatabase();
// Инициализация базы данных void loadTextFromDatabase();
void loadTemplatesFromDatabase();
void initializeDatabase(); void initializeDatabase();
// Настройка пользовательского интерфейса // Настройка пользовательского интерфейса
void setupUI(); void setupUI();
@@ -466,8 +461,6 @@ private:
void setupUserWidget(); void setupUserWidget();
// Настройка обработчиков авторизации // Настройка обработчиков авторизации
void setupAuthHandlers(); void setupAuthHandlers();
// Инициализация нейронной сети
void initializeNeuralNetwork();
// Загрузка эмодзи // Загрузка эмодзи
void loadEmoties(); void loadEmoties();
void loadChatBadges(); void loadChatBadges();