+ награды за баллы

- создание
- изменение
- удаление
- отображение
This commit is contained in:
2026-02-15 11:26:19 +03:00
parent 63b7fa4ea1
commit ae4121157d
8 changed files with 608 additions and 19 deletions
+287 -1
View File
@@ -2,6 +2,7 @@
#include "fcreatenotify.h"
#include "filemanager.h"
#include "logmanager.h"
#include "ttw_types.h"
#include "ui_ugeneral.h"
#include <QStandardPaths>
#include <QDesktopServices>
@@ -187,7 +188,7 @@ void uGeneral::setupButtonIcons() {
button->setIcon(tabIcons[11]);
}
}
else if (buttonName.contains("edt")) {
else if (buttonName.contains("edt") || (buttonName.contains("edit"))) {
button->setIcon(tabIcons[10]);
}
else if (buttonName.contains("open")) {
@@ -1805,6 +1806,12 @@ void uGeneral::handleNewMessage(const QString &message)
if (m_userWidget) {
m_userWidget->updateStatistics();
}
if (ui->cbTextToSpeach->isChecked())
{
return;
}
playNotify(msg.isMod, msg.isVIP, msg.isSubscriber);
QString processedMessage = processTwitchMessage(msg);
@@ -3190,3 +3197,282 @@ void uGeneral::on_btnCounterAtoText_clicked()
cursor.insertText("|)" + ui->cbCounters->currentText() + "|)");
}
void uGeneral::on_btnCRGet_clicked()
{
// Очистка старых данных
qDeleteAll(m_rewards);
m_rewards.clear();
// 1. Получаем ВСЕ награды канала
QVector<TCustomReward*> allRewards;
twitchAPI->getCustomRewards(allRewards, false);
// 2. Получаем только управляемые ботом
QVector<TCustomReward*> manageableRewards;
twitchAPI->getCustomRewards(manageableRewards, true);
// 3. Формируем множество ID управляемых наград
QSet<QString> manageableIds;
for (auto *r : manageableRewards) {
manageableIds.insert(r->id);
}
// 4. Освобождаем manageableRewards (они больше не нужны)
qDeleteAll(manageableRewards);
manageableRewards.clear();
// 5. Проставляем флаг для всех наград
for (auto *r : allRewards) {
r->isManagedByBroadcaster = manageableIds.contains(r->id);
}
// 6. Сохраняем в член класса
m_rewards = allRewards;
// 7. Заполняем таблицу
ui->sgCustomRewards->setRowCount(0);
ui->sgCustomRewards->setColumnCount(3);
QStringList headers = {"Название", "Цена", "Описание"};
ui->sgCustomRewards->setHorizontalHeaderLabels(headers);
ui->sgCustomRewards->setRowCount(m_rewards.size());
for (int row = 0; row < m_rewards.size(); ++row) {
TCustomReward *reward = m_rewards[row];
QTableWidgetItem *nameItem = new QTableWidgetItem(reward->title);
nameItem->setData(Qt::UserRole, reward->id);
ui->sgCustomRewards->setItem(row, 0, nameItem);
QTableWidgetItem *costItem = new QTableWidgetItem(QString::number(reward->cost));
ui->sgCustomRewards->setItem(row, 1, costItem);
QTableWidgetItem *descItem = new QTableWidgetItem(reward->prompt);
ui->sgCustomRewards->setItem(row, 2, descItem);
// Устанавливаем цвет фона
QColor bgColor = reward->isManagedByBroadcaster ? QColor(144,238,144) : QColor(255,200,200);
nameItem->setForeground(bgColor);
costItem->setForeground(bgColor);
descItem->setForeground(bgColor);
}
// Сбрасываем поля и кнопки
ui->edtCRName->clear();
ui->edtCRPrompt->clear();
ui->sbCRCost->setValue(0);
ui->btnCREdit->setEnabled(false);
ui->btnCRDelete->setEnabled(false);
}
void uGeneral::on_sgCustomRewards_cellClicked(int row, int column)
{
// Получаем ID награды из первого столбца
QTableWidgetItem *idItem = ui->sgCustomRewards->item(row, 0);
if (!idItem) return;
QString rewardId = idItem->data(Qt::UserRole).toString();
// Ищем объект награды в m_rewards по ID
TCustomReward *reward = nullptr;
for (auto *r : m_rewards) {
if (r->id == rewardId) {
reward = r;
break;
}
}
if (!reward) return; // защита от ошибок
// Заполняем поля ввода
ui->edtCRName->setText(reward->title);
ui->edtCRPrompt->setText(reward->prompt);
ui->sbCRCost->setValue(reward->cost);
// Активируем кнопки только если награда управляется ботом
bool canEdit = reward->isManagedByBroadcaster;
ui->btnCREdit->setEnabled(canEdit);
ui->btnCRDelete->setEnabled(canEdit);
}
void uGeneral::on_sgCustomRewards_cellDoubleClicked(int row, int column)
{
}
void uGeneral::on_btnCRAdd_clicked()
{
// 1. Получаем данные из интерфейса
QString title = ui->edtCRName->text().trimmed();
QString prompt = ui->edtCRPrompt->text().trimmed();
int cost = ui->sbCRCost->value();
// 2. Простейшая валидация
if (title.isEmpty()) {
QMessageBox::warning(this, "Ошибка", "Название награды не может быть пустым.");
return;
}
if (cost <= 0) {
QMessageBox::warning(this, "Ошибка", "Стоимость должна быть больше 0.");
return;
}
// 3. Вызываем API для создания награды
// Предполагаем, что чекбокс "Требуется ввод пользователя" отсутствует, ставим false
TCustomReward *newReward = twitchAPI->createCustomReward(title, QString::number(cost), prompt, false);
if (!newReward) {
QMessageBox::critical(this, "Ошибка", "Не удалось создать награду. Проверьте подключение к Twitch и права токена.");
return;
}
// 4. Уведомляем пользователя об успехе
QMessageBox::information(this, "Успех", "Награда успешно создана.");
// 5. Очищаем поля ввода (опционально)
ui->edtCRName->clear();
ui->edtCRPrompt->clear();
ui->sbCRCost->setValue(0);
// 6. Обновляем список наград, чтобы новая появилась в таблице
on_btnCRGet_clicked(); // перезагружает и обновляет таблицу
// Важно: newReward был создан в куче, но после вызова on_btnCRGet_clicked()
// старые указатели будут удалены, а новые получены. Указатель newReward
// становится недействительным, поэтому не используем его дальше.
}
void uGeneral::on_btnCREdit_clicked()
{
// 1. Проверяем, что выбрана строка в таблице
int currentRow = ui->sgCustomRewards->currentRow();
if (currentRow < 0) {
QMessageBox::warning(this, "Ошибка", "Выберите награду для редактирования.");
return;
}
// 2. Извлекаем ID награды из первого столбца (хранится в Qt::UserRole)
QTableWidgetItem *idItem = ui->sgCustomRewards->item(currentRow, 0);
if (!idItem) return;
QString rewardId = idItem->data(Qt::UserRole).toString();
// 3. Ищем объект награды в векторе m_rewards
TCustomReward *reward = nullptr;
for (auto *r : m_rewards) {
if (r->id == rewardId) {
reward = r;
break;
}
}
if (!reward) {
QMessageBox::critical(this, "Ошибка", "Не удалось найти данные награды.");
return;
}
// 4. Проверяем, что награда управляется ботом (кнопка должна быть активна только для таких)
if (!reward->isManagedByBroadcaster) {
QMessageBox::warning(this, "Ошибка", "Нельзя редактировать награду, созданную не ботом.");
return;
}
// 5. Получаем новые значения из полей ввода
QString newTitle = ui->edtCRName->text().trimmed();
QString newPrompt = ui->edtCRPrompt->text().trimmed();
int newCost = ui->sbCRCost->value();
// 6. Валидация
if (newTitle.isEmpty()) {
QMessageBox::warning(this, "Ошибка", "Название не может быть пустым.");
return;
}
if (newCost <= 0) {
QMessageBox::warning(this, "Ошибка", "Стоимость должна быть больше 0.");
return;
}
// 7. Обновляем данные в объекте
reward->title = newTitle;
reward->prompt = newPrompt;
reward->cost = newCost;
// 8. Вызываем API для обновления награды
twitchAPI->updateCustomReward(reward); // предполагается, что метод возвращает void
// 9. Обновляем список наград (гарантирует синхронизацию с Twitch)
on_btnCRGet_clicked();
// 10. Уведомляем пользователя об успехе
QMessageBox::information(this, "Успех", "Награда обновлена.");
}
void uGeneral::on_btnCRDelete_clicked()
{
// 1. Проверяем, что выбрана строка в таблице
int currentRow = ui->sgCustomRewards->currentRow();
if (currentRow < 0) {
QMessageBox::warning(this, "Ошибка", "Выберите награду для удаления.");
return;
}
// 2. Извлекаем ID награды из первого столбца
QTableWidgetItem *idItem = ui->sgCustomRewards->item(currentRow, 0);
if (!idItem) return;
QString rewardId = idItem->data(Qt::UserRole).toString();
// 3. Находим объект награды в m_rewards (для проверки управляемости)
TCustomReward *reward = nullptr;
for (auto *r : m_rewards) {
if (r->id == rewardId) {
reward = r;
break;
}
}
if (!reward) {
QMessageBox::critical(this, "Ошибка", "Не удалось найти данные награды.");
return;
}
// 4. Проверяем, что награда управляется ботом
if (!reward->isManagedByBroadcaster) {
QMessageBox::warning(this, "Ошибка", "Нельзя удалить награду, созданную не ботом.");
return;
}
// 5. Запрашиваем подтверждение
QString title = reward->title;
QMessageBox::StandardButton reply = QMessageBox::question(
this,
"Подтверждение удаления",
QString("Вы уверены, что хотите удалить награду \"%1\"?").arg(title),
QMessageBox::Yes | QMessageBox::No
);
if (reply != QMessageBox::Yes) {
return; // пользователь отменил
}
// 6. Вызываем API для удаления
bool success = twitchAPI->deleteCustomReward(rewardId); // предполагаем, что метод возвращает bool
if (!success) {
QMessageBox::critical(this, "Ошибка", "Не удалось удалить награду. Проверьте подключение к Twitch и права токена.");
return;
}
// 7. Уведомляем об успехе
QMessageBox::information(this, "Успех", "Награда успешно удалена.");
// 8. Обновляем список наград (удалённая исчезнет)
on_btnCRGet_clicked();
// 9. Сбрасываем поля ввода и отключаем кнопки (так как выбор пропал)
ui->edtCRName->clear();
ui->edtCRPrompt->clear();
ui->sbCRCost->setValue(0);
ui->btnCREdit->setEnabled(false);
ui->btnCRDelete->setEnabled(false);
}