rumble-livestream-lib-go/livestream.go

121 lines
3.2 KiB
Go
Raw Permalink Normal View History

2023-12-08 15:59:20 +00:00
package rumblelivestreamlib
2023-12-08 18:55:04 +00:00
import (
"encoding/json"
"fmt"
"io"
"net/http"
2024-01-06 16:39:59 +00:00
"time"
2023-12-08 18:55:04 +00:00
)
type Follower struct {
Username string `json:"username"`
FollowedOn string `json:"followed_on"`
}
type Followers struct {
NumFollowers int64 `json:"num_followers"`
NumFollowersTotal int64 `json:"num_followers_total"`
LatestFollower Follower `json:"latest_follower"`
RecentFollowers []Follower `json:"recent_followers"`
}
type Subscriber struct {
User string `json:"user"`
Username string `json:"username"`
AmountCents int64 `json:"amount_cents"`
AmountDollars int64 `json:"amount_dollars"`
SubscribedOn string `json:"subscribed_on"`
}
type Subscribers struct {
NumSubscribers int64 `json:"num_subscribers"`
LatestSubscriber Subscriber `json:"latest_subscriber"`
RecentSubscribers []Subscriber `json:"recent_subscribers"`
}
type Category struct {
Slug string `json:"slug"`
Title string `json:"title"`
}
type Categories struct {
Primary Category `json:"primary"`
Secondary Category `json:"secondary"`
}
type Badge string
type Message struct {
Username string `json:"username"`
Badges []Badge `json:"badges"`
Text string `json:"text"`
CreatedOn string `json:"created_on"`
}
type Rant struct {
Message
ExpiresOn string `json:"expires_on"`
AmountCents int64 `json:"amount_cents"`
AmountDollars int64 `json:"amount_dollars"`
}
type Chat struct {
LatestMessage Message `json:"latest_message"`
RecentMessages []Message `json:"recent_messages"`
LatestRant Rant `json:"latest_rant"`
RecentRants []Rant `json:"recent_rants"`
}
type Livestream struct {
ID string `json:"id"`
Title string `json:"title"`
CreatedOn string `json:"created_on"`
IsLive bool `json:"is_live"`
Categories Categories `json:"categories"`
StreamKey string `json:"stream_key"`
Likes int64 `json:"likes"`
Dislikes int64 `json:"dislikes"`
WatchingNow int64 `json:"watching_now"`
Chat Chat `json:"chat"`
}
type LivestreamResponse struct {
Now int64 `json:"now"`
Type string `json:"type"`
UserID string `json:"user_id"`
Username string `json:"username"`
ChannelID int64 `json:"channel_id"`
ChannelName string `json:"channel_name"`
2023-12-08 18:55:04 +00:00
MaxNumResults int64 `json:"max_num_results"`
Followers Followers `json:"followers"`
Subscribers Subscribers `json:"subscribers"`
Livestreams []Livestream `json:"livestreams"`
}
func (c *Client) Request() (*LivestreamResponse, error) {
2024-01-06 16:39:59 +00:00
hcl := http.Client{Timeout: 30 * time.Second}
resp, err := hcl.Get(c.ApiKey)
2023-12-08 18:55:04 +00:00
if err != nil {
return nil, pkgErr("http Get request returned error", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, pkgErr(fmt.Sprintf("http response status not %s", http.StatusText(http.StatusOK)), fmt.Errorf("%s", resp.Status))
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, pkgErr("error reading response body", err)
}
var lr LivestreamResponse
err = json.Unmarshal(body, &lr)
if err != nil {
return nil, pkgErr("error unmarshaling response body", err)
}
return &lr, nil
}