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

- создание
- изменение
- удаление
- отображение
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
+113
View File
@@ -1,5 +1,6 @@
#include "ttw_api.h"
#include "qeventloop.h"
#include "ttw_types.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
@@ -692,3 +693,115 @@ bool TTwAPI::validateTwitchToken(const QString &tokenName,
return false;
}
}
void TTwAPI::getCustomRewards(QVector<TCustomReward*> &rewards, bool onlyManageable)
{
QString roomId = getRoomId();
if (roomId.isEmpty()) return;
QString url = "channel_points/custom_rewards?broadcaster_id=" + roomId;
if (onlyManageable) {
url += "&only_manageable_rewards=true";
}
QString response = getTTW(url, m_clientId, true);
if (response.isEmpty()) return;
QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8());
if (!doc.isObject()) return;
QJsonArray data = doc.object()["data"].toArray();
for (const QJsonValue &val : data) {
QJsonObject obj = val.toObject();
TCustomReward *reward = new TCustomReward;
reward->id = obj["id"].toString();
reward->title = obj["title"].toString();
reward->cost = obj["cost"].toInt();
reward->prompt = obj["prompt"].toString();
reward->isUserInputRequired = obj["is_user_input_required"].toBool();
reward->isEnabled = obj["is_enabled"].toBool();
// Для manageable запроса все награды по определению управляемы
reward->isManagedByBroadcaster = onlyManageable;
rewards.append(reward);
}
}
TCustomReward* TTwAPI::createCustomReward(const QString &title, const QString &cost,
const QString &prompt, bool isUserInput)
{
QString roomId = getRoomId();
if (roomId.isEmpty()) return nullptr;
QJsonObject body;
body["title"] = title;
body["cost"] = cost.toInt();
if (!prompt.isEmpty()) body["prompt"] = prompt;
body["is_user_input_required"] = isUserInput;
// Можно добавить и другие параметры: is_enabled, color и т.д.
QJsonDocument doc(body);
QString response = postTTW("channel_points/custom_rewards?broadcaster_id=" + roomId,
m_clientId, doc.toJson(), true);
if (response.isEmpty()) return nullptr;
QJsonDocument respDoc = QJsonDocument::fromJson(response.toUtf8());
if (!respDoc.isObject()) return nullptr;
QJsonArray data = respDoc.object()["data"].toArray();
if (data.isEmpty()) return nullptr;
QJsonObject obj = data[0].toObject();
TCustomReward *reward = new TCustomReward;
reward->id = obj["id"].toString();
reward->title = obj["title"].toString();
reward->cost = obj["cost"].toInt();
reward->prompt = obj["prompt"].toString();
reward->isUserInputRequired = obj["is_user_input_required"].toBool();
reward->isEnabled = obj["is_enabled"].toBool();
return reward;
}
void TTwAPI::updateCustomReward(TCustomReward* reward)
{
if (!reward) return;
QString roomId = getRoomId();
if (roomId.isEmpty()) return;
QJsonObject body;
if (!reward->title.isEmpty()) body["title"] = reward->title;
body["cost"] = reward->cost;
if (!reward->prompt.isEmpty()) body["prompt"] = reward->prompt;
body["is_user_input_required"] = reward->isUserInputRequired;
body["is_enabled"] = reward->isEnabled;
QJsonDocument doc(body);
patchTTW(QString("channel_points/custom_rewards?broadcaster_id=%1&id=%2")
.arg(roomId, reward->id),
m_clientId, doc.toJson(), true);
}
bool TTwAPI::deleteCustomReward(const QString &id)
{
QString roomId = getRoomId();
if (roomId.isEmpty()) return false;
deleteTTW("channel_points/custom_rewards?broadcaster_id=" + roomId + "&id=" + id,
m_clientId, true);
return true; // или проверка HTTP-статуса, но deleteTTW возвращает пустую строку при ошибке
}
void TTwAPI::updateRedemptionStatus(TCustomRewardEvent* event)
{
// event содержит id награды, id redemption и новый статус (COMPLETED/CANCELED)
QString roomId = getRoomId();
if (roomId.isEmpty()) return;
QJsonObject body;
body["status"] = event->status; // "COMPLETED" или "CANCELED"
QJsonDocument doc(body);
patchTTW(QString("channel_points/custom_rewards/redemptions?broadcaster_id=%1&reward_id=%2&id=%3")
.arg(roomId, event->rewardId, event->redemptionId),
m_clientId, doc.toJson(), true);
}