+ награды за баллы
- создание - изменение - удаление - отображение
This commit is contained in:
+287
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user