github.com/wtfutil/wtf@v0.43.0/modules/steam/widget.go (about)

     1  package steam
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/rivo/tview"
     8  	"github.com/wtfutil/wtf/utils"
     9  	"github.com/wtfutil/wtf/view"
    10  	"golang.org/x/sync/errgroup"
    11  )
    12  
    13  type Widget struct {
    14  	view.ScrollableWidget
    15  
    16  	settings *Settings
    17  	err      error
    18  	steam    *Steam
    19  	players  []*Player
    20  }
    21  
    22  func NewWidget(tviewApp *tview.Application, redrawChan chan bool, pages *tview.Pages, settings *Settings) *Widget {
    23  	widget := &Widget{
    24  		ScrollableWidget: view.NewScrollableWidget(tviewApp, redrawChan, pages, settings.Common),
    25  		settings:         settings,
    26  		steam:            NewClient(&ClientOpts{key: settings.key}),
    27  	}
    28  
    29  	widget.SetRenderFunction(widget.Render)
    30  	widget.initializeKeyboardControls()
    31  
    32  	return widget
    33  }
    34  
    35  func (widget *Widget) Refresh() {
    36  	errg, _ := errgroup.WithContext(context.Background())
    37  	players := make([]*Player, len(widget.settings.userIds))
    38  
    39  	for i, id := range widget.settings.userIds {
    40  		func(idx int, id string) {
    41  			errg.Go(func() error {
    42  				status, err := widget.steam.Status(id)
    43  				if err != nil {
    44  					return err
    45  				}
    46  				players[idx] = status
    47  				return nil
    48  			})
    49  		}(i, id)
    50  	}
    51  
    52  	if err := errg.Wait(); err != nil {
    53  		widget.err = err
    54  		widget.players = nil
    55  		widget.SetItemCount(0)
    56  	} else {
    57  		widget.err = nil
    58  		if len(players) <= widget.settings.numberOfResults {
    59  			widget.players = players
    60  		} else {
    61  			widget.players = players[:widget.settings.numberOfResults]
    62  		}
    63  		widget.SetItemCount(len(widget.players))
    64  	}
    65  
    66  	widget.Render()
    67  }
    68  
    69  func (widget *Widget) Render() {
    70  	widget.Redraw(widget.content)
    71  }
    72  
    73  func friendlyStatus(personastate int) string {
    74  	switch personastate {
    75  	case 0:
    76  		return "Offline"
    77  	case 1:
    78  		return "Online"
    79  	case 2:
    80  		return "Busy"
    81  	case 3:
    82  		return "Away"
    83  	case 4:
    84  		return "Snooze"
    85  	case 5:
    86  		return "Looking to Trade"
    87  	case 6:
    88  		return "Looking to Play"
    89  	}
    90  	return ""
    91  }
    92  
    93  func (widget *Widget) content() (string, string, bool) {
    94  	var title = "Steam Statuses"
    95  
    96  	if widget.CommonSettings().Title != "" {
    97  		title = widget.CommonSettings().Title
    98  	}
    99  
   100  	if widget.err != nil {
   101  		return title, widget.err.Error(), true
   102  	}
   103  
   104  	if len(widget.players) == 0 {
   105  		return title, "No data", false
   106  	}
   107  
   108  	var str string
   109  
   110  	for idx, player := range widget.players {
   111  		status := friendlyStatus(player.Personastate)
   112  
   113  		row := fmt.Sprintf(
   114  			"[white]%s: [yellow]%s",
   115  			player.Personaname,
   116  			status,
   117  		)
   118  
   119  		if len(player.Gameextrainfo) > 0 {
   120  			row += " [red](" + player.Gameextrainfo + ")"
   121  		}
   122  
   123  		str += utils.HighlightableHelper(widget.View, row, idx, len(player.Personaname))
   124  	}
   125  
   126  	return title, str, false
   127  }