|
|
|
package keybase
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"os/exec"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Possible MemberTypes
|
|
|
|
const (
|
|
|
|
TEAM string = "team"
|
|
|
|
USER string = "impteamnative"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Possible TopicTypes
|
|
|
|
const (
|
|
|
|
DEV string = "dev"
|
|
|
|
CHAT string = "chat"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Keybase holds basic information about the local Keybase executable
|
|
|
|
type Keybase struct {
|
|
|
|
Path string
|
|
|
|
Username string
|
|
|
|
LoggedIn bool
|
|
|
|
Version string
|
|
|
|
}
|
|
|
|
|
|
|
|
// Chat holds basic information about a specific conversation
|
|
|
|
type Chat struct {
|
|
|
|
keybase *Keybase
|
|
|
|
Channel Channel
|
|
|
|
}
|
|
|
|
|
|
|
|
type chat interface {
|
|
|
|
Send(message ...string) (ChatOut, error)
|
|
|
|
Edit(messageId int, message ...string) (ChatOut, error)
|
|
|
|
React(messageId int, reaction string) (ChatOut, error)
|
|
|
|
Delete(messageId int) (ChatOut, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type keybase interface {
|
|
|
|
NewChat(channel Channel) Chat
|
|
|
|
Run(handler func(ChatIn), options ...RunOptions)
|
|
|
|
ChatList() ([]conversation, error)
|
|
|
|
loggedIn() bool
|
|
|
|
username() string
|
|
|
|
version() string
|
|
|
|
}
|
|
|
|
|
|
|
|
type status struct {
|
|
|
|
Username string `json:"Username"`
|
|
|
|
LoggedIn bool `json:"LoggedIn"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewKeybase returns a new Keybase. Optionally, you can pass a string containing the path to the Keybase executable as the first argument.
|
|
|
|
func NewKeybase(path ...string) *Keybase {
|
|
|
|
k := &Keybase{}
|
|
|
|
if len(path) < 1 {
|
|
|
|
k.Path = "keybase"
|
|
|
|
} else {
|
|
|
|
k.Path = path[0]
|
|
|
|
}
|
|
|
|
k.Version = k.version()
|
|
|
|
k.LoggedIn = k.loggedIn()
|
|
|
|
if k.LoggedIn == true {
|
|
|
|
k.Username = k.username()
|
|
|
|
}
|
|
|
|
return k
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewChat returns a new Chat instance
|
|
|
|
func (k *Keybase) NewChat(channel Channel) Chat {
|
|
|
|
return Chat{
|
|
|
|
keybase: k,
|
|
|
|
Channel: channel,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// username returns the username of the currently logged-in Keybase user.
|
|
|
|
func (k *Keybase) username() string {
|
|
|
|
cmd := exec.Command(k.Path, "status", "-j")
|
|
|
|
cmdOut, err := cmd.Output()
|
|
|
|
if err != nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
var s status
|
|
|
|
json.Unmarshal(cmdOut, &s)
|
|
|
|
|
|
|
|
return s.Username
|
|
|
|
}
|
|
|
|
|
|
|
|
// loggedIn returns true if Keybase is currently logged in, otherwise returns false.
|
|
|
|
func (k *Keybase) loggedIn() bool {
|
|
|
|
cmd := exec.Command(k.Path, "status", "-j")
|
|
|
|
cmdOut, err := cmd.Output()
|
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
var s status
|
|
|
|
json.Unmarshal(cmdOut, &s)
|
|
|
|
|
|
|
|
return s.LoggedIn
|
|
|
|
}
|
|
|
|
|
|
|
|
// version returns the version string of the client.
|
|
|
|
func (k *Keybase) version() string {
|
|
|
|
cmd := exec.Command(k.Path, "version", "-S", "-f", "s")
|
|
|
|
cmdOut, err := cmd.Output()
|
|
|
|
if err != nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
return string(cmdOut)
|
|
|
|
}
|