github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/user_card.go (about)

     1  package libkb
     2  
     3  import (
     4  	"github.com/keybase/client/go/protocol/keybase1"
     5  )
     6  
     7  type card struct {
     8  	Status        AppStatus `json:"status"`
     9  	FollowSummary struct {
    10  		UnverifiedNumFollowing int `json:"following"`
    11  		UnverifiedNumFollowers int `json:"followers"`
    12  	} `json:"follow_summary"`
    13  	Profile struct {
    14  		FullName string `json:"full_name"`
    15  		Location string `json:"location"`
    16  		Bio      string `json:"bio"`
    17  		Website  string `json:"website"`
    18  		Twitter  string `json:"twitter"`
    19  	} `json:"profile"`
    20  	TeamShowcase         []keybase1.UserTeamShowcase `json:"team_showcase"`
    21  	RegisteredForAirdrop bool                        `json:"airdrop_registered"`
    22  	StellarHidden        bool                        `json:"stellar_hidden"`
    23  	Blocked              bool                        `json:"blocked"`
    24  	UserBlocks           struct {
    25  		Chat   bool `json:"chat"`
    26  		Follow bool `json:"follow"`
    27  	} `json:"user_blocks"`
    28  }
    29  
    30  func (c *card) GetAppStatus() *AppStatus {
    31  	return &c.Status
    32  }
    33  
    34  func UserCard(m MetaContext, uid keybase1.UID, useSession bool) (ret *keybase1.UserCard, err error) {
    35  	defer m.Trace("UserCard", &err)()
    36  
    37  	cached, err := m.G().CardCache().Get(uid, useSession)
    38  	if err != nil {
    39  		m.Debug("CardCache.Get error: %s", err)
    40  	} else if cached != nil {
    41  		m.Debug("CardCache.Get hit for %s", uid)
    42  		return cached, nil
    43  	}
    44  	m.Debug("CardCache.Get miss for %s", uid)
    45  
    46  	sessionType := APISessionTypeNONE
    47  	if useSession {
    48  		sessionType = APISessionTypeREQUIRED
    49  	}
    50  	arg := APIArg{
    51  		Endpoint:    "user/card",
    52  		SessionType: sessionType,
    53  		Args:        HTTPArgs{"uid": S{Val: uid.String()}},
    54  	}
    55  
    56  	var card card
    57  
    58  	if err = m.G().API.GetDecode(m, arg, &card); err != nil {
    59  		m.Warning("error getting user/card for %s: %s\n", uid, err)
    60  		return nil, err
    61  	}
    62  
    63  	ret = &keybase1.UserCard{
    64  		UnverifiedNumFollowing: card.FollowSummary.UnverifiedNumFollowing,
    65  		UnverifiedNumFollowers: card.FollowSummary.UnverifiedNumFollowers,
    66  		Uid:                    uid,
    67  		FullName:               card.Profile.FullName,
    68  		Location:               card.Profile.Location,
    69  		Bio:                    card.Profile.Bio,
    70  		Website:                card.Profile.Website,
    71  		Twitter:                card.Profile.Twitter,
    72  		TeamShowcase:           card.TeamShowcase,
    73  		RegisteredForAirdrop:   card.RegisteredForAirdrop,
    74  		StellarHidden:          card.StellarHidden,
    75  		Blocked:                card.UserBlocks.Chat,
    76  		HidFromFollowers:       card.UserBlocks.Follow,
    77  	}
    78  
    79  	if err := m.G().CardCache().Set(ret, useSession); err != nil {
    80  		m.Debug("CardCache.Set error: %s", err)
    81  	}
    82  
    83  	return ret, nil
    84  }
    85  
    86  func displayUserCard(m MetaContext, uid keybase1.UID, useSession bool) error {
    87  	card, err := UserCard(m, uid, useSession)
    88  	if err != nil {
    89  		return err
    90  	}
    91  	if card == nil {
    92  		return nil
    93  	}
    94  
    95  	return m.UIs().IdentifyUI.DisplayUserCard(m, *card)
    96  }
    97  
    98  func DisplayUserCardAsync(m MetaContext, uid keybase1.UID, useSession bool) <-chan error {
    99  	ch := make(chan error)
   100  	go func() {
   101  		ch <- displayUserCard(m, uid, useSession)
   102  	}()
   103  	return ch
   104  }
   105  
   106  func GetFullName(m MetaContext, uid keybase1.UID) (string, error) {
   107  	card, err := UserCard(m, uid, false)
   108  	if err != nil {
   109  		return "", err
   110  	}
   111  	if card == nil {
   112  		return "", nil
   113  	}
   114  	return card.FullName, nil
   115  }