backend code
This commit is contained in:
86
server/twitch/client.go
Normal file
86
server/twitch/client.go
Normal file
@@ -0,0 +1,86 @@
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user