github.com/wtfutil/wtf@v0.43.0/modules/nbascore/widget.go (about) 1 package nbascore 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "net/http" 8 "strconv" 9 "time" 10 11 "github.com/rivo/tview" 12 "github.com/wtfutil/wtf/utils" 13 "github.com/wtfutil/wtf/view" 14 ) 15 16 var offset = 0 17 18 // A Widget represents an NBA Score widget 19 type Widget struct { 20 view.TextWidget 21 22 language string 23 settings *Settings 24 } 25 26 // NewWidget creates a new instance of a widget 27 func NewWidget(tviewApp *tview.Application, redrawChan chan bool, pages *tview.Pages, settings *Settings) *Widget { 28 widget := Widget{ 29 TextWidget: view.NewTextWidget(tviewApp, redrawChan, pages, settings.Common), 30 31 settings: settings, 32 } 33 34 widget.initializeKeyboardControls() 35 36 widget.View.SetScrollable(true) 37 38 return &widget 39 } 40 41 func (widget *Widget) Refresh() { 42 widget.Redraw(widget.nbascore) 43 } 44 45 func (widget *Widget) nbascore() (string, string, bool) { 46 title := widget.CommonSettings().Title 47 cur := time.Now().AddDate(0, 0, offset) // Go back/forward offset days 48 curString := cur.Format("20060102") // Need 20060102 format to feed to api 49 client := &http.Client{} 50 req, err := http.NewRequest("GET", "http://data.nba.net/10s/prod/v1/"+curString+"/scoreboard.json", http.NoBody) 51 if err != nil { 52 return title, err.Error(), true 53 } 54 55 req.Header.Set("Accept-Language", widget.language) 56 req.Header.Set("User-Agent", "curl") 57 response, err := client.Do(req) 58 if err != nil { 59 return title, err.Error(), true 60 } 61 defer func() { _ = response.Body.Close() }() 62 if response.StatusCode != 200 { 63 return title, err.Error(), true 64 } // Get data from data.nba.net and check if successful 65 66 contents, err := io.ReadAll(response.Body) 67 if err != nil { 68 return title, err.Error(), true 69 } 70 result := map[string]interface{}{} 71 err = json.Unmarshal(contents, &result) 72 if err != nil { 73 return title, err.Error(), true 74 } 75 76 allGame := fmt.Sprintf(" [%s]", widget.settings.Colors.Subheading) + (cur.Format(utils.FriendlyDateFormat) + "\n\n") + "[white]" 77 78 for _, game := range result["games"].([]interface{}) { 79 vTeam, hTeam, vScore, hScore := "", "", "", "" 80 quarter := 0. 81 activate := false 82 for keyGame, team := range game.(map[string]interface{}) { // assertion 83 switch keyGame { 84 case "vTeam", "hTeam": 85 for keyTeam, stat := range team.(map[string]interface{}) { 86 if keyTeam == "triCode" { 87 if keyGame == "vTeam" { 88 vTeam = stat.(string) 89 } else { 90 hTeam = stat.(string) 91 } 92 } else if keyTeam == "score" { 93 if keyGame == "vTeam" { 94 vScore = stat.(string) 95 } else { 96 hScore = stat.(string) 97 } 98 } 99 } 100 case "period": 101 for keyTeam, stat := range team.(map[string]interface{}) { 102 if keyTeam == "current" { 103 quarter = stat.(float64) 104 } 105 } 106 case "isGameActivated": 107 activate = team.(bool) 108 } 109 } 110 vNum, _ := strconv.Atoi(vScore) 111 hNum, _ := strconv.Atoi(hScore) 112 hColor := "" 113 if quarter != 0 { // Compare the score 114 switch { 115 case vNum > hNum: 116 vTeam = "[orange]" + vTeam 117 case hNum > vNum: 118 // hScore = "[orange]" + hScore 119 hColor = "[orange]" // For correct padding 120 hTeam += "[white]" 121 default: 122 vTeam = "[orange]" + vTeam 123 hColor = "[orange]" 124 hTeam += "[white]" 125 } 126 } 127 qColor := "[white]" 128 if activate { 129 qColor = "[sandybrown]" 130 } 131 allGame += fmt.Sprintf("%s%5s%v[white] %s %3s [white]vs %s%-3s %s\n", qColor, "Q", quarter, vTeam, vScore, hColor, hScore, hTeam) // Format the score and store in allgame 132 } 133 return title, allGame, false 134 }