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  }