Skip to content
Snippets Groups Projects
Commit 25034b1e authored by Simon Kirsten's avatar Simon Kirsten
Browse files

Twitch helix api proxy patch

parent a388d7c5
No related branches found
No related tags found
No related merge requests found
...@@ -11,12 +11,7 @@ import ( ...@@ -11,12 +11,7 @@ import (
func ListenAndServe(listenAddr string) error { func ListenAndServe(listenAddr string) error {
r := chi.NewRouter() r := chi.NewRouter()
r.Route("/twitch", func(r chi.Router) { r.Mount("/twitch", http.StripPrefix("/twitch/", http.HandlerFunc(twitchHandler)))
r.Get("/getTopGames", twitchGetTopGamesHandler)
r.Get("/searchGames", twitchSearchGamesHandler)
r.Get("/getTopStreams", twitchGetTopStreamsHandler)
r.Get("/getFeaturedStreams", twitchGetFeaturedStreamsHandler)
})
r.Get("/display", func(w http.ResponseWriter, r *http.Request) { r.Get("/display", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Accept") == "text/event-stream" { if r.Header.Get("Accept") == "text/event-stream" {
......
package server package server
import ( import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http" "net/http"
"os" "os"
streamserver "stream-server" streamserver "stream-server"
"stream-server/internal/util"
"stream-server/pkg/twitch" "stream-server/pkg/twitch"
) )
...@@ -22,70 +25,39 @@ func init() { ...@@ -22,70 +25,39 @@ func init() {
} }
} }
// twitchGetTopGamesHandler handles the GetTopGames endpoint // twitchHandler proxies request to the helix twitch API
func twitchGetTopGamesHandler(w http.ResponseWriter, r *http.Request) { func twitchHandler(w http.ResponseWriter, r *http.Request) {
response, err := client.GetTopGames()
if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway)
return
}
util.ServeIndentedJSON(w, r, &response) url := fmt.Sprintf("https://api.twitch.tv/helix/%s", r.URL.RequestURI())
}
// twitchSearchGamesHandler handles the SearchGames endpoint fmt.Printf("url: %s\n", url)
func twitchSearchGamesHandler(w http.ResponseWriter, r *http.Request) {
paramQuery, err := util.GetSingleQueryParam(r, "query")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
if paramQuery == nil || *paramQuery == "" {
http.Error(w, "Parameter 'query' is required and can not be empty.", http.StatusBadRequest)
return
}
response, err := client.SearchGames(*paramQuery) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway) http.Error(w, err.Error(), http.StatusBadGateway)
return return
} }
util.ServeIndentedJSON(w, r, &response) req.Header.Add("Client-ID", client.ClientID)
} resp, err := http.DefaultClient.Do(req)
// twitchGetTopStreamsHandler handles the GetTopStreams endpoint
func twitchGetTopStreamsHandler(w http.ResponseWriter, r *http.Request) {
paramChannels := util.GetMultipleQueryParams(r, "channels")
game, err := util.GetSingleQueryParam(r, "game")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
language, err := util.GetSingleQueryParam(r, "language")
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadGateway)
return return
} }
response, err := client.GetTopStreams(paramChannels, game, language) defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway) http.Error(w, err.Error(), http.StatusBadGateway)
return return
} }
util.ServeIndentedJSON(w, r, &response) var prettyJSON bytes.Buffer
} error := json.Indent(&prettyJSON, body, "", " ")
if error != nil {
// twitchGetFeaturedStreamsHandler handles the GetFeaturedStreams endpoint
func twitchGetFeaturedStreamsHandler(w http.ResponseWriter, r *http.Request) {
response, err := client.GetFeaturedStreams()
if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway) http.Error(w, err.Error(), http.StatusBadGateway)
return return
} }
util.ServeIndentedJSON(w, r, &response) w.Write(prettyJSON.Bytes())
} }
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
<h2>Loading...</h2> <h2>Loading...</h2>
<p> <p>
<a href="https://stream-server.h-da.io">Documentation</a> · <a href="https://stream-server.h-da.io">Documentation</a> ·
<a href="https://stream-server.h-da.io/reference">Reference</a> <a href="https://dev.twitch.tv/docs/api/reference">Reference</a>
</p> </p>
<small> <small>
<a href="javascript:toggleFullscreen()">toggle fullscreen</a> <a href="javascript:toggleFullscreen()">toggle fullscreen</a>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment