#pragma once #include "common/NetworkRequest.hpp" #include #include #include #include #include #include #include #include #include namespace chatterino { using HelixFailureCallback = std::function; template using ResultCallback = std::function; struct HelixUser { QString id; QString login; QString displayName; QString createdAt; QString description; QString profileImageUrl; int viewCount; explicit HelixUser(QJsonObject jsonObject) : id(jsonObject.value("id").toString()) , login(jsonObject.value("login").toString()) , displayName(jsonObject.value("display_name").toString()) , createdAt(jsonObject.value("created_at").toString()) , description(jsonObject.value("description").toString()) , profileImageUrl(jsonObject.value("profile_image_url").toString()) , viewCount(jsonObject.value("view_count").toInt()) { } }; struct HelixUsersFollowsRecord { QString fromId; QString fromName; QString toId; QString toName; QString followedAt; // date time object HelixUsersFollowsRecord() : fromId("") , fromName("") , toId("") , toName("") , followedAt("") { } explicit HelixUsersFollowsRecord(QJsonObject jsonObject) : fromId(jsonObject.value("from_id").toString()) , fromName(jsonObject.value("from_name").toString()) , toId(jsonObject.value("to_id").toString()) , toName(jsonObject.value("to_name").toString()) , followedAt(jsonObject.value("followed_at").toString()) { } }; struct HelixUsersFollowsResponse { int total; std::vector data; explicit HelixUsersFollowsResponse(QJsonObject jsonObject) : total(jsonObject.value("total").toInt()) { const auto &jsonData = jsonObject.value("data").toArray(); std::transform(jsonData.begin(), jsonData.end(), std::back_inserter(this->data), [](const QJsonValue &record) { return HelixUsersFollowsRecord(record.toObject()); }); } }; struct HelixStream { QString id; // stream id QString userId; QString userName; QString gameId; QString type; QString title; int viewerCount; QString startedAt; QString language; QString thumbnailUrl; HelixStream() : id("") , userId("") , userName("") , gameId("") , type("") , title("") , viewerCount() , startedAt("") , language("") , thumbnailUrl("") { } explicit HelixStream(QJsonObject jsonObject) : id(jsonObject.value("id").toString()) , userId(jsonObject.value("user_id").toString()) , userName(jsonObject.value("user_name").toString()) , gameId(jsonObject.value("game_id").toString()) , type(jsonObject.value("type").toString()) , title(jsonObject.value("title").toString()) , viewerCount(jsonObject.value("viewer_count").toInt()) , startedAt(jsonObject.value("started_at").toString()) , language(jsonObject.value("language").toString()) , thumbnailUrl(jsonObject.value("thumbnail_url").toString()) { } }; struct HelixGame { QString id; // stream id QString name; QString boxArtUrl; explicit HelixGame(QJsonObject jsonObject) : id(jsonObject.value("id").toString()) , name(jsonObject.value("name").toString()) , boxArtUrl(jsonObject.value("box_art_url").toString()) { } }; struct HelixClip { QString id; // clip slug QString editUrl; explicit HelixClip(QJsonObject jsonObject) : id(jsonObject.value("id").toString()) , editUrl(jsonObject.value("edit_url").toString()) { } }; struct HelixChannel { QString userId; QString name; QString language; QString gameId; QString gameName; QString title; explicit HelixChannel(QJsonObject jsonObject) : userId(jsonObject.value("broadcaster_id").toString()) , name(jsonObject.value("broadcaster_name").toString()) , language(jsonObject.value("broadcaster_language").toString()) , gameId(jsonObject.value("game_id").toString()) , gameName(jsonObject.value("game_name").toString()) , title(jsonObject.value("title").toString()) { } }; struct HelixStreamMarker { QString createdAt; QString description; QString id; int positionSeconds; explicit HelixStreamMarker(QJsonObject jsonObject) : createdAt(jsonObject.value("created_at").toString()) , description(jsonObject.value("description").toString()) , id(jsonObject.value("id").toString()) , positionSeconds(jsonObject.value("position_seconds").toInt()) { } }; struct HelixBlock { QString userId; QString userName; QString displayName; explicit HelixBlock(QJsonObject jsonObject) : userId(jsonObject.value("user_id").toString()) , userName(jsonObject.value("user_login").toString()) , displayName(jsonObject.value("display_name").toString()) { } }; enum class HelixClipError { Unknown, ClipsDisabled, UserNotAuthenticated, }; enum class HelixStreamMarkerError { Unknown, UserNotAuthorized, UserNotAuthenticated, }; class Helix final : boost::noncopyable { public: // https://dev.twitch.tv/docs/api/reference#get-users void fetchUsers(QStringList userIds, QStringList userLogins, ResultCallback> successCallback, HelixFailureCallback failureCallback); void getUserByName(QString userName, ResultCallback successCallback, HelixFailureCallback failureCallback); void getUserById(QString userId, ResultCallback successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#get-users-follows void fetchUsersFollows( QString fromId, QString toId, ResultCallback successCallback, HelixFailureCallback failureCallback); void getUserFollowers( QString userId, ResultCallback successCallback, HelixFailureCallback failureCallback); void getUserFollow( QString userId, QString targetId, ResultCallback successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#get-streams void fetchStreams(QStringList userIds, QStringList userLogins, ResultCallback> successCallback, HelixFailureCallback failureCallback); void getStreamById(QString userId, ResultCallback successCallback, HelixFailureCallback failureCallback); void getStreamByName(QString userName, ResultCallback successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#get-games void fetchGames(QStringList gameIds, QStringList gameNames, ResultCallback> successCallback, HelixFailureCallback failureCallback); void getGameById(QString gameId, ResultCallback successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#create-user-follows void followUser(QString userId, QString targetId, std::function successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#delete-user-follows void unfollowUser(QString userId, QString targetlId, std::function successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#create-clip void createClip(QString channelId, ResultCallback successCallback, std::function failureCallback, std::function finallyCallback); // https://dev.twitch.tv/docs/api/reference#get-channel-information void getChannel(QString broadcasterId, ResultCallback successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference/#create-stream-marker void createStreamMarker( QString broadcasterId, QString description, ResultCallback successCallback, std::function failureCallback); // https://dev.twitch.tv/docs/api/reference#get-user-block-list void loadBlocks(QString userId, ResultCallback> successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#block-user void blockUser(QString targetUserId, std::function successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#unblock-user void unblockUser(QString targetUserId, std::function successCallback, HelixFailureCallback failureCallback); // https://dev.twitch.tv/docs/api/reference#modify-channel-information void updateChannel(QString broadcasterId, QString gameId, QString language, QString title, std::function successCallback, HelixFailureCallback failureCallback); void update(QString clientId, QString oauthToken); static void initialize(); private: NetworkRequest makeRequest(QString url, QUrlQuery urlQuery); QString clientId; QString oauthToken; }; Helix *getHelix(); } // namespace chatterino