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 }