From c2f6e6954dfd886c92b50d836bf3034e29c21360 Mon Sep 17 00:00:00 2001
From: Sam <dxb@keybase.io>
Date: Wed, 27 Nov 2019 15:10:17 -0500
Subject: [PATCH] Add UserLookup()

---
 keybase.go | 21 +++++++++++++++++++
 types.go   | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

diff --git a/keybase.go b/keybase.go
index 1124fcd..fa2313f 100644
--- a/keybase.go
+++ b/keybase.go
@@ -2,7 +2,9 @@ package keybase
 
 import (
 	"encoding/json"
+	"fmt"
 	"os/exec"
+	"strings"
 )
 
 // Possible MemberTypes
@@ -115,3 +117,22 @@ func (k *Keybase) version() string {
 
 	return string(cmdOut)
 }
+
+// UserLookup pulls information about users.
+// The following fields are currently returned: basics, profile, proofs_summary
+// See https://keybase.io/docs/api/1.0/call/user/lookup for more info
+func (k *Keybase) UserLookup(users ...string) (UserAPI, error) {
+	var fields = []string{"basics", "profile", "proofs_summary"}
+
+	cmdOut, err := k.Exec("apicall", "--arg", fmt.Sprintf("usernames=%s", strings.Join(users, ",")), "--arg", fmt.Sprintf("fields=%s", strings.Join(fields, ",")), "user/lookup")
+	if err != nil {
+		return UserAPI{}, err
+	}
+
+	var r UserAPI
+	if err := json.Unmarshal(cmdOut, &r); err != nil {
+		return UserAPI{}, err
+	}
+
+	return r, nil
+}
diff --git a/types.go b/types.go
index 790079f..ee044f2 100644
--- a/types.go
+++ b/types.go
@@ -597,6 +597,64 @@ type tResult struct {
 	Showcase               showcase               `json:"showcase"`
 }
 
+// UserAPI holds information received to the userlookup api
+type UserAPI struct {
+	Status uStatus `json:"status"`
+	Them   []them  `json:"them"`
+}
+
+type uStatus struct {
+	Code int    `json:"code"`
+	Name string `json:"name"`
+}
+
+type basics struct {
+	Ctime                int    `json:"ctime"`
+	EldestSeqno          int    `json:"eldest_seqno"`
+	IDVersion            int    `json:"id_version"`
+	LastIDChange         int    `json:"last_id_change"`
+	Mtime                int    `json:"mtime"`
+	PassphraseGeneration int    `json:"passphrase_generation"`
+	RandomPw             bool   `json:"random_pw"`
+	Salt                 string `json:"salt"`
+	Status               int    `json:"status"`
+	TrackVersion         int    `json:"track_version"`
+	Username             string `json:"username"`
+	UsernameCased        string `json:"username_cased"`
+}
+
+type profile struct {
+	Bio      string `json:"bio"`
+	FullName string `json:"full_name"`
+	Location string `json:"location"`
+	Mtime    int    `json:"mtime"`
+}
+
+type proof struct {
+	HumanURL          string `json:"human_url"`
+	Nametag           string `json:"nametag"`
+	PresentationGroup string `json:"presentation_group"`
+	PresentationTag   string `json:"presentation_tag"`
+	ProofID           string `json:"proof_id"`
+	ProofType         string `json:"proof_type"`
+	ProofURL          string `json:"proof_url"`
+	ServiceURL        string `json:"service_url"`
+	SigID             string `json:"sig_id"`
+	State             int    `json:"state"`
+}
+
+type proofsSummary struct {
+	All    []proof `json:"all"`
+	HasWeb bool    `json:"has_web"`
+}
+
+type them struct {
+	Basics        basics        `json:"basics,omitempty"`
+	ID            string        `json:"id"`
+	Profile       profile       `json:"profile,omitempty"`
+	ProofsSummary proofsSummary `json:"proofs_summary"`
+}
+
 // Keybase holds basic information about the local Keybase executable
 type Keybase struct {
 	Path     string
@@ -673,6 +731,7 @@ type keybase interface {
 	Run(handler func(ChatAPI), options ...RunOptions)
 	status() status
 	version() string
+	UserLookup(users ...string) (UserAPI, error)
 }
 
 type status struct {