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