package channels import ( "context" "encoding/json" "fmt" "net/http" "time" "github.com/google/go-querystring/query" "go.fifitido.net/twitch/api/endpoint" "go.fifitido.net/twitch/api/types" ) type GetChannelFollowersParams struct { // A user’s ID. Use this parameter to see whether the user follows this broadcaster. // If specified, the response contains this user if they follow the broadcaster. // If not specified, the response contains all users that follow the broadcaster. // // Using this parameter requires both a user access token with the moderator:read:followers scope and the user ID // in the access token match the broadcaster_id or be the user ID for a moderator of the specified broadcaster. UserID *string `url:"user_id,omitempty"` // The broadcaster’s ID. Returns the list of users that follow this broadcaster. BroadcasterID string `url:"broadcaster_id"` // The maximum number of items to return per page in the response. The minimum page size is 1 item per page and the maximum is 100. The default is 20. First *int `url:"first,omitempty"` // The cursor used to get the next page of results. The Pagination object in the response contains the cursor’s value. // Read more: https://dev.twitch.tv/docs/api/guide#pagination After *types.Cursor `url:"after,omitempty"` } type GetChannelFollowersResponse struct { // The list of users that follow the specified broadcaster. The list is in descending order by followed_at (with the most recent follower first). // The list is empty if nobody follows the broadcaster, the specified user_id isn’t in the follower list, // the user access token is missing the moderator:read:followers scope, or the user isn’t the broadcaster or moderator for the channel. Data []ChannelFollower `json:"data"` // Contains the information used to page through the list of results. The object is empty if there are no more pages left to page through. // Read more: https://dev.twitch.tv/docs/api/guide#pagination Pagination types.Pagination `json:"pagination"` // The total number of users that follow this broadcaster. // As someone pages through the list, the number of users may change as users follow or unfollow the broadcaster. Total int `json:"total"` } type ChannelFollower struct { // An ID that uniquely identifies the user that’s following the broadcaster. UserID string `json:"user_id"` // The user’s login name. UserLogin string `json:"user_login"` // The user’s display name. UserName string `json:"user_name"` // The UTC timestamp when the user started following the broadcaster. FollowedAt time.Time `json:"followed_at"` } // Gets a list of users that follow the specified broadcaster. You can also use this endpoint to see whether a specific user follows the broadcaster. // // - Requires a user access token that includes the moderator:read:followers scope. // // - The ID in the broadcaster_id query parameter must match the user ID in the access token or the user ID in the access token must be a moderator for the specified broadcaster. // // This endpoint will return specific follower information only if both of the above are true. // If a scope is not provided or the user isn’t the broadcaster or a moderator for the specified channel, // only the total follower count will be included in the response. func (c *Channels) GetChannelFollowers(ctx context.Context, params *GetChannelFollowersParams) (*GetChannelFollowersResponse, error) { v, _ := query.Values(params) req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint.Make(c.baseUrl, "channels/followers", v), nil) if err != nil { return nil, err } res, err := c.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 channel followers (%d)", res.StatusCode) } var data GetChannelFollowersResponse if err := json.NewDecoder(res.Body).Decode(&data); err != nil { return nil, err } return &data, nil }