diff --git a/modules/nbascore/widget.go b/modules/nbascore/widget.go new file mode 100644 index 00000000..52a1cf3d --- /dev/null +++ b/modules/nbascore/widget.go @@ -0,0 +1,147 @@ +package nbascore + +import ( + "encoding/json" + "fmt" + "github.com/gdamore/tcell" + "github.com/rivo/tview" + "github.com/wtfutil/wtf/wtf" + "io/ioutil" + "net/http" + "strconv" + "time" +) + +const HelpText = ` + Keyboard commands for NBA Score: + h: Go to previous day + l: Go to next day + c: Go back to current day +` + +type Widget struct { + wtf.HelpfulWidget + wtf.TextWidget + app *tview.Application + pages *tview.Pages + language string + result string +} + +var offset = 0 + +func NewWidget(app *tview.Application, pages *tview.Pages) *Widget { + widget := Widget{ + HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), + TextWidget: wtf.NewTextWidget(app, "NBA Score", "nbascore", true), + } + widget.HelpfulWidget.SetView(widget.View) + widget.TextWidget.RefreshInt = 5 + widget.View.SetInputCapture(widget.keyboardIntercept) + widget.View.SetScrollable(true) + return &widget +} + +func (widget *Widget) Refresh() { + widget.nbascore() +} + +func (widget *Widget) nbascore() { + cur := time.Now().AddDate(0, 0, offset) // Go back/forward offset days + curString := cur.Format("20060102") // Need 20060102 format to feed to api + client := &http.Client{} + req, err := http.NewRequest("GET", "http://data.nba.net/10s/prod/v1/"+curString+"/scoreboard.json", nil) + if err != nil { + widget.result = err.Error() + return + } + + req.Header.Set("Accept-Language", widget.language) + req.Header.Set("User-Agent", "curl") + response, err := client.Do(req) + if err != nil { + widget.result = err.Error() + return + } + defer response.Body.Close() + if response.StatusCode != 200 { + widget.result = err.Error() + return + } // Get data from data.nba.net and check if successful + + contents, err := ioutil.ReadAll(response.Body) + if err != nil { + widget.result = err.Error() + return + } + result := map[string]interface{}{} + json.Unmarshal(contents, &result) + allGame := "" // store result in allgame + allGame += (" " + "[red]" + (cur.Format("20060102") + "\n") + "[white]") + for _, game := range result["games"].([]interface{}) { + vTeam, hTeam, vScore, hScore := "", "", "", "" + quarter := 0. + for keyGame, team := range game.(map[string]interface{}) { // assertion + if keyGame == "vTeam" || keyGame == "hTeam" { + for keyTeam, stat := range team.(map[string]interface{}) { + if keyTeam == "triCode" { + if keyGame == "vTeam" { + vTeam = stat.(string) + } else { + hTeam = stat.(string) + } + } else if keyTeam == "score" { + if keyGame == "vTeam" { + vScore = stat.(string) + } else { + hScore = stat.(string) + } + } + } + } else if keyGame == "period" { + for keyTeam, stat := range team.(map[string]interface{}) { + if keyTeam == "current" { + quarter = stat.(float64) + } + } + } + } + vNum, _ := strconv.Atoi(vScore) + hNum, _ := strconv.Atoi(hScore) + if quarter != 0 { // Compare the score + if vNum > hNum { + vTeam = "[orange]" + vTeam + } else if hNum > vNum { + hScore = "[orange]" + hScore + hTeam = hTeam + "[white]" + } else { + vTeam = "[orange]" + vTeam + hTeam = hTeam + "[white]" + } + } + allGame += fmt.Sprintf("%5s%v %s %3s [white]vs %-3s %s\n", "Q", quarter, vTeam, vScore, hScore, hTeam) // Format the score and store in allgame + } + widget.View.SetText(allGame) + +} + +func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey { + switch (string)(event.Rune()) { + case "h": + offset-- + widget.Refresh() + return nil + case "l": + offset++ + widget.Refresh() + return nil + case "c": + offset = 0 + widget.Refresh() + return nil + case "/": + widget.ShowHelp() + return nil + } + return nil +}