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  }