refactor: Remove Outcome from network requests (#4959)

This commit is contained in:
nerix
2023-11-12 14:51:51 +01:00
committed by GitHub
parent 95620e6e10
commit 6faf63c5c4
22 changed files with 122 additions and 228 deletions
+59 -106
View File
@@ -3,7 +3,6 @@
#include "common/Literals.hpp"
#include "common/NetworkRequest.hpp"
#include "common/NetworkResult.hpp"
#include "common/Outcome.hpp"
#include "common/QLogging.hpp"
#include "util/CancellationToken.hpp"
@@ -57,14 +56,14 @@ void Helix::fetchUsers(QStringList userIds, QStringList userLogins,
// TODO: set on success and on error
this->makeGet("users", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixUser> users;
@@ -75,8 +74,6 @@ void Helix::fetchUsers(QStringList userIds, QStringList userLogins,
}
successCallback(users);
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -138,15 +135,14 @@ void Helix::getChannelFollowers(
// TODO: set on success and on error
this->makeGet("channels/followers", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
if (root.empty())
{
failureCallback("Bad JSON response");
return Failure;
return;
}
successCallback(HelixGetChannelFollowersResponse(root));
return Success;
})
.onError([failureCallback](auto result) {
auto root = result.parseJson();
@@ -182,14 +178,14 @@ void Helix::fetchStreams(
// TODO: set on success and on error
this->makeGet("streams", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixStream> streams;
@@ -200,8 +196,6 @@ void Helix::fetchStreams(
}
successCallback(streams);
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -275,14 +269,14 @@ void Helix::fetchGames(QStringList gameIds, QStringList gameNames,
// TODO: set on success and on error
this->makeGet("games", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixGame> games;
@@ -293,8 +287,6 @@ void Helix::fetchGames(QStringList gameIds, QStringList gameNames,
}
successCallback(games);
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -311,14 +303,14 @@ void Helix::searchGames(QString gameName,
urlQuery.addQueryItem("query", gameName);
this->makeGet("search/categories", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixGame> games;
@@ -329,8 +321,6 @@ void Helix::searchGames(QString gameName,
}
successCallback(games);
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -369,20 +359,19 @@ void Helix::createClip(QString channelId,
this->makePost("clips", urlQuery)
.header("Content-Type", "application/json")
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback(HelixClipError::Unknown);
return Failure;
return;
}
HelixClip clip(data.toArray()[0].toObject());
successCallback(clip);
return Success;
})
.onError([failureCallback](auto result) {
switch (result.status().value_or(0))
@@ -425,14 +414,14 @@ void Helix::fetchChannels(
}
this->makeGet("channels", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixChannel> channels;
@@ -443,7 +432,6 @@ void Helix::fetchChannels(
}
successCallback(channels);
return Success;
})
.onError([failureCallback](auto /*result*/) {
failureCallback();
@@ -459,20 +447,19 @@ void Helix::getChannel(QString broadcasterId,
urlQuery.addQueryItem("broadcaster_id", broadcasterId);
this->makeGet("channels", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
HelixChannel channel(data.toArray()[0].toObject());
successCallback(channel);
return Success;
})
.onError([failureCallback](auto /*result*/) {
failureCallback();
@@ -495,20 +482,19 @@ void Helix::createStreamMarker(
this->makePost("streams/markers", QUrlQuery())
.json(payload)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback(HelixStreamMarkerError::Unknown);
return Failure;
return;
}
HelixStreamMarker streamMarker(data.toArray()[0].toObject());
successCallback(streamMarker);
return Success;
})
.onError([failureCallback](NetworkResult result) {
switch (result.status().value_or(0))
@@ -597,9 +583,8 @@ void Helix::blockUser(QString targetUserId, const QObject *caller,
this->makePut("users/blocks", urlQuery)
.caller(caller)
.onSuccess([successCallback](auto /*result*/) -> Outcome {
.onSuccess([successCallback](auto /*result*/) {
successCallback();
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -617,9 +602,8 @@ void Helix::unblockUser(QString targetUserId, const QObject *caller,
this->makeDelete("users/blocks", urlQuery)
.caller(caller)
.onSuccess([successCallback](auto /*result*/) -> Outcome {
.onSuccess([successCallback](auto /*result*/) {
successCallback();
return Success;
})
.onError([failureCallback](auto /*result*/) {
// TODO: make better xd
@@ -657,9 +641,8 @@ void Helix::updateChannel(QString broadcasterId, QString gameId,
urlQuery.addQueryItem("broadcaster_id", broadcasterId);
this->makePatch("channels", urlQuery)
.json(obj)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
successCallback(result);
return Success;
})
.onError([failureCallback](NetworkResult result) {
failureCallback();
@@ -680,9 +663,8 @@ void Helix::manageAutoModMessages(
this->makePost("moderation/automod/message", QUrlQuery())
.json(payload)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
successCallback();
return Success;
})
.onError([failureCallback, msgID, action](NetworkResult result) {
switch (result.status().value_or(0))
@@ -736,14 +718,14 @@ void Helix::getCheermotes(
urlQuery.addQueryItem("broadcaster_id", broadcasterId);
this->makeGet("bits/cheermotes", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixCheermoteSet> cheermoteSets;
@@ -754,7 +736,6 @@ void Helix::getCheermotes(
}
successCallback(cheermoteSets);
return Success;
})
.onError([broadcasterId, failureCallback](NetworkResult result) {
qCDebug(chatterinoTwitch)
@@ -774,21 +755,19 @@ void Helix::getEmoteSetData(QString emoteSetId,
urlQuery.addQueryItem("emote_set_id", emoteSetId);
this->makeGet("chat/emotes/set", urlQuery)
.onSuccess([successCallback, failureCallback,
emoteSetId](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback, emoteSetId](auto result) {
QJsonObject root = result.parseJson();
auto data = root.value("data");
if (!data.isArray() || data.toArray().isEmpty())
{
failureCallback();
return Failure;
return;
}
HelixEmoteSetData emoteSetData(data.toArray()[0].toObject());
successCallback(emoteSetData);
return Success;
})
.onError([failureCallback](NetworkResult result) {
// TODO: make better xd
@@ -806,15 +785,14 @@ void Helix::getChannelEmotes(
urlQuery.addQueryItem("broadcaster_id", broadcasterId);
this->makeGet("chat/emotes", urlQuery)
.onSuccess([successCallback,
failureCallback](NetworkResult result) -> Outcome {
.onSuccess([successCallback, failureCallback](NetworkResult result) {
QJsonObject root = result.parseJson();
auto data = root.value("data");
if (!data.isArray())
{
failureCallback();
return Failure;
return;
}
std::vector<HelixChannelEmote> channelEmotes;
@@ -825,7 +803,6 @@ void Helix::getChannelEmotes(
}
successCallback(channelEmotes);
return Success;
})
.onError([failureCallback](auto result) {
// TODO: make better xd
@@ -847,7 +824,7 @@ void Helix::updateUserChatColor(
this->makePut("chat/color", QUrlQuery())
.json(payload)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto obj = result.parseJson();
if (result.status() != 204)
{
@@ -858,7 +835,6 @@ void Helix::updateUserChatColor(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -931,7 +907,7 @@ void Helix::deleteChatMessages(
}
this->makeDelete("moderation/chat", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -941,7 +917,6 @@ void Helix::deleteChatMessages(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1016,7 +991,7 @@ void Helix::addChannelModerator(
urlQuery.addQueryItem("user_id", userID);
this->makePost("moderation/moderators", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1026,7 +1001,6 @@ void Helix::addChannelModerator(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1111,7 +1085,7 @@ void Helix::removeChannelModerator(
urlQuery.addQueryItem("user_id", userID);
this->makeDelete("moderation/moderators", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1121,7 +1095,6 @@ void Helix::removeChannelModerator(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1205,7 +1178,7 @@ void Helix::sendChatAnnouncement(
this->makePost("chat/announcements", urlQuery)
.json(body)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1215,7 +1188,6 @@ void Helix::sendChatAnnouncement(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1281,7 +1253,7 @@ void Helix::addChannelVIP(
urlQuery.addQueryItem("user_id", userID);
this->makePost("channels/vips", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1291,7 +1263,6 @@ void Helix::addChannelVIP(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1366,7 +1337,7 @@ void Helix::removeChannelVIP(
urlQuery.addQueryItem("user_id", userID);
this->makeDelete("channels/vips", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1376,7 +1347,6 @@ void Helix::removeChannelVIP(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1462,7 +1432,7 @@ void Helix::unbanUser(
urlQuery.addQueryItem("user_id", userID);
this->makeDelete("moderation/bans", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1472,7 +1442,6 @@ void Helix::unbanUser(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1574,11 +1543,9 @@ void Helix::startRaid(
urlQuery.addQueryItem("to_broadcaster_id", toBroadcasterID);
this->makePost("raids", urlQuery)
.onSuccess(
[successCallback, failureCallback](auto /*result*/) -> Outcome {
successCallback();
return Success;
})
.onSuccess([successCallback, failureCallback](auto /*result*/) {
successCallback();
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
{
@@ -1660,7 +1627,7 @@ void Helix::cancelRaid(
urlQuery.addQueryItem("broadcaster_id", broadcasterID);
this->makeDelete("raids", urlQuery)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -1670,7 +1637,6 @@ void Helix::cancelRaid(
}
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1828,7 +1794,7 @@ void Helix::updateChatSettings(
this->makePatch("chat/settings", urlQuery)
.json(payload)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -1838,7 +1804,6 @@ void Helix::updateChatSettings(
auto response = result.parseJson();
successCallback(HelixChatSettings(
response.value("data").toArray().first().toObject()));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -1957,7 +1922,7 @@ void Helix::fetchChatters(
}
this->makeGet("chat/chatters", urlQuery)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -1967,7 +1932,6 @@ void Helix::fetchChatters(
auto response = result.parseJson();
successCallback(HelixChatters(response));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2072,7 +2036,7 @@ void Helix::fetchModerators(
}
this->makeGet("moderation/moderators", urlQuery)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2082,7 +2046,6 @@ void Helix::fetchModerators(
auto response = result.parseJson();
successCallback(HelixModerators(response));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2164,7 +2127,7 @@ void Helix::banUser(QString broadcasterID, QString moderatorID, QString userID,
this->makePost("moderation/bans", urlQuery)
.json(payload)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2173,7 +2136,6 @@ void Helix::banUser(QString broadcasterID, QString moderatorID, QString userID,
}
// we don't care about the response
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2267,7 +2229,7 @@ void Helix::sendWhisper(
this->makePost("whispers", urlQuery)
.json(payload)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -2276,7 +2238,6 @@ void Helix::sendWhisper(
}
// we don't care about the response
successCallback();
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2416,7 +2377,7 @@ void Helix::getChannelVIPs(
this->makeGet("channels/vips", urlQuery)
.header("Content-Type", "application/json")
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2433,7 +2394,6 @@ void Helix::getChannelVIPs(
}
successCallback(channelVips);
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2509,18 +2469,17 @@ void Helix::startCommercial(
this->makePost("channels/commercial", QUrlQuery())
.json(payload)
.onSuccess([successCallback, failureCallback](auto result) -> Outcome {
.onSuccess([successCallback, failureCallback](auto result) {
auto obj = result.parseJson();
if (obj.isEmpty())
{
failureCallback(
Error::Unknown,
"Twitch didn't send any information about this error.");
return Failure;
return;
}
successCallback(HelixStartCommercialResponse(obj));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2605,7 +2564,7 @@ void Helix::getGlobalBadges(
using Error = HelixGetGlobalBadgesError;
this->makeGet("chat/badges/global", QUrlQuery())
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2615,7 +2574,6 @@ void Helix::getGlobalBadges(
auto response = result.parseJson();
successCallback(HelixGlobalBadges(response));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2658,7 +2616,7 @@ void Helix::getChannelBadges(
urlQuery.addQueryItem("broadcaster_id", broadcasterID);
this->makeGet("chat/badges", urlQuery)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2668,7 +2626,6 @@ void Helix::getChannelBadges(
auto response = result.parseJson();
successCallback(HelixChannelBadges(response));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2717,7 +2674,7 @@ void Helix::updateShieldMode(
this->makePut("moderation/shield_mode", urlQuery)
.json(payload)
.onSuccess([successCallback](auto result) -> Outcome {
.onSuccess([successCallback](auto result) {
if (result.status() != 200)
{
qCWarning(chatterinoTwitch)
@@ -2728,7 +2685,6 @@ void Helix::updateShieldMode(
const auto response = result.parseJson();
successCallback(
HelixShieldModeStatus(response["data"][0].toObject()));
return Success;
})
.onError([failureCallback](const auto &result) -> void {
if (!result.status())
@@ -2790,7 +2746,7 @@ void Helix::sendShoutout(
this->makePost("chat/shoutouts", urlQuery)
.header("Content-Type", "application/json")
.onSuccess([successCallback](NetworkResult result) -> Outcome {
.onSuccess([successCallback](NetworkResult result) {
if (result.status() != 204)
{
qCWarning(chatterinoTwitch)
@@ -2799,7 +2755,6 @@ void Helix::sendShoutout(
}
successCallback();
return Success;
})
.onError([failureCallback](const NetworkResult &result) -> void {
if (!result.status())
@@ -2944,33 +2899,33 @@ void Helix::paginate(const QString &url, const QUrlQuery &baseQuery,
CancellationToken &&cancellationToken)
{
auto onSuccess =
std::make_shared<std::function<Outcome(NetworkResult)>>(nullptr);
std::make_shared<std::function<void(NetworkResult)>>(nullptr);
// This is the actual callback passed to NetworkRequest.
// It wraps the shared-ptr.
auto onSuccessCb = [onSuccess](const auto &res) -> Outcome {
auto onSuccessCb = [onSuccess](const auto &res) {
return (*onSuccess)(res);
};
*onSuccess = [this, onPage = std::move(onPage), onError, onSuccessCb,
url{url}, baseQuery{baseQuery},
cancellationToken = std::move(cancellationToken)](
const NetworkResult &res) -> Outcome {
cancellationToken =
std::move(cancellationToken)](const NetworkResult &res) {
if (cancellationToken.isCancelled())
{
return Success;
return;
}
const auto json = res.parseJson();
if (!onPage(json))
{
// The consumer doesn't want any more pages
return Success;
return;
}
auto cursor = json["pagination"_L1]["cursor"_L1].toString();
if (cursor.isEmpty())
{
return Success;
return;
}
auto query = baseQuery;
@@ -2981,8 +2936,6 @@ void Helix::paginate(const QString &url, const QUrlQuery &baseQuery,
.onSuccess(onSuccessCb)
.onError(onError)
.execute();
return Success;
};
this->makeGet(url, baseQuery)