github.com/keybase/client/go@v0.0.0-20240520164431-4f512a4c85a3/client/cmd_list_following.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package client 5 6 import ( 7 "fmt" 8 9 "golang.org/x/net/context" 10 11 "github.com/keybase/cli" 12 "github.com/keybase/client/go/libcmdline" 13 "github.com/keybase/client/go/libkb" 14 keybase1 "github.com/keybase/client/go/protocol/keybase1" 15 ) 16 17 type CmdListTracking struct { 18 libkb.Contextified 19 assertion string 20 filter string 21 json bool 22 verbose bool 23 headers bool 24 } 25 26 func (s *CmdListTracking) ParseArgv(ctx *cli.Context) error { 27 if len(ctx.Args()) == 1 { 28 s.assertion = ctx.Args()[0] 29 } else if len(ctx.Args()) > 1 { 30 return fmt.Errorf("list-following takes at most one argument") 31 } 32 33 s.json = ctx.Bool("json") 34 s.verbose = ctx.Bool("verbose") 35 s.headers = ctx.Bool("headers") 36 s.filter = ctx.String("filter") 37 38 return nil 39 } 40 41 func displayTable(g *libkb.GlobalContext, entries []keybase1.UserSummary, verbose bool, headers bool) (err error) { 42 tui := g.UI.GetTerminalUI() 43 if verbose { 44 noun := "users" 45 if len(entries) == 1 { 46 noun = "user" 47 } 48 tui.Printf("Following %d %s:\n\n", len(entries), noun) 49 } 50 51 var cols []string 52 53 if headers { 54 if verbose { 55 cols = []string{ 56 "Username", 57 "UID", 58 "Link ID", 59 } 60 } else { 61 cols = []string{"Username"} 62 } 63 } 64 65 i := 0 66 rowfunc := func() []string { 67 if i >= len(entries) { 68 return nil 69 } 70 entry := entries[i] 71 i++ 72 73 if !verbose { 74 return []string{entry.Username} 75 } 76 77 row := []string{ 78 entry.Username, 79 entry.Uid.String(), 80 entry.LinkID.String(), 81 } 82 return row 83 } 84 85 libkb.Tablify(tui.OutputWriter(), cols, rowfunc) 86 return 87 } 88 89 func displayJSON(g *libkb.GlobalContext, jsonStr string) error { 90 tui := g.UI.GetTerminalUI() 91 _, err := tui.Printf("%s\n", jsonStr) 92 return err 93 } 94 95 func (s *CmdListTracking) Run() error { 96 cli, err := GetUserClient(s.G()) 97 if err != nil { 98 return err 99 } 100 101 if s.json { 102 jsonStr, err := cli.ListTrackingJSON(context.TODO(), keybase1.ListTrackingJSONArg{ 103 Assertion: s.assertion, 104 Filter: s.filter, 105 Verbose: s.verbose, 106 }) 107 if err != nil { 108 return err 109 } 110 return displayJSON(s.G(), jsonStr) 111 } 112 113 ret, err := cli.ListTracking(context.TODO(), keybase1.ListTrackingArg{Filter: s.filter, Assertion: s.assertion}) 114 if err != nil { 115 return err 116 } 117 return displayTable(s.G(), ret.Users, s.verbose, s.headers) 118 } 119 120 func NewCmdListTracking(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command { 121 return cli.Command{ 122 Name: "list-following", 123 ArgumentHelp: "<username>", 124 Usage: "List who you or the given user is publicly following", 125 Action: func(c *cli.Context) { 126 cl.ChooseCommand(&CmdListTracking{Contextified: libkb.NewContextified(g)}, "following", c) 127 }, 128 Flags: []cli.Flag{ 129 cli.StringFlag{ 130 Name: "f, filter", 131 Usage: "Provide a regex filter.", 132 }, 133 cli.BoolFlag{ 134 Name: "H, headers", 135 Usage: "Show column headers.", 136 }, 137 cli.BoolFlag{ 138 Name: "j, json", 139 Usage: "Output as JSON (default is text).", 140 }, 141 cli.BoolFlag{ 142 Name: "v, verbose", 143 Usage: "A full dump, with more gory details.", 144 }, 145 }, 146 } 147 } 148 149 func (s *CmdListTracking) GetUsage() libkb.Usage { 150 return libkb.Usage{ 151 Config: true, 152 API: true, 153 } 154 }