go-twitch/api/goals/get_creator_goals.go

113 lines
4.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package goals
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
"go.fifitido.net/twitch/api/endpoint"
)
type GetCreatorGoalsResponse struct {
Data []Goal `json:"data"`
}
type Goal struct {
// An ID that identifies this goal.
Id string `json:"id"`
// An ID that identifies the broadcaster that created the goal.
BroadcasterId string `json:"broadcaster_id"`
// The broadcasters display name.
BroadcasterName string `json:"broadcaster_name"`
// The broadcasters login name.
BroadcasterLogin string `json:"broadcaster_login"`
// The type of goal. Possible values are:
//
// follower — The goal is to increase followers.
//
// subscription — The goal is to increase subscriptions.
// This type shows the net increase or decrease in tier points associated with the subscriptions.
//
// subscription_count — The goal is to increase subscriptions.
// This type shows the net increase or decrease in the number of subscriptions.
//
// new_subscription — The goal is to increase subscriptions.
// This type shows only the net increase in tier points associated with the subscriptions
// (it does not account for users that unsubscribed since the goal started).
//
// new_subscription_count — The goal is to increase subscriptions.
// This type shows only the net increase in the number of subscriptions
// (it does not account for users that unsubscribed since the goal started).
Type string `json:"type"`
// A description of the goal. Is an empty string if not specified.
Description string `json:"description"`
// The goals current value.
//
// The goals type determines how this value is increased or decreased.
//
// If type is follower, this field is set to the broadcasters current number of followers.
// This number increases with new followers and decreases when users unfollow the broadcaster.
//
// If type is subscription, this field is increased and decreased by the points value associated with the subscription tier.
// For example, if a tier-two subscription is worth 2 points, this field is increased or decreased by 2, not 1.
//
// If type is subscription_count, this field is increased by 1 for each new subscription and decreased by 1 for each user that unsubscribes.
//
// If type is new_subscription, this field is increased by the points value associated with the subscription tier.
// For example, if a tier-two subscription is worth 2 points, this field is increased by 2, not 1.
//
// If type is new_subscription_count, this field is increased by 1 for each new subscription.
CurrentAmount int `json:"current_amount"`
// The goals target value.
//
// For example, if the broadcaster has 200 followers before creating the goal,
// and their goal is to double that number, this field is set to 400.
TargetAmount int `json:"target_amount"`
// The UTC date and time (in RFC3339 format) that the broadcaster created the goal.
CreatedAt time.Time `json:"created_at"`
}
// Gets the broadcasters list of active goals. Use this endpoint to get the current progress of each goal.
//
// Instead of polling for the progress of a goal, consider subscribing to receive notifications when a goal makes progress
// using the channel.goal.progress subscription type. Read More: https://dev.twitch.tv/docs/api/goals#requesting-event-notifications
//
// Requires a user access token that includes the channel:read:goals scope.
func (g *Goals) GetCreatorGoals(ctx context.Context, broadcasterID string) (*GetCreatorGoalsResponse, error) {
v := url.Values{"broadcaster_id": {broadcasterID}}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint.Make(g.baseUrl, "goals", v), nil)
if err != nil {
return nil, err
}
res, err := g.client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
statusOK := res.StatusCode >= 200 && res.StatusCode < 300
if !statusOK {
return nil, fmt.Errorf("failed to get creator goals (%d)", res.StatusCode)
}
var data GetCreatorGoalsResponse
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
return nil, err
}
return &data, nil
}