chore: migrate /vips command to Helix call (#4053)
* feat(helix): create response model for VIP listing * feat(helix): stub out channel/vips request + handler * feat(helix): parse VIPs list from data and pass to callback * feat(helix): handle errors when getting VIP list then pass to callback * feat(command): add barebones handler for helix-based /vips * feat(command): provide better /vips output when user is not broadcaster * chore(format): bulk reformat with clang-format * chore(changelog): add entry for /vips Helix migration * fix(helix): use correct method when calling VIP list endpoint * fix(helix): use correct VIP list endpoint * chore(tidy): please clang-tidy by marking parameter as unused * feat(command): display unsorted VIP list returned from Helix API * feat(settings): clone raid timegate settings for /vips * feat(command): check /vips timegate setting before execution * feat(command): handle 0 VIPs from Helix response * feat(command): sort users alphabetically from Helix VIPs response * fix(command): highlight users in Helix /vips output to match IRC * fix(command): replace dynamic /vips error message with hardcoded string * chore(comment): remove TODO comment that was DONE * chore(format): bulk reformat using clang-format * fix(command): send 0 VIP message after creation * chore: apply suggestions from Felanbird * fix(helix): change mention of user ban to VIPs in VIP list error message * feat(helix): distinguish non-broadcaster auth error when getting VIPs * chore(command): move handling of non-broadcaster /vips usage to API response * chore(format): re-indent multiline string to get away from 80 char limit * reformat * fix tests Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -329,6 +329,23 @@ struct HelixChatSettings {
|
||||
}
|
||||
};
|
||||
|
||||
struct HelixVip {
|
||||
QString userId;
|
||||
QString userName;
|
||||
QString userLogin;
|
||||
|
||||
explicit HelixVip(const QJsonObject &jsonObject)
|
||||
: userId(jsonObject.value("user_id").toString())
|
||||
, userName(jsonObject.value("user_name").toString())
|
||||
, userLogin(jsonObject.value("user_login").toString())
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
// TODO(jammehcow): when implementing mod list, just alias HelixVip to HelixMod
|
||||
// as they share the same model.
|
||||
// Alternatively, rename base struct to HelixUser or something and alias both
|
||||
|
||||
enum class HelixAnnouncementColor {
|
||||
Blue,
|
||||
Green,
|
||||
@@ -502,6 +519,17 @@ enum class HelixWhisperError { // /w
|
||||
Forwarded,
|
||||
}; // /w
|
||||
|
||||
enum class HelixListVIPsError { // /vips
|
||||
Unknown,
|
||||
UserMissingScope,
|
||||
UserNotAuthorized,
|
||||
UserNotBroadcaster,
|
||||
Ratelimited,
|
||||
|
||||
// The error message is forwarded directly from the Twitch API
|
||||
Forwarded,
|
||||
}; // /vips
|
||||
|
||||
class IHelix
|
||||
{
|
||||
public:
|
||||
@@ -756,6 +784,12 @@ public:
|
||||
ResultCallback<> successCallback,
|
||||
FailureCallback<HelixWhisperError, QString> failureCallback) = 0;
|
||||
|
||||
// https://dev.twitch.tv/docs/api/reference#get-vips
|
||||
virtual void getChannelVIPs(
|
||||
QString broadcasterID,
|
||||
ResultCallback<std::vector<HelixVip>> successCallback,
|
||||
FailureCallback<HelixListVIPsError, QString> failureCallback) = 0;
|
||||
|
||||
virtual void update(QString clientId, QString oauthToken) = 0;
|
||||
|
||||
protected:
|
||||
@@ -1011,6 +1045,12 @@ public:
|
||||
ResultCallback<> successCallback,
|
||||
FailureCallback<HelixWhisperError, QString> failureCallback) final;
|
||||
|
||||
// https://dev.twitch.tv/docs/api/reference#get-vips
|
||||
void getChannelVIPs(
|
||||
QString broadcasterID,
|
||||
ResultCallback<std::vector<HelixVip>> successCallback,
|
||||
FailureCallback<HelixListVIPsError, QString> failureCallback) final;
|
||||
|
||||
void update(QString clientId, QString oauthToken) final;
|
||||
|
||||
static void initialize();
|
||||
|
||||
Reference in New Issue
Block a user