92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
package twitch
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
const twitchAPIURL = "https://api.twitch.tv/helix"
|
|
|
|
type Client struct {
|
|
authenticationManager AuthenticationManager
|
|
}
|
|
|
|
func NewTwitchClient(am *AuthenticationManager) *Client {
|
|
return &Client{
|
|
authenticationManager: *am,
|
|
}
|
|
}
|
|
|
|
type streamResp struct {
|
|
Data []struct {
|
|
ID string `json:"id"`
|
|
UserName string `json:"user_name"`
|
|
Title string `json:"title"`
|
|
GameName string `json:"game_name"`
|
|
StartedAt string `json:"started_at"`
|
|
} `json:"data"`
|
|
}
|
|
|
|
func (c *Client) doRequest(endpoint string, params map[string]string) ([]byte, error) {
|
|
token, err := c.authenticationManager.GetAccessToken()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
reqURL := twitchAPIURL + endpoint
|
|
req, err := http.NewRequest("GET", reqURL, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
q := req.URL.Query()
|
|
for k, v := range params {
|
|
q.Set(k, v)
|
|
}
|
|
req.URL.RawQuery = q.Encode()
|
|
|
|
req.Header.Set("Client-Id", c.authenticationManager.GetClientId())
|
|
req.Header.Set("Authorization", "Bearer "+token.Token)
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
return io.ReadAll(resp.Body)
|
|
}
|
|
|
|
func (c *Client) PollStream(channel string, liveChannel chan<- *StreamInfo) error {
|
|
body, err := c.doRequest("/streams", map[string]string{"user_login": channel})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var sr streamResp
|
|
if err := json.Unmarshal(body, &sr); err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(sr.Data) == 0 {
|
|
liveChannel <- &StreamInfo{UserName: channel, IsLive: false}
|
|
return nil
|
|
}
|
|
|
|
s := sr.Data[0]
|
|
started, _ := time.Parse(time.RFC3339, s.StartedAt)
|
|
|
|
liveChannel <- &StreamInfo{
|
|
ID: s.ID,
|
|
UserName: s.UserName,
|
|
Title: s.Title,
|
|
GameName: s.GameName,
|
|
StartedAt: started,
|
|
IsLive: true,
|
|
}
|
|
|
|
return nil
|
|
}
|