Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b66324f9b4 | |||
| 3e5afcc7f9 | |||
| 274002b616 | |||
| abed5bc066 | |||
| a3def6207a | |||
| 05ac7d7330 | |||
| 71955bb43c | |||
| e05e93be9f |
2
go.mod
2
go.mod
@ -1,3 +1,3 @@
|
|||||||
module samhofi.us/x/keybase/v2
|
module samhofi.us/x/keybase
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|||||||
@ -1,74 +0,0 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
|
||||||
// Input file: ../client/protocol/avdl/keybase1/notify_ctl.avdl
|
|
||||||
|
|
||||||
package keybase1
|
|
||||||
|
|
||||||
type NotificationChannels struct {
|
|
||||||
Session bool `codec:"session" json:"session"`
|
|
||||||
Users bool `codec:"users" json:"users"`
|
|
||||||
Kbfs bool `codec:"kbfs" json:"kbfs"`
|
|
||||||
Kbfsdesktop bool `codec:"kbfsdesktop" json:"kbfsdesktop"`
|
|
||||||
Kbfslegacy bool `codec:"kbfslegacy" json:"kbfslegacy"`
|
|
||||||
Kbfssubscription bool `codec:"kbfssubscription" json:"kbfssubscription"`
|
|
||||||
Tracking bool `codec:"tracking" json:"tracking"`
|
|
||||||
Favorites bool `codec:"favorites" json:"favorites"`
|
|
||||||
Paperkeys bool `codec:"paperkeys" json:"paperkeys"`
|
|
||||||
Keyfamily bool `codec:"keyfamily" json:"keyfamily"`
|
|
||||||
Service bool `codec:"service" json:"service"`
|
|
||||||
App bool `codec:"app" json:"app"`
|
|
||||||
Chat bool `codec:"chat" json:"chat"`
|
|
||||||
PGP bool `codec:"pgp" json:"pgp"`
|
|
||||||
Kbfsrequest bool `codec:"kbfsrequest" json:"kbfsrequest"`
|
|
||||||
Badges bool `codec:"badges" json:"badges"`
|
|
||||||
Reachability bool `codec:"reachability" json:"reachability"`
|
|
||||||
Team bool `codec:"team" json:"team"`
|
|
||||||
Ephemeral bool `codec:"ephemeral" json:"ephemeral"`
|
|
||||||
Teambot bool `codec:"teambot" json:"teambot"`
|
|
||||||
Chatkbfsedits bool `codec:"chatkbfsedits" json:"chatkbfsedits"`
|
|
||||||
Chatdev bool `codec:"chatdev" json:"chatdev"`
|
|
||||||
Chatemoji bool `codec:"chatemoji" json:"chatemoji"`
|
|
||||||
Chatemojicross bool `codec:"chatemojicross" json:"chatemojicross"`
|
|
||||||
Deviceclone bool `codec:"deviceclone" json:"deviceclone"`
|
|
||||||
Chatattachments bool `codec:"chatattachments" json:"chatattachments"`
|
|
||||||
Wallet bool `codec:"wallet" json:"wallet"`
|
|
||||||
Audit bool `codec:"audit" json:"audit"`
|
|
||||||
Runtimestats bool `codec:"runtimestats" json:"runtimestats"`
|
|
||||||
FeaturedBots bool `codec:"featuredBots" json:"featuredBots"`
|
|
||||||
Saltpack bool `codec:"saltpack" json:"saltpack"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o NotificationChannels) DeepCopy() NotificationChannels {
|
|
||||||
return NotificationChannels{
|
|
||||||
Session: o.Session,
|
|
||||||
Users: o.Users,
|
|
||||||
Kbfs: o.Kbfs,
|
|
||||||
Kbfsdesktop: o.Kbfsdesktop,
|
|
||||||
Kbfslegacy: o.Kbfslegacy,
|
|
||||||
Kbfssubscription: o.Kbfssubscription,
|
|
||||||
Tracking: o.Tracking,
|
|
||||||
Favorites: o.Favorites,
|
|
||||||
Paperkeys: o.Paperkeys,
|
|
||||||
Keyfamily: o.Keyfamily,
|
|
||||||
Service: o.Service,
|
|
||||||
App: o.App,
|
|
||||||
Chat: o.Chat,
|
|
||||||
PGP: o.PGP,
|
|
||||||
Kbfsrequest: o.Kbfsrequest,
|
|
||||||
Badges: o.Badges,
|
|
||||||
Reachability: o.Reachability,
|
|
||||||
Team: o.Team,
|
|
||||||
Ephemeral: o.Ephemeral,
|
|
||||||
Teambot: o.Teambot,
|
|
||||||
Chatkbfsedits: o.Chatkbfsedits,
|
|
||||||
Chatdev: o.Chatdev,
|
|
||||||
Chatemoji: o.Chatemoji,
|
|
||||||
Chatemojicross: o.Chatemojicross,
|
|
||||||
Deviceclone: o.Deviceclone,
|
|
||||||
Chatattachments: o.Chatattachments,
|
|
||||||
Wallet: o.Wallet,
|
|
||||||
Audit: o.Audit,
|
|
||||||
Runtimestats: o.Runtimestats,
|
|
||||||
FeaturedBots: o.FeaturedBots,
|
|
||||||
Saltpack: o.Saltpack,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
556
v1/chat.go
Normal file
556
v1/chat.go
Normal file
@ -0,0 +1,556 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/binary"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Returns a string representation of a message id suitable for use in a
|
||||||
|
// pagination struct
|
||||||
|
func getID(id uint) string {
|
||||||
|
var b []byte
|
||||||
|
switch {
|
||||||
|
case id < 128:
|
||||||
|
// 7-bit int
|
||||||
|
b = make([]byte, 1)
|
||||||
|
b = []byte{byte(id)}
|
||||||
|
|
||||||
|
case id <= 255:
|
||||||
|
// uint8
|
||||||
|
b = make([]byte, 2)
|
||||||
|
b = []byte{204, byte(id)}
|
||||||
|
|
||||||
|
case id > 255 && id <= 65535:
|
||||||
|
// uint16
|
||||||
|
b = make([]byte, 2)
|
||||||
|
binary.BigEndian.PutUint16(b, uint16(id))
|
||||||
|
b = append([]byte{205}, b...)
|
||||||
|
|
||||||
|
case id > 65535 && id <= 4294967295:
|
||||||
|
// uint32
|
||||||
|
b = make([]byte, 4)
|
||||||
|
binary.BigEndian.PutUint32(b, uint32(id))
|
||||||
|
b = append([]byte{206}, b...)
|
||||||
|
}
|
||||||
|
return base64.StdEncoding.EncodeToString(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates a string of a json-encoded channel to pass to keybase chat api-listen --filter-channel
|
||||||
|
func createFilterString(channel Channel) string {
|
||||||
|
if channel.Name == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
jsonBytes, _ := json.Marshal(channel)
|
||||||
|
return string(jsonBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creates a string of json-encoded channels to pass to keybase chat api-listen --filter-channels
|
||||||
|
func createFiltersString(channels []Channel) string {
|
||||||
|
if len(channels) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
jsonBytes, _ := json.Marshal(channels)
|
||||||
|
return string(jsonBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run `keybase chat api-listen` to get new messages coming into keybase and send them into the channel
|
||||||
|
func getNewMessages(k *Keybase, c chan<- ChatAPI, execOptions []string) {
|
||||||
|
execString := []string{"chat", "api-listen"}
|
||||||
|
if len(execOptions) > 0 {
|
||||||
|
execString = append(execString, execOptions...)
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
execCmd := exec.Command(k.Path, execString...)
|
||||||
|
stdOut, _ := execCmd.StdoutPipe()
|
||||||
|
execCmd.Start()
|
||||||
|
scanner := bufio.NewScanner(stdOut)
|
||||||
|
go func(scanner *bufio.Scanner, c chan<- ChatAPI) {
|
||||||
|
for scanner.Scan() {
|
||||||
|
var jsonData ChatAPI
|
||||||
|
json.Unmarshal([]byte(scanner.Text()), &jsonData)
|
||||||
|
if jsonData.ErrorRaw != nil {
|
||||||
|
var errorListen = string(*jsonData.ErrorRaw)
|
||||||
|
jsonData.ErrorListen = &errorListen
|
||||||
|
}
|
||||||
|
c <- jsonData
|
||||||
|
}
|
||||||
|
}(scanner, c)
|
||||||
|
execCmd.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run runs `keybase chat api-listen`, and passes incoming messages to the message handler func
|
||||||
|
func (k *Keybase) Run(handler func(ChatAPI), options ...RunOptions) {
|
||||||
|
var heartbeatFreq int64
|
||||||
|
var channelCapacity = 100
|
||||||
|
|
||||||
|
runOptions := make([]string, 0)
|
||||||
|
if len(options) > 0 {
|
||||||
|
if options[0].Capacity > 0 {
|
||||||
|
channelCapacity = options[0].Capacity
|
||||||
|
}
|
||||||
|
if options[0].Heartbeat > 0 {
|
||||||
|
heartbeatFreq = options[0].Heartbeat
|
||||||
|
}
|
||||||
|
if options[0].Local {
|
||||||
|
runOptions = append(runOptions, "--local")
|
||||||
|
}
|
||||||
|
if options[0].HideExploding {
|
||||||
|
runOptions = append(runOptions, "--hide-exploding")
|
||||||
|
}
|
||||||
|
if options[0].Dev {
|
||||||
|
runOptions = append(runOptions, "--dev")
|
||||||
|
}
|
||||||
|
if len(options[0].FilterChannels) > 0 {
|
||||||
|
runOptions = append(runOptions, "--filter-channels")
|
||||||
|
runOptions = append(runOptions, createFiltersString(options[0].FilterChannels))
|
||||||
|
|
||||||
|
}
|
||||||
|
if options[0].FilterChannel.Name != "" {
|
||||||
|
runOptions = append(runOptions, "--filter-channel")
|
||||||
|
runOptions = append(runOptions, createFilterString(options[0].FilterChannel))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c := make(chan ChatAPI, channelCapacity)
|
||||||
|
defer close(c)
|
||||||
|
if heartbeatFreq > 0 {
|
||||||
|
go heartbeat(c, time.Duration(heartbeatFreq)*time.Minute)
|
||||||
|
}
|
||||||
|
go getNewMessages(k, c, runOptions)
|
||||||
|
for {
|
||||||
|
go handler(<-c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// heartbeat sends a message through the channel with a message type of `heartbeat`
|
||||||
|
func heartbeat(c chan<- ChatAPI, freq time.Duration) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Type: "heartbeat",
|
||||||
|
}
|
||||||
|
count := 0
|
||||||
|
for {
|
||||||
|
time.Sleep(freq)
|
||||||
|
m.Msg.ID = count
|
||||||
|
c <- m
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// chatAPIOut sends JSON requests to the chat API and returns its response.
|
||||||
|
func chatAPIOut(k *Keybase, c ChatAPI) (ChatAPI, error) {
|
||||||
|
jsonBytes, _ := json.Marshal(c)
|
||||||
|
|
||||||
|
cmdOut, err := k.Exec("chat", "api", "-m", string(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
|
return ChatAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var r ChatAPI
|
||||||
|
if err := json.Unmarshal(cmdOut, &r); err != nil {
|
||||||
|
return ChatAPI{}, err
|
||||||
|
}
|
||||||
|
if r.ErrorRaw != nil {
|
||||||
|
var errorRead Error
|
||||||
|
json.Unmarshal([]byte(*r.ErrorRaw), &errorRead)
|
||||||
|
r.ErrorRead = &errorRead
|
||||||
|
return r, errors.New(r.ErrorRead.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send sends a chat message
|
||||||
|
func (c Chat) Send(message ...string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Message: &mesg{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "send"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Message.Body = strings.Join(message, " ")
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendEphemeral sends an exploding chat message, with specified duration
|
||||||
|
func (c Chat) SendEphemeral(duration time.Duration, message ...string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Message: &mesg{},
|
||||||
|
}
|
||||||
|
m.Params.Options.ExplodingLifetime.Duration = duration
|
||||||
|
m.Method = "send"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Message.Body = strings.Join(message, " ")
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reply sends a reply to a chat message
|
||||||
|
func (c Chat) Reply(replyTo int, message ...string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Message: &mesg{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "send"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.ReplyTo = replyTo
|
||||||
|
m.Params.Options.Message.Body = strings.Join(message, " ")
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit edits a previously sent chat message
|
||||||
|
func (c Chat) Edit(messageID int, message ...string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Message: &mesg{},
|
||||||
|
}
|
||||||
|
m.Method = "edit"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Message.Body = strings.Join(message, " ")
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// React sends a reaction to a message.
|
||||||
|
func (c Chat) React(messageID int, reaction string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Message: &mesg{},
|
||||||
|
}
|
||||||
|
m.Method = "reaction"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Message.Body = reaction
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete deletes a chat message
|
||||||
|
func (c Chat) Delete(messageID int) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "delete"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatList returns a list of all conversations.
|
||||||
|
// You can pass a Channel to use as a filter here, but you'll probably want to
|
||||||
|
// leave the TopicName empty.
|
||||||
|
func (k *Keybase) ChatList(opts ...Channel) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(opts) > 0 {
|
||||||
|
m.Params.Options.Name = opts[0].Name
|
||||||
|
m.Params.Options.Public = opts[0].Public
|
||||||
|
m.Params.Options.MembersType = opts[0].MembersType
|
||||||
|
m.Params.Options.TopicType = opts[0].TopicType
|
||||||
|
m.Params.Options.TopicName = opts[0].TopicName
|
||||||
|
}
|
||||||
|
m.Method = "list"
|
||||||
|
|
||||||
|
r, err := chatAPIOut(k, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadMessage fetches the chat message with the specified message id from a conversation.
|
||||||
|
func (c Chat) ReadMessage(messageID int) (*ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Pagination: &pagination{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "read"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Pagination.Num = 1
|
||||||
|
|
||||||
|
m.Params.Options.Pagination.Previous = getID(uint(messageID - 1))
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return &r, err
|
||||||
|
}
|
||||||
|
r.keybase = *c.keybase
|
||||||
|
return &r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read fetches chat messages from a conversation. By default, 10 messages will
|
||||||
|
// be fetched at a time. However, if count is passed, then that is the number of
|
||||||
|
// messages that will be fetched.
|
||||||
|
func (c Chat) Read(count ...int) (*ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Pagination: &pagination{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "read"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
if len(count) == 0 {
|
||||||
|
m.Params.Options.Pagination.Num = 10
|
||||||
|
} else {
|
||||||
|
m.Params.Options.Pagination.Num = count[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return &r, err
|
||||||
|
}
|
||||||
|
r.keybase = *c.keybase
|
||||||
|
return &r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next fetches the next page of chat messages that were fetched with Read. By
|
||||||
|
// default, Next will fetch the same amount of messages that were originally
|
||||||
|
// fetched with Read. However, if count is passed, then that is the number of
|
||||||
|
// messages that will be fetched.
|
||||||
|
func (c *ChatAPI) Next(count ...int) (*ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Pagination: &pagination{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "read"
|
||||||
|
m.Params.Options.Channel = &c.Result.Messages[0].Msg.Channel
|
||||||
|
if len(count) == 0 {
|
||||||
|
m.Params.Options.Pagination.Num = c.Result.Pagination.Num
|
||||||
|
} else {
|
||||||
|
m.Params.Options.Pagination.Num = count[0]
|
||||||
|
}
|
||||||
|
m.Params.Options.Pagination.Next = c.Result.Pagination.Next
|
||||||
|
|
||||||
|
result, err := chatAPIOut(&c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return &result, err
|
||||||
|
}
|
||||||
|
k := c.keybase
|
||||||
|
*c = result
|
||||||
|
c.keybase = k
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Previous fetches the previous page of chat messages that were fetched with Read.
|
||||||
|
// By default, Previous will fetch the same amount of messages that were
|
||||||
|
// originally fetched with Read. However, if count is passed, then that is the
|
||||||
|
// number of messages that will be fetched.
|
||||||
|
func (c *ChatAPI) Previous(count ...int) (*ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Params.Options = options{
|
||||||
|
Pagination: &pagination{},
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "read"
|
||||||
|
m.Params.Options.Channel = &c.Result.Messages[0].Msg.Channel
|
||||||
|
if len(count) == 0 {
|
||||||
|
m.Params.Options.Pagination.Num = c.Result.Pagination.Num
|
||||||
|
} else {
|
||||||
|
m.Params.Options.Pagination.Num = count[0]
|
||||||
|
}
|
||||||
|
m.Params.Options.Pagination.Previous = c.Result.Pagination.Previous
|
||||||
|
|
||||||
|
result, err := chatAPIOut(&c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return &result, err
|
||||||
|
}
|
||||||
|
k := c.keybase
|
||||||
|
*c = result
|
||||||
|
c.keybase = k
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upload attaches a file to a conversation
|
||||||
|
// The filepath must be an absolute path
|
||||||
|
func (c Chat) Upload(title string, filepath string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "attach"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Filename = filepath
|
||||||
|
m.Params.Options.Title = title
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download downloads a file from a conversation
|
||||||
|
func (c Chat) Download(messageID int, filepath string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "download"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.Output = filepath
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadFlip returns the results of a flip
|
||||||
|
// If the flip is still in progress, this can be expected to change if called again
|
||||||
|
func (c Chat) LoadFlip(messageID int, conversationID string, flipConversationID string, gameID string) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "loadflip"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.MsgID = messageID
|
||||||
|
m.Params.Options.ConversationID = conversationID
|
||||||
|
m.Params.Options.FlipConversationID = flipConversationID
|
||||||
|
m.Params.Options.GameID = gameID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pin pins a message to a channel
|
||||||
|
func (c Chat) Pin(messageID int) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "pin"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpin clears any pinned messages from a channel
|
||||||
|
func (c Chat) Unpin() (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "unpin"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark marks a conversation as read up to a specified message
|
||||||
|
func (c Chat) Mark(messageID int) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "mark"
|
||||||
|
m.Params.Options.Channel = &c.Channel
|
||||||
|
m.Params.Options.MessageID = messageID
|
||||||
|
|
||||||
|
r, err := chatAPIOut(c.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClearCommands clears bot advertisements
|
||||||
|
func (k *Keybase) ClearCommands() (ChatAPI, error) {
|
||||||
|
m := ChatAPI{}
|
||||||
|
m.Method = "clearcommands"
|
||||||
|
|
||||||
|
r, err := chatAPIOut(k, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdvertiseCommands sets up bot command advertisements
|
||||||
|
// This method allows you to set up multiple different types of advertisements at once.
|
||||||
|
// Use this method if you have commands whose visibility differs from each other.
|
||||||
|
func (k *Keybase) AdvertiseCommands(advertisements []BotAdvertisement) (ChatAPI, error) {
|
||||||
|
m := ChatAPI{
|
||||||
|
Params: ¶ms{},
|
||||||
|
}
|
||||||
|
m.Method = "advertisecommands"
|
||||||
|
m.Params.Options.BotAdvertisements = advertisements
|
||||||
|
|
||||||
|
r, err := chatAPIOut(k, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdvertiseCommand sets up bot command advertisements
|
||||||
|
// This method allows you to set up one type of advertisement.
|
||||||
|
// Use this method if you have commands whose visibility should all be the same.
|
||||||
|
func (k *Keybase) AdvertiseCommand(advertisement BotAdvertisement) (ChatAPI, error) {
|
||||||
|
return k.AdvertiseCommands([]BotAdvertisement{
|
||||||
|
advertisement,
|
||||||
|
})
|
||||||
|
}
|
||||||
66
v1/docs.go
Normal file
66
v1/docs.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
The keybase package implements an interface for interacting with the Keybase Chat, Team, and Wallet APIs
|
||||||
|
|
||||||
|
I've tried to follow Keybase's JSON API as closely as possible, so if you're stuck on anything, or wondering
|
||||||
|
why things are organized in a certain way, it's most likely due to that. It may be helpful to look at the
|
||||||
|
Keybase JSON API docs by running some of the following commands in your terminal:
|
||||||
|
// Chat API
|
||||||
|
keybase chat api -h
|
||||||
|
|
||||||
|
// Chat Message Stream
|
||||||
|
keybase chat api-listen -h
|
||||||
|
|
||||||
|
// Team API
|
||||||
|
keybase team api -h
|
||||||
|
|
||||||
|
// Wallet API
|
||||||
|
keybase wallet api -h
|
||||||
|
|
||||||
|
The git repo for this code is hosted on Keybase. You can contact me directly (https://keybase.io/dxb),
|
||||||
|
or join the mkbot team (https://keybase.io/team/mkbot) if you need assistance, or if you'd like to contribute.
|
||||||
|
|
||||||
|
Basic Example
|
||||||
|
|
||||||
|
Here's a quick example of a bot that will attach a reaction with the sender's device name to every message sent
|
||||||
|
in @mkbot#test1:
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"samhofi.us/x/keybase"
|
||||||
|
)
|
||||||
|
|
||||||
|
var k = keybase.NewKeybase()
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
channel := keybase.Channel{
|
||||||
|
Name: "mkbot",
|
||||||
|
TopicName: "test1",
|
||||||
|
MembersType: keybase.TEAM,
|
||||||
|
}
|
||||||
|
opts := keybase.RunOptions{
|
||||||
|
FilterChannel: channel,
|
||||||
|
}
|
||||||
|
fmt.Println("Running...")
|
||||||
|
k.Run(handler, opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handler(m keybase.ChatAPI) {
|
||||||
|
if m.ErrorListen != nil {
|
||||||
|
fmt.Printf("Error: %s\n", *m.ErrorListen)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
msgType := m.Msg.Content.Type
|
||||||
|
msgID := m.Msg.ID
|
||||||
|
deviceName := m.Msg.Sender.DeviceName
|
||||||
|
|
||||||
|
if msgType == "text" {
|
||||||
|
chat := k.NewChat(m.Msg.Channel)
|
||||||
|
chat.React(msgID, deviceName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
package keybase
|
||||||
20
v1/docs_test.go
Normal file
20
v1/docs_test.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
func ExampleKeybase_AdvertiseCommand() {
|
||||||
|
var k = NewKeybase()
|
||||||
|
|
||||||
|
// Clear out any previously advertised commands
|
||||||
|
k.ClearCommands()
|
||||||
|
|
||||||
|
// Create BotAdvertisement
|
||||||
|
c := BotAdvertisement{
|
||||||
|
Type: "public",
|
||||||
|
BotCommands: []BotCommand{
|
||||||
|
NewBotCommand("help", "Get help using this bot", "!help <command>"),
|
||||||
|
NewBotCommand("hello", "Say hello", "!hello"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send advertisement
|
||||||
|
k.AdvertiseCommand(c)
|
||||||
|
}
|
||||||
160
v1/keybase.go
Normal file
160
v1/keybase.go
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Possible MemberTypes
|
||||||
|
const (
|
||||||
|
TEAM string = "team"
|
||||||
|
USER string = "impteamnative"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Possible TopicTypes
|
||||||
|
const (
|
||||||
|
DEV string = "dev"
|
||||||
|
CHAT string = "chat"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 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]
|
||||||
|
}
|
||||||
|
|
||||||
|
s := k.status()
|
||||||
|
k.Version = k.version()
|
||||||
|
k.LoggedIn = s.LoggedIn
|
||||||
|
if k.LoggedIn {
|
||||||
|
k.Username = s.Username
|
||||||
|
k.Device = s.Device.Name
|
||||||
|
}
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBotCommand returns a new BotCommand instance
|
||||||
|
func NewBotCommand(name, description, usage string, extendedDescription ...BotCommandExtendedDescription) BotCommand {
|
||||||
|
result := BotCommand{
|
||||||
|
Name: name,
|
||||||
|
Description: description,
|
||||||
|
Usage: usage,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(extendedDescription) > 0 {
|
||||||
|
result.ExtendedDescription = &extendedDescription[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewBotCommandExtendedDescription
|
||||||
|
func NewBotCommandExtendedDescription(title, desktopBody, mobileBody string) BotCommandExtendedDescription {
|
||||||
|
return BotCommandExtendedDescription{
|
||||||
|
Title: title,
|
||||||
|
DesktopBody: desktopBody,
|
||||||
|
MobileBody: mobileBody,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exec executes the given Keybase command
|
||||||
|
func (k *Keybase) Exec(command ...string) ([]byte, error) {
|
||||||
|
out, err := exec.Command(k.Path, command...).Output()
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewChat returns a new Chat instance
|
||||||
|
func (k *Keybase) NewChat(channel Channel) Chat {
|
||||||
|
return Chat{
|
||||||
|
keybase: k,
|
||||||
|
Channel: channel,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTeam returns a new Team instance
|
||||||
|
func (k *Keybase) NewTeam(name string) Team {
|
||||||
|
return Team{
|
||||||
|
keybase: k,
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewKV returns a new KV instance
|
||||||
|
func (k *Keybase) NewKV(team string) KV {
|
||||||
|
return KV{
|
||||||
|
keybase: k,
|
||||||
|
Team: team,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWallet returns a new Wallet instance
|
||||||
|
func (k *Keybase) NewWallet() Wallet {
|
||||||
|
return Wallet{
|
||||||
|
keybase: k,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// status returns the results of the `keybase status` command, which includes
|
||||||
|
// information about the client, and the currently logged-in Keybase user.
|
||||||
|
func (k *Keybase) status() status {
|
||||||
|
cmdOut, err := k.Exec("status", "-j")
|
||||||
|
if err != nil {
|
||||||
|
return status{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var s status
|
||||||
|
json.Unmarshal(cmdOut, &s)
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// version returns the version string of the client.
|
||||||
|
func (k *Keybase) version() string {
|
||||||
|
cmdOut, err := k.Exec("version", "-S", "-f", "s")
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(cmdOut)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserLookup pulls information about users.
|
||||||
|
// The following fields are currently returned: basics, profile, proofs_summary, devices -- 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", "devices"}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserCard pulls the information that is typically displayed when you open a user's profile.
|
||||||
|
func (k *Keybase) UserCard(user string) (UserCardAPI, error) {
|
||||||
|
cmdOut, err := k.Exec("apicall", "--arg", "username="+user, "user/card")
|
||||||
|
if err != nil {
|
||||||
|
return UserCardAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var r UserCardAPI
|
||||||
|
if err := json.Unmarshal(cmdOut, &r); err != nil {
|
||||||
|
return UserCardAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
137
v1/kvstore.go
Normal file
137
v1/kvstore.go
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// kvAPIOut sends a JSON request to the kvstore API and returns its response.
|
||||||
|
func kvAPIOut(k *Keybase, kv KVAPI) (KVAPI, error) {
|
||||||
|
jsonBytes, _ := json.Marshal(kv)
|
||||||
|
|
||||||
|
cmdOut, err := k.Exec("kvstore", "api", "-m", string(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
|
return KVAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var r KVAPI
|
||||||
|
if err := json.Unmarshal(cmdOut, &r); err != nil {
|
||||||
|
return KVAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Error != nil {
|
||||||
|
return KVAPI{}, errors.New(r.Error.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Namespaces returns all namespaces for a team
|
||||||
|
func (kv KV) Namespaces() (KVAPI, error) {
|
||||||
|
m := KVAPI{
|
||||||
|
Params: &kvParams{},
|
||||||
|
}
|
||||||
|
m.Params.Options = kvOptions{
|
||||||
|
Team: kv.Team,
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "list"
|
||||||
|
|
||||||
|
r, err := kvAPIOut(kv.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keys returns all non-deleted keys for a namespace
|
||||||
|
func (kv KV) Keys(namespace string) (KVAPI, error) {
|
||||||
|
m := KVAPI{
|
||||||
|
Params: &kvParams{},
|
||||||
|
}
|
||||||
|
m.Params.Options = kvOptions{
|
||||||
|
Team: kv.Team,
|
||||||
|
Namespace: namespace,
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "list"
|
||||||
|
|
||||||
|
r, err := kvAPIOut(kv.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns an entry
|
||||||
|
func (kv KV) Get(namespace string, key string, revision ...uint) (KVAPI, error) {
|
||||||
|
m := KVAPI{
|
||||||
|
Params: &kvParams{},
|
||||||
|
}
|
||||||
|
m.Params.Options = kvOptions{
|
||||||
|
Team: kv.Team,
|
||||||
|
Namespace: namespace,
|
||||||
|
EntryKey: key,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(revision) > 0 {
|
||||||
|
m.Params.Options.Revision = revision[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "get"
|
||||||
|
|
||||||
|
r, err := kvAPIOut(kv.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put adds an entry
|
||||||
|
func (kv KV) Put(namespace string, key string, value string, revision ...uint) (KVAPI, error) {
|
||||||
|
m := KVAPI{
|
||||||
|
Params: &kvParams{},
|
||||||
|
}
|
||||||
|
m.Params.Options = kvOptions{
|
||||||
|
Team: kv.Team,
|
||||||
|
Namespace: namespace,
|
||||||
|
EntryKey: key,
|
||||||
|
EntryValue: value,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(revision) > 0 {
|
||||||
|
m.Params.Options.Revision = revision[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "put"
|
||||||
|
|
||||||
|
r, err := kvAPIOut(kv.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes an entry
|
||||||
|
func (kv KV) Delete(namespace string, key string, revision ...uint) (KVAPI, error) {
|
||||||
|
m := KVAPI{
|
||||||
|
Params: &kvParams{},
|
||||||
|
}
|
||||||
|
m.Params.Options = kvOptions{
|
||||||
|
Team: kv.Team,
|
||||||
|
Namespace: namespace,
|
||||||
|
EntryKey: key,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(revision) > 0 {
|
||||||
|
m.Params.Options.Revision = revision[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Method = "del"
|
||||||
|
|
||||||
|
r, err := kvAPIOut(kv.keybase, m)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
926
v1/types.go
Normal file
926
v1/types.go
Normal file
@ -0,0 +1,926 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RunOptions holds a set of options to be passed to Run
|
||||||
|
type RunOptions struct {
|
||||||
|
Capacity int // Channel capacity for the buffered channel that holds messages. Defaults to 100 if not set
|
||||||
|
Heartbeat int64 // Send a heartbeat through the channel every X minutes (0 = off)
|
||||||
|
Local bool // Subscribe to local messages
|
||||||
|
HideExploding bool // Ignore exploding messages
|
||||||
|
Dev bool // Subscribe to dev channel messages
|
||||||
|
Wallet bool // Subscribe to wallet events
|
||||||
|
FilterChannel Channel // Only subscribe to messages from specified channel
|
||||||
|
FilterChannels []Channel // Only subscribe to messages from specified channels
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatAPI holds information about a message received by the `keybase chat api-listen` command
|
||||||
|
type ChatAPI struct {
|
||||||
|
Type string `json:"type,omitempty"`
|
||||||
|
Source string `json:"source,omitempty"`
|
||||||
|
Msg *msg `json:"msg,omitempty"`
|
||||||
|
Method string `json:"method,omitempty"`
|
||||||
|
Params *params `json:"params,omitempty"`
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
Ratelimits []rateLimits `json:"ratelimits,omitempty"`
|
||||||
|
Notification *notification `json:"notification,omitempty"`
|
||||||
|
Result *result `json:"result,omitempty"`
|
||||||
|
Pagination *pagination `json:"pagination,omitempty"`
|
||||||
|
ErrorRaw *json.RawMessage `json:"error,omitempty"` // Raw JSON string containing any errors returned
|
||||||
|
ErrorRead *Error `json:"-"` // Errors returned by any outgoing chat functions such as Read(), Edit(), etc
|
||||||
|
ErrorListen *string `json:"-"` // Errors returned by the api-listen command (used in the Run() function)
|
||||||
|
keybase Keybase // Some methods will need this, so I'm passing it but keeping it unexported
|
||||||
|
}
|
||||||
|
|
||||||
|
type sender struct {
|
||||||
|
UID string `json:"uid"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
DeviceID string `json:"device_id"`
|
||||||
|
DeviceName string `json:"device_name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type addedtoteam struct {
|
||||||
|
Team string `json:"team"`
|
||||||
|
Adder string `json:"adder"`
|
||||||
|
Addee string `json:"addee"`
|
||||||
|
Owners []string `json:"owners"`
|
||||||
|
Admins []string `json:"admins"`
|
||||||
|
Writers []string `json:"writers"`
|
||||||
|
Readers []string `json:"readers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type bulkaddtoconv struct {
|
||||||
|
Usernames []string `json:"usernames"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type commits struct {
|
||||||
|
CommitHash string `json:"commitHash"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
AuthorName string `json:"authorName"`
|
||||||
|
AuthorEmail string `json:"authorEmail"`
|
||||||
|
Ctime int `json:"ctime"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type refs struct {
|
||||||
|
RefName string `json:"refName"`
|
||||||
|
Commits []commits `json:"commits"`
|
||||||
|
MoreCommitsAvailable bool `json:"moreCommitsAvailable"`
|
||||||
|
IsDelete bool `json:"isDelete"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type gitpush struct {
|
||||||
|
Team string `json:"team"`
|
||||||
|
Pusher string `json:"pusher"`
|
||||||
|
RepoName string `json:"repoName"`
|
||||||
|
RepoID string `json:"repoID"`
|
||||||
|
Refs []refs `json:"refs"`
|
||||||
|
PushType int `json:"pushType"`
|
||||||
|
PreviousRepoName string `json:"previousRepoName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type system struct {
|
||||||
|
SystemType int `json:"systemType"`
|
||||||
|
Addedtoteam addedtoteam `json:"addedtoteam"`
|
||||||
|
Bulkaddtoconv bulkaddtoconv `json:"bulkaddtoconv"`
|
||||||
|
Gitpush gitpush `json:"gitpush"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type paymentsResult struct {
|
||||||
|
ResultTyp int `json:"resultTyp"`
|
||||||
|
Sent string `json:"sent"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type payments struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
PaymentText string `json:"paymentText"`
|
||||||
|
Result paymentsResult `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type userMentions struct {
|
||||||
|
Text string `json:"text"`
|
||||||
|
UID string `json:"uid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type teamMentions struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Channel string `json:"channel"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type reaction struct {
|
||||||
|
M int `json:"m"`
|
||||||
|
B string `json:"b"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type delete struct {
|
||||||
|
MessageIDs []int `json:"messageIDs"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type edit struct {
|
||||||
|
MessageID int `json:"messageID"`
|
||||||
|
Body string `json:"body"`
|
||||||
|
Payments []payments `json:"payments"`
|
||||||
|
UserMentions []userMentions `json:"userMentions"`
|
||||||
|
TeamMentions []teamMentions `json:"teamMentions"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type text struct {
|
||||||
|
Body string `json:"body"`
|
||||||
|
Payments []payments `json:"payments"`
|
||||||
|
ReplyTo int `json:"replyTo"`
|
||||||
|
ReplyToUID string `json:"replyToUID"`
|
||||||
|
UserMentions []userMentions `json:"userMentions"`
|
||||||
|
TeamMentions []teamMentions `json:"teamMentions"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type flip struct {
|
||||||
|
Text string `json:"text"`
|
||||||
|
GameID string `json:"game_id"`
|
||||||
|
FlipConvID string `json:"flip_conv_id"`
|
||||||
|
UserMentions interface{} `json:"user_mentions"`
|
||||||
|
TeamMentions interface{} `json:"team_mentions"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type image struct {
|
||||||
|
Width int `json:"width"`
|
||||||
|
Height int `json:"height"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type metadata struct {
|
||||||
|
AssetType int `json:"assetType"`
|
||||||
|
Image image `json:"image"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type preview struct {
|
||||||
|
Filename string `json:"filename"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
Size int `json:"size"`
|
||||||
|
MimeType string `json:"mimeType"`
|
||||||
|
EncHash string `json:"encHash"`
|
||||||
|
Key string `json:"key"`
|
||||||
|
VerifyKey string `json:"verifyKey"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Nonce string `json:"nonce"`
|
||||||
|
Metadata metadata `json:"metadata"`
|
||||||
|
Tag int `json:"tag"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type previews struct {
|
||||||
|
Filename string `json:"filename"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
Size int `json:"size"`
|
||||||
|
MimeType string `json:"mimeType"`
|
||||||
|
EncHash string `json:"encHash"`
|
||||||
|
Key string `json:"key"`
|
||||||
|
VerifyKey string `json:"verifyKey"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Nonce string `json:"nonce"`
|
||||||
|
Metadata metadata `json:"metadata"`
|
||||||
|
Tag int `json:"tag"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type object struct {
|
||||||
|
Filename string `json:"filename"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
Endpoint string `json:"endpoint"`
|
||||||
|
Bucket string `json:"bucket"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
Size int `json:"size"`
|
||||||
|
MimeType string `json:"mimeType"`
|
||||||
|
EncHash string `json:"encHash"`
|
||||||
|
Key string `json:"key"`
|
||||||
|
VerifyKey string `json:"verifyKey"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
Nonce string `json:"nonce"`
|
||||||
|
Metadata metadata `json:"metadata"`
|
||||||
|
Tag int `json:"tag"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type attachment struct {
|
||||||
|
Object object `json:"object"`
|
||||||
|
Preview preview `json:"preview"`
|
||||||
|
Previews []previews `json:"previews"`
|
||||||
|
Metadata metadata `json:"metadata"`
|
||||||
|
Uploaded bool `json:"uploaded"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type content struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Attachment attachment `json:"attachment"`
|
||||||
|
Delete delete `json:"delete"`
|
||||||
|
Edit edit `json:"edit"`
|
||||||
|
Reaction reaction `json:"reaction"`
|
||||||
|
System system `json:"system"`
|
||||||
|
Text text `json:"text"`
|
||||||
|
SendPayment SendPayment `json:"send_payment"`
|
||||||
|
RequestPayment RequestPayment `json:"request_payment"`
|
||||||
|
Flip flip `json:"flip"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type msg struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
ConversationID string `json:"conversation_id"`
|
||||||
|
Channel Channel `json:"channel"`
|
||||||
|
Sender sender `json:"sender"`
|
||||||
|
SentAt int `json:"sent_at"`
|
||||||
|
SentAtMs int64 `json:"sent_at_ms"`
|
||||||
|
Content content `json:"content"`
|
||||||
|
Unread bool `json:"unread"`
|
||||||
|
AtMentionUsernames []string `json:"at_mention_usernames"`
|
||||||
|
IsEphemeral bool `json:"is_ephemeral"`
|
||||||
|
Etime int64 `json:"etime"`
|
||||||
|
HasPairwiseMacs bool `json:"has_pairwise_macs"`
|
||||||
|
ChannelMention string `json:"channel_mention"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type summary struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
TxID string `json:"txID"`
|
||||||
|
Time int64 `json:"time"`
|
||||||
|
StatusSimplified int `json:"statusSimplified"`
|
||||||
|
StatusDescription string `json:"statusDescription"`
|
||||||
|
StatusDetail string `json:"statusDetail"`
|
||||||
|
ShowCancel bool `json:"showCancel"`
|
||||||
|
AmountDescription string `json:"amountDescription"`
|
||||||
|
Delta int `json:"delta"`
|
||||||
|
Worth string `json:"worth"`
|
||||||
|
WorthAtSendTime string `json:"worthAtSendTime"`
|
||||||
|
IssuerDescription string `json:"issuerDescription"`
|
||||||
|
FromType int `json:"fromType"`
|
||||||
|
ToType int `json:"toType"`
|
||||||
|
AssetCode string `json:"assetCode"`
|
||||||
|
FromAccountID string `json:"fromAccountID"`
|
||||||
|
FromAccountName string `json:"fromAccountName"`
|
||||||
|
FromUsername string `json:"fromUsername"`
|
||||||
|
ToAccountID string `json:"toAccountID"`
|
||||||
|
ToAccountName string `json:"toAccountName"`
|
||||||
|
ToUsername string `json:"toUsername"`
|
||||||
|
ToAssertion string `json:"toAssertion"`
|
||||||
|
OriginalToAssertion string `json:"originalToAssertion"`
|
||||||
|
Note string `json:"note"`
|
||||||
|
NoteErr string `json:"noteErr"`
|
||||||
|
SourceAmountMax string `json:"sourceAmountMax"`
|
||||||
|
SourceAmountActual string `json:"sourceAmountActual"`
|
||||||
|
SourceAsset sourceAsset `json:"sourceAsset"`
|
||||||
|
SourceConvRate string `json:"sourceConvRate"`
|
||||||
|
IsAdvanced bool `json:"isAdvanced"`
|
||||||
|
SummaryAdvanced string `json:"summaryAdvanced"`
|
||||||
|
Operations interface{} `json:"operations"`
|
||||||
|
Unread bool `json:"unread"`
|
||||||
|
BatchID string `json:"batchID"`
|
||||||
|
FromAirdrop bool `json:"fromAirdrop"`
|
||||||
|
IsInflation bool `json:"isInflation"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type details struct {
|
||||||
|
PublicNote string `json:"publicNote"`
|
||||||
|
PublicNoteType string `json:"publicNoteType"`
|
||||||
|
ExternalTxURL string `json:"externalTxURL"`
|
||||||
|
FeeChargedDescription string `json:"feeChargedDescription"`
|
||||||
|
PathIntermediate interface{} `json:"pathIntermediate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type notification struct {
|
||||||
|
Summary summary `json:"summary"`
|
||||||
|
Details details `json:"details"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel holds information about a conversation
|
||||||
|
type Channel struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Public bool `json:"public,omitempty"`
|
||||||
|
MembersType string `json:"members_type,omitempty"`
|
||||||
|
TopicType string `json:"topic_type,omitempty"`
|
||||||
|
TopicName string `json:"topic_name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BotCommand struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Usage string `json:"usage"`
|
||||||
|
ExtendedDescription *BotCommandExtendedDescription `json:"extended_description,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BotCommandExtendedDescription struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
DesktopBody string `json:"desktop_body"`
|
||||||
|
MobileBody string `json:"mobile_body"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BotAdvertisement struct {
|
||||||
|
Type string `json:"type"` // "public", "teamconvs", "teammembers"
|
||||||
|
TeamName string `json:"team_name,omitempty"` // required if Type is not "public"
|
||||||
|
BotCommands []BotCommand `json:"commands"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type mesg struct {
|
||||||
|
Body string `json:"body"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type duration struct {
|
||||||
|
time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *duration) UnmarshalJSON(b []byte) (err error) {
|
||||||
|
d.Duration, err = time.ParseDuration(strings.Trim(string(b), `"`))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *duration) MarshalJSON() (b []byte, err error) {
|
||||||
|
return []byte(fmt.Sprintf(`"%s"`, d.String())), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type options struct {
|
||||||
|
Channel *Channel `json:"channel,omitempty"`
|
||||||
|
MessageID int `json:"message_id,omitempty"`
|
||||||
|
Message *mesg `json:"message,omitempty"`
|
||||||
|
Pagination *pagination `json:"pagination,omitempty"`
|
||||||
|
Filename string `json:"filename,omitempty,omitempty"`
|
||||||
|
Title string `json:"title,omitempty,omitempty"`
|
||||||
|
Output string `json:"output,omitempty,omitempty"`
|
||||||
|
ConversationID string `json:"conversation_id,omitempty"`
|
||||||
|
FlipConversationID string `json:"flip_conversation_id,omitempty"`
|
||||||
|
MsgID int `json:"msg_id,omitempty"`
|
||||||
|
ReplyTo int `json:"reply_to,omitempty"`
|
||||||
|
GameID string `json:"game_id,omitempty"`
|
||||||
|
Alias string `json:"alias,omitempty"`
|
||||||
|
BotAdvertisements []BotAdvertisement `json:"advertisements,omitempty"`
|
||||||
|
ExplodingLifetime duration `json:"exploding_lifetime,omitempty"`
|
||||||
|
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Public bool `json:"public,omitempty"`
|
||||||
|
MembersType string `json:"members_type,omitempty"`
|
||||||
|
TopicType string `json:"topic_type,omitempty"`
|
||||||
|
TopicName string `json:"topic_name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type params struct {
|
||||||
|
Options options `json:"options"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type pagination struct {
|
||||||
|
Next string `json:"next"`
|
||||||
|
Previous string `json:"previous"`
|
||||||
|
Num int `json:"num"`
|
||||||
|
Last bool `json:"last,omitempty"`
|
||||||
|
ForceFirstPage bool `json:"forceFirstPage,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type participants struct {
|
||||||
|
UID string `json:"uid"`
|
||||||
|
DeviceID string `json:"deviceID"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
DeviceName string `json:"deviceName"`
|
||||||
|
Commitment string `json:"commitment"`
|
||||||
|
Reveal string `json:"reveal"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type dupreg struct {
|
||||||
|
User string `json:"user"`
|
||||||
|
Device string `json:"device"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type errorInfo struct {
|
||||||
|
Typ int `json:"typ"`
|
||||||
|
Dupreg dupreg `json:"dupreg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type resultInfo struct {
|
||||||
|
Typ int `json:"typ"`
|
||||||
|
Coin bool `json:"coin"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type flipStatus struct {
|
||||||
|
GameID string `json:"gameID"`
|
||||||
|
Phase int `json:"phase"`
|
||||||
|
ProgressText string `json:"progressText"`
|
||||||
|
ResultText string `json:"resultText"`
|
||||||
|
CommitmentVisualization string `json:"commitmentVisualization"`
|
||||||
|
RevealVisualization string `json:"revealVisualization"`
|
||||||
|
Participants []participants `json:"participants"`
|
||||||
|
ResultInfo *resultInfo `json:"resultInfo"`
|
||||||
|
ErrorInfo *errorInfo `json:"errorInfo"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type result struct {
|
||||||
|
Messages []messages `json:"messages,omitempty"`
|
||||||
|
Pagination pagination `json:"pagination"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
ID int `json:"id"`
|
||||||
|
Ratelimits []rateLimits `json:"ratelimits"`
|
||||||
|
Conversations []conversation `json:"conversations,omitempty"`
|
||||||
|
Offline bool `json:"offline,omitempty"`
|
||||||
|
Status flipStatus `json:"status,omitempty"`
|
||||||
|
IdentifyFailures interface{} `json:"identifyFailures,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type messages struct {
|
||||||
|
Msg msg `json:"msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type rateLimits struct {
|
||||||
|
Tank string `json:"tank,omitempty"`
|
||||||
|
Capacity int `json:"capacity,omitempty"`
|
||||||
|
Reset int `json:"reset,omitempty"`
|
||||||
|
Gas int `json:"gas,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type conversation struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Channel Channel `json:"channel"`
|
||||||
|
Unread bool `json:"unread"`
|
||||||
|
ActiveAt int `json:"active_at"`
|
||||||
|
ActiveAtMs int64 `json:"active_at_ms"`
|
||||||
|
MemberStatus string `json:"member_status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SendPayment struct {
|
||||||
|
PaymentID string `json:"paymentID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type RequestPayment struct {
|
||||||
|
RequestID string `json:"requestID"`
|
||||||
|
Note string `json:"note"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WalletAPI holds data for sending to API
|
||||||
|
type WalletAPI struct {
|
||||||
|
Method string `json:"method,omitempty"`
|
||||||
|
Params *wParams `json:"params,omitempty"`
|
||||||
|
Result *wResult `json:"result,omitempty"`
|
||||||
|
Error *Error `json:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type wOptions struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Txid string `json:"txid"`
|
||||||
|
Recipient string `json:"recipient"`
|
||||||
|
Amount string `json:"amount"`
|
||||||
|
Currency string `json:"currency"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type wParams struct {
|
||||||
|
Options wOptions `json:"options"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type asset struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
Issuer string `json:"issuer"`
|
||||||
|
VerifiedDomain string `json:"verifiedDomain"`
|
||||||
|
IssuerName string `json:"issuerName"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
InfoURL string `json:"infoUrl"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type sourceAsset struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Code string `json:"code"`
|
||||||
|
Issuer string `json:"issuer"`
|
||||||
|
VerifiedDomain string `json:"verifiedDomain"`
|
||||||
|
IssuerName string `json:"issuerName"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
InfoURL string `json:"infoUrl"`
|
||||||
|
InfoURLText string `json:"infoUrlText"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type balance struct {
|
||||||
|
Asset asset `json:"asset"`
|
||||||
|
Amount string `json:"amount"`
|
||||||
|
Limit string `json:"limit"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type exchangeRate struct {
|
||||||
|
Currency string `json:"currency"`
|
||||||
|
Rate string `json:"rate"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type wResult struct {
|
||||||
|
AccountID string `json:"accountID"`
|
||||||
|
IsPrimary bool `json:"isPrimary"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Balance []balance `json:"balance"`
|
||||||
|
ExchangeRate exchangeRate `json:"exchangeRate"`
|
||||||
|
AccountMode int `json:"accountMode"`
|
||||||
|
TxID string `json:"txID"`
|
||||||
|
Time int64 `json:"time"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
StatusDetail string `json:"statusDetail"`
|
||||||
|
Amount string `json:"amount"`
|
||||||
|
Asset asset `json:"asset"`
|
||||||
|
DisplayAmount string `json:"displayAmount"`
|
||||||
|
DisplayCurrency string `json:"displayCurrency"`
|
||||||
|
SourceAmountMax string `json:"sourceAmountMax"`
|
||||||
|
SourceAmountActual string `json:"sourceAmountActual"`
|
||||||
|
SourceAsset sourceAsset `json:"sourceAsset"`
|
||||||
|
FromStellar string `json:"fromStellar"`
|
||||||
|
ToStellar string `json:"toStellar"`
|
||||||
|
FromUsername string `json:"fromUsername"`
|
||||||
|
ToUsername string `json:"toUsername"`
|
||||||
|
Note string `json:"note"`
|
||||||
|
NoteErr string `json:"noteErr"`
|
||||||
|
Unread bool `json:"unread"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TeamAPI holds information sent and received to/from the team api
|
||||||
|
type TeamAPI struct {
|
||||||
|
Method string `json:"method,omitempty"`
|
||||||
|
Params *tParams `json:"params,omitempty"`
|
||||||
|
Result *tResult `json:"result,omitempty"`
|
||||||
|
Error *Error `json:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type emails struct {
|
||||||
|
Email string `json:"email"`
|
||||||
|
Role string `json:"role"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type usernames struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
Role string `json:"role"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type user struct {
|
||||||
|
UID string `json:"uid"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type uv struct {
|
||||||
|
UID string `json:"uid"`
|
||||||
|
EldestSeqno int `json:"eldestSeqno"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type member struct {
|
||||||
|
Uv uv `json:"uv"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
FullName string `json:"fullName"`
|
||||||
|
NeedsPUK bool `json:"needsPUK"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type members struct {
|
||||||
|
Owners []member `json:"owners"`
|
||||||
|
Admins []member `json:"admins"`
|
||||||
|
Writers []member `json:"writers"`
|
||||||
|
Readers []member `json:"readers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type annotatedActiveInvites struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
type settings struct {
|
||||||
|
Open bool `json:"open"`
|
||||||
|
JoinAs int `json:"joinAs"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type showcase struct {
|
||||||
|
IsShowcased bool `json:"is_showcased"`
|
||||||
|
AnyMemberShowcase bool `json:"any_member_showcase"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type tOptions struct {
|
||||||
|
Team string `json:"team"`
|
||||||
|
Emails []emails `json:"emails"`
|
||||||
|
Usernames []usernames `json:"usernames"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type tParams struct {
|
||||||
|
Options tOptions `json:"options"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Error struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type tResult struct {
|
||||||
|
ChatSent bool `json:"chatSent"`
|
||||||
|
CreatorAdded bool `json:"creatorAdded"`
|
||||||
|
Invited bool `json:"invited"`
|
||||||
|
User user `json:"user"`
|
||||||
|
EmailSent bool `json:"emailSent"`
|
||||||
|
ChatSending bool `json:"chatSending"`
|
||||||
|
Members members `json:"members"`
|
||||||
|
KeyGeneration int `json:"keyGeneration"`
|
||||||
|
AnnotatedActiveInvites annotatedActiveInvites `json:"annotatedActiveInvites"`
|
||||||
|
Settings settings `json:"settings"`
|
||||||
|
Showcase showcase `json:"showcase"`
|
||||||
|
Teams []teamInfo `json:"teams"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type implicit struct {
|
||||||
|
Role int `json:"role"`
|
||||||
|
Ancestor string `json:"ancestor"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type teamInfo struct {
|
||||||
|
UID string `json:"uid"`
|
||||||
|
TeamID string `json:"team_id"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
FullName string `json:"full_name"`
|
||||||
|
FqName string `json:"fq_name"`
|
||||||
|
IsImplicitTeam bool `json:"is_implicit_team"`
|
||||||
|
ImplicitTeamDisplayName string `json:"implicit_team_display_name"`
|
||||||
|
IsOpenTeam bool `json:"is_open_team"`
|
||||||
|
Role int `json:"role"`
|
||||||
|
NeedsPUK bool `json:"needsPUK"`
|
||||||
|
MemberCount int `json:"member_count"`
|
||||||
|
MemberEldestSeqno int `json:"member_eldest_seqno"`
|
||||||
|
AllowProfilePromote bool `json:"allow_profile_promote"`
|
||||||
|
IsMemberShowcased bool `json:"is_member_showcased"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
Implicit implicit `json:"implicit,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// KVAPI holds information sent and received to/from the kvstore api
|
||||||
|
type KVAPI struct {
|
||||||
|
Method string `json:"method,omitempty"`
|
||||||
|
Params *kvParams `json:"params,omitempty"`
|
||||||
|
Result *kvResult `json:"result,omitempty"`
|
||||||
|
Error *Error `json:"error"`
|
||||||
|
keybase Keybase
|
||||||
|
}
|
||||||
|
|
||||||
|
type kvOptions struct {
|
||||||
|
Team string `json:"team,omitempty"`
|
||||||
|
Namespace string `json:"namespace,omitempty"`
|
||||||
|
EntryKey string `json:"entryKey,omitempty"`
|
||||||
|
Revision uint `json:"revision,omitempty"`
|
||||||
|
EntryValue string `json:"entryValue,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type kvParams struct {
|
||||||
|
Options kvOptions `json:"options,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type entryKey struct {
|
||||||
|
EntryKey string `json:"entryKey"`
|
||||||
|
Revision uint `json:"revision"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type kvResult struct {
|
||||||
|
TeamName string `json:"teamName"`
|
||||||
|
Namespaces []string `json:"namespaces"`
|
||||||
|
EntryKeys []entryKey `json:"entryKeys"`
|
||||||
|
EntryKey string `json:"entryKey"`
|
||||||
|
EntryValue string `json:"entryValue"`
|
||||||
|
Revision uint `json:"revision"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserAPI holds information received from the user/lookup 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 key struct {
|
||||||
|
KeyRole int `json:"key_role"`
|
||||||
|
Kid string `json:"kid"`
|
||||||
|
SigID string `json:"sig_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type uDevice struct {
|
||||||
|
Ctime int `json:"ctime"`
|
||||||
|
Keys []key `json:"keys"`
|
||||||
|
Mtime int `json:"mtime"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type them struct {
|
||||||
|
Basics basics `json:"basics,omitempty"`
|
||||||
|
ID string `json:"id"`
|
||||||
|
Profile profile `json:"profile,omitempty"`
|
||||||
|
ProofsSummary proofsSummary `json:"proofs_summary"`
|
||||||
|
Devices map[string]uDevice `json:"devices,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserCardAPI holds information received from the user/card api
|
||||||
|
type UserCardAPI struct {
|
||||||
|
AirdropRegistered bool `json:"airdrop_registered"`
|
||||||
|
Blocked bool `json:"blocked"`
|
||||||
|
FollowSummary followSummary `json:"follow_summary"`
|
||||||
|
Profile cardProfile `json:"profile"`
|
||||||
|
Status uStatus `json:"status"`
|
||||||
|
TeamShowcase []teamShowcase `json:"team_showcase"`
|
||||||
|
TheyFollowYou bool `json:"they_follow_you"`
|
||||||
|
UserBlocks userBlocks `json:"user_blocks"`
|
||||||
|
YouFollowThem bool `json:"you_follow_them"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type followSummary struct {
|
||||||
|
Followers int `json:"followers"`
|
||||||
|
Following int `json:"following"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type cardProfile struct {
|
||||||
|
Bio string `json:"bio"`
|
||||||
|
Comment string `json:"comment"`
|
||||||
|
CrimeAll int `json:"crime_all"`
|
||||||
|
CrimeChat int `json:"crime_chat"`
|
||||||
|
CrimeFollow int `json:"crime_follow"`
|
||||||
|
CrimeIllegal int `json:"crime_illegal"`
|
||||||
|
CrimeLegacyAll int `json:"crime_legacy_all"`
|
||||||
|
CrimeLegacyPorn int `json:"crime_legacy_porn"`
|
||||||
|
CrimeLegacyStellar int `json:"crime_legacy_stellar"`
|
||||||
|
CrimePorn int `json:"crime_porn"`
|
||||||
|
CrimeSmurfing int `json:"crime_smurfing"`
|
||||||
|
CrimeSpacedrop int `json:"crime_spacedrop"`
|
||||||
|
CrimeStellarDust int `json:"crime_stellar_dust"`
|
||||||
|
CrimeStellarPaymentReq int `json:"crime_stellar_payment_req"`
|
||||||
|
CrimeTeam int `json:"crime_team"`
|
||||||
|
Ctime time.Time `json:"ctime"`
|
||||||
|
FullName string `json:"full_name"`
|
||||||
|
IsAdmin int `json:"is_admin"`
|
||||||
|
Location string `json:"location"`
|
||||||
|
Mtime time.Time `json:"mtime"`
|
||||||
|
Reporter string `json:"reporter"`
|
||||||
|
Status int `json:"status"`
|
||||||
|
Twitter string `json:"twitter"`
|
||||||
|
UID string `json:"uid"`
|
||||||
|
Website string `json:"website"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type teamShowcase struct {
|
||||||
|
Description string `json:"description"`
|
||||||
|
FqName string `json:"fq_name"`
|
||||||
|
NumMembers int `json:"num_members"`
|
||||||
|
Open bool `json:"open"`
|
||||||
|
PublicAdmins []string `json:"public_admins"`
|
||||||
|
Role int `json:"role"`
|
||||||
|
TeamID string `json:"team_id"`
|
||||||
|
TeamIsShowcased bool `json:"team_is_showcased"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type userBlocks struct {
|
||||||
|
Chat bool `json:"chat"`
|
||||||
|
Ctime time.Time `json:"ctime"`
|
||||||
|
Follow bool `json:"follow"`
|
||||||
|
Mtime time.Time `json:"mtime"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keybase holds basic information about the local Keybase executable
|
||||||
|
type Keybase struct {
|
||||||
|
Path string
|
||||||
|
Username string
|
||||||
|
LoggedIn bool
|
||||||
|
Version string
|
||||||
|
Device string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chat holds basic information about a specific conversation
|
||||||
|
type Chat struct {
|
||||||
|
keybase *Keybase
|
||||||
|
Channel Channel
|
||||||
|
}
|
||||||
|
|
||||||
|
type chat interface {
|
||||||
|
Delete(messageID int) (ChatAPI, error)
|
||||||
|
Edit(messageID int, message ...string) (ChatAPI, error)
|
||||||
|
React(messageID int, reaction string) (ChatAPI, error)
|
||||||
|
Send(message ...string) (ChatAPI, error)
|
||||||
|
Reply(replyTo int, message ...string) (ChatAPI, error)
|
||||||
|
Upload(title string, filepath string) (ChatAPI, error)
|
||||||
|
Download(messageID int, filepath string) (ChatAPI, error)
|
||||||
|
LoadFlip(messageID int, conversationID string, flipConversationID string, gameID string) (ChatAPI, error)
|
||||||
|
Pin(messageID int) (ChatAPI, error)
|
||||||
|
Unpin() (ChatAPI, error)
|
||||||
|
Mark(messageID int) (ChatAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type chatAPI interface {
|
||||||
|
Next(count ...int) (*ChatAPI, error)
|
||||||
|
Previous(count ...int) (*ChatAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Team holds basic information about a team
|
||||||
|
type Team struct {
|
||||||
|
keybase *Keybase
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type team interface {
|
||||||
|
AddAdmins(users ...string) (TeamAPI, error)
|
||||||
|
AddOwners(users ...string) (TeamAPI, error)
|
||||||
|
AddReaders(users ...string) (TeamAPI, error)
|
||||||
|
AddUser(user, role string) (TeamAPI, error)
|
||||||
|
AddWriters(users ...string) (TeamAPI, error)
|
||||||
|
CreateSubteam(name string) (TeamAPI, error)
|
||||||
|
MemberList() (TeamAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wallet holds basic information about a wallet
|
||||||
|
type Wallet struct {
|
||||||
|
keybase *Keybase
|
||||||
|
}
|
||||||
|
|
||||||
|
type wallet interface {
|
||||||
|
CancelRequest(requestID string) error
|
||||||
|
RequestPayment(user string, amount float64, memo ...string)
|
||||||
|
Send(recipient string, amount string, currency string, message ...string) (WalletAPI, error)
|
||||||
|
SendXLM(recipient string, amount string, message ...string) (WalletAPI, error)
|
||||||
|
StellarAddress(user string) (string, error)
|
||||||
|
TxDetail(txid string) (WalletAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// KV holds basic information about a KVStore
|
||||||
|
type KV struct {
|
||||||
|
keybase *Keybase
|
||||||
|
Team string
|
||||||
|
}
|
||||||
|
|
||||||
|
type kvInterface interface {
|
||||||
|
Namespaces() (KVAPI, error)
|
||||||
|
Keys(namespace string) (KVAPI, error)
|
||||||
|
Get(namespace string, key string) (KVAPI, error)
|
||||||
|
Put(namespace string, key string, value string) (KVAPI, error)
|
||||||
|
Delete(namespace string, key string) (KVAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type keybase interface {
|
||||||
|
AdvertiseCommand(advertisement BotAdvertisement) (ChatAPI, error)
|
||||||
|
AdvertiseCommands(advertisements []BotAdvertisement) (ChatAPI, error)
|
||||||
|
ChatList(opts ...Channel) (ChatAPI, error)
|
||||||
|
ClearCommands() (ChatAPI, error)
|
||||||
|
CreateTeam(name string) (TeamAPI, error)
|
||||||
|
NewChat(channel Channel) Chat
|
||||||
|
NewTeam(name string) Team
|
||||||
|
NewKV(team string) KV
|
||||||
|
NewWallet() Wallet
|
||||||
|
Run(handler func(ChatAPI), options ...RunOptions)
|
||||||
|
status() status
|
||||||
|
version() string
|
||||||
|
UserLookup(users ...string) (UserAPI, error)
|
||||||
|
ListUserMemberships(user string) (TeamAPI, error)
|
||||||
|
UserCard(user string) (UserCardAPI, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type status struct {
|
||||||
|
Username string `json:"Username"`
|
||||||
|
LoggedIn bool `json:"LoggedIn"`
|
||||||
|
Device device `json:"Device"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type device struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
@ -5,11 +5,9 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os/exec"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"samhofi.us/x/keybase/v2/types/chat1"
|
"samhofi.us/x/keybase/v2/types/chat1"
|
||||||
"samhofi.us/x/keybase/v2/types/keybase1"
|
|
||||||
"samhofi.us/x/keybase/v2/types/stellar1"
|
"samhofi.us/x/keybase/v2/types/stellar1"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,7 +36,15 @@ func getNewMessages(k *Keybase, subs *subscriptionChannels, execOptions []string
|
|||||||
execString = append(execString, execOptions...)
|
execString = append(execString, execOptions...)
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
execCmd := exec.Command(k.Path, execString...)
|
cmd := make([]string, 0)
|
||||||
|
|
||||||
|
if k.HomePath != "" {
|
||||||
|
cmd = append(cmd, "--home", k.HomePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = append(cmd, execString...)
|
||||||
|
|
||||||
|
execCmd := execCommand(k.ExePath, cmd...)
|
||||||
stdOut, _ := execCmd.StdoutPipe()
|
stdOut, _ := execCmd.StdoutPipe()
|
||||||
execCmd.Start()
|
execCmd.Start()
|
||||||
scanner := bufio.NewScanner(stdOut)
|
scanner := bufio.NewScanner(stdOut)
|
||||||
@ -701,10 +707,10 @@ func (k *Keybase) ClearCommands() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListMembers returns member information for a channel or conversation
|
// ListMembers returns member information for a channel or conversation
|
||||||
func (k *Keybase) ListMembers(options ListMembersOptions) (keybase1.TeamDetails, error) {
|
func (k *Keybase) ListMembers(options ListMembersOptions) (chat1.ChatMembersDetails, error) {
|
||||||
type res struct {
|
type res struct {
|
||||||
Result keybase1.TeamDetails `json:"result"`
|
Result chat1.ChatMembersDetails `json:"result"`
|
||||||
Error *Error `json:"error,omitempty"`
|
Error *Error `json:"error,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var r res
|
var r res
|
||||||
@ -731,7 +737,7 @@ func (k *Keybase) ListMembers(options ListMembersOptions) (keybase1.TeamDetails,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListMembersOfChannel returns member information for a channel
|
// ListMembersOfChannel returns member information for a channel
|
||||||
func (k *Keybase) ListMembersOfChannel(channel chat1.ChatChannel) (keybase1.TeamDetails, error) {
|
func (k *Keybase) ListMembersOfChannel(channel chat1.ChatChannel) (chat1.ChatMembersDetails, error) {
|
||||||
opts := ListMembersOptions{
|
opts := ListMembersOptions{
|
||||||
Channel: channel,
|
Channel: channel,
|
||||||
}
|
}
|
||||||
@ -739,9 +745,43 @@ func (k *Keybase) ListMembersOfChannel(channel chat1.ChatChannel) (keybase1.Team
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ListMembersOfConversation returns member information for a conversation
|
// ListMembersOfConversation returns member information for a conversation
|
||||||
func (k *Keybase) ListMembersOfConversation(convID chat1.ConvIDStr) (keybase1.TeamDetails, error) {
|
func (k *Keybase) ListMembersOfConversation(convID chat1.ConvIDStr) (chat1.ChatMembersDetails, error) {
|
||||||
opts := ListMembersOptions{
|
opts := ListMembersOptions{
|
||||||
ConversationID: convID,
|
ConversationID: convID,
|
||||||
}
|
}
|
||||||
return k.ListMembers(opts)
|
return k.ListMembers(opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListConvsOnName returns a list of all conversations for a chat1.ChatChannel
|
||||||
|
func (k *Keybase) ListConvsOnName(channel chat1.ChatChannel) (*[]chat1.ConvSummary, error) {
|
||||||
|
type result struct {
|
||||||
|
Conversations []chat1.ConvSummary `json:"conversations"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type res struct {
|
||||||
|
Result result `json:"result"`
|
||||||
|
Error *Error `json:"error,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var r res
|
||||||
|
|
||||||
|
arg := newListConvsOnNameArg(channel)
|
||||||
|
|
||||||
|
jsonBytes, _ := json.Marshal(arg)
|
||||||
|
|
||||||
|
cmdOut, err := k.Exec("chat", "api", "-m", string(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(cmdOut, &r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Error != nil {
|
||||||
|
return nil, fmt.Errorf("%v", r.Error.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &r.Result.Conversations, nil
|
||||||
|
}
|
||||||
135
v2/chat_test.go
Normal file
135
v2/chat_test.go
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os/exec"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"samhofi.us/x/keybase/v2/types/chat1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestListConvsOnName(t *testing.T) {
|
||||||
|
execCommand = createFakeExecCommand("listconvsonname")
|
||||||
|
defer func() { execCommand = exec.Command }()
|
||||||
|
|
||||||
|
channel := chat1.ChatChannel{
|
||||||
|
Name: "mkbot",
|
||||||
|
MembersType: TEAM,
|
||||||
|
}
|
||||||
|
k := New()
|
||||||
|
res, err := k.ListConvsOnName(channel)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected nil error, got %#v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
channelcount := 10
|
||||||
|
if len(*res) != channelcount {
|
||||||
|
t.Errorf("Expected %d channels, got %d channels", channelcount, len(*res))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSendMessageByChannel(t *testing.T) {
|
||||||
|
execCommand = createFakeExecCommand("send")
|
||||||
|
defer func() { execCommand = exec.Command }()
|
||||||
|
|
||||||
|
channel := chat1.ChatChannel{
|
||||||
|
Name: "user1,user2",
|
||||||
|
MembersType: USER,
|
||||||
|
}
|
||||||
|
k := New()
|
||||||
|
res, err := k.SendMessageByChannel(channel, "Hello!")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected nil error, got %#v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected := "message sent"; res.Message != expected {
|
||||||
|
t.Errorf(`res.Message: expected "%s", got "%v"`, expected, res.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected := uint(894); uint(*res.MessageID) != expected {
|
||||||
|
t.Errorf(`res.MessageID: expected %d, got %d`, expected, uint(*res.MessageID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSendMessageByConvID(t *testing.T) {
|
||||||
|
execCommand = createFakeExecCommand("send")
|
||||||
|
defer func() { execCommand = exec.Command }()
|
||||||
|
|
||||||
|
k := New()
|
||||||
|
res, err := k.SendMessageByConvID(chat1.ConvIDStr("000049d2395435dff0c865c18832d9645eb69fd74a2814ef55310b294092ba6d"), "Hello!")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected nil error, got %#v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected := "message sent"; res.Message != expected {
|
||||||
|
t.Errorf(`res.Message: expected "%s", got "%v"`, expected, res.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected := uint(894); uint(*res.MessageID) != expected {
|
||||||
|
t.Errorf(`res.MessageID: expected %d, got %d`, expected, uint(*res.MessageID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateFilterString(t *testing.T) {
|
||||||
|
tables := []struct {
|
||||||
|
channel chat1.ChatChannel
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
chat1.ChatChannel{},
|
||||||
|
``,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
chat1.ChatChannel{Name: "faketeam", MembersType: TEAM},
|
||||||
|
`{"name":"faketeam","members_type":"team"}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
chat1.ChatChannel{Name: "user1,user2", MembersType: USER},
|
||||||
|
`{"name":"user1,user2","members_type":"impteamnative"}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, table := range tables {
|
||||||
|
if result := createFilterString(table.channel); result != table.expected {
|
||||||
|
t.Errorf(`Expected "%s", got "%s"`, table.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateFiltersString(t *testing.T) {
|
||||||
|
tables := []struct {
|
||||||
|
channel []chat1.ChatChannel
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
[]chat1.ChatChannel{},
|
||||||
|
``,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[]chat1.ChatChannel{
|
||||||
|
chat1.ChatChannel{Name: "faketeam1", MembersType: TEAM},
|
||||||
|
chat1.ChatChannel{Name: "faketeam2", MembersType: TEAM},
|
||||||
|
},
|
||||||
|
`[{"name":"faketeam1","members_type":"team"},{"name":"faketeam2","members_type":"team"}]`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[]chat1.ChatChannel{
|
||||||
|
chat1.ChatChannel{Name: "user1,user2", MembersType: USER},
|
||||||
|
chat1.ChatChannel{Name: "user3,user4", MembersType: USER},
|
||||||
|
},
|
||||||
|
`[{"name":"user1,user2","members_type":"impteamnative"},{"name":"user3,user4","members_type":"impteamnative"}]`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[]chat1.ChatChannel{
|
||||||
|
chat1.ChatChannel{Name: "user1,user2", MembersType: USER},
|
||||||
|
chat1.ChatChannel{Name: "faketeam1", MembersType: TEAM},
|
||||||
|
},
|
||||||
|
`[{"name":"user1,user2","members_type":"impteamnative"},{"name":"faketeam1","members_type":"team"}]`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, table := range tables {
|
||||||
|
if result := createFiltersString(table.channel); result != table.expected {
|
||||||
|
t.Errorf(`Expected "%s", got "%s"`, table.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -9,6 +9,9 @@ import (
|
|||||||
"samhofi.us/x/keybase/v2/types/chat1"
|
"samhofi.us/x/keybase/v2/types/chat1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Used for testing
|
||||||
|
var execCommand = exec.Command
|
||||||
|
|
||||||
// Possible MemberTypes
|
// Possible MemberTypes
|
||||||
const (
|
const (
|
||||||
TEAM string = "team"
|
TEAM string = "team"
|
||||||
@ -21,13 +24,33 @@ const (
|
|||||||
CHAT string = "chat"
|
CHAT string = "chat"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// New returns a new Keybase
|
||||||
|
func New(opts ...KeybaseOpt) *Keybase {
|
||||||
|
k := &Keybase{ExePath: "keybase"}
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt.apply(k)
|
||||||
|
}
|
||||||
|
|
||||||
|
s := k.status()
|
||||||
|
k.Version = k.version()
|
||||||
|
k.LoggedIn = s.LoggedIn
|
||||||
|
if k.LoggedIn {
|
||||||
|
k.Username = s.Username
|
||||||
|
k.Device = s.Device.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
|
||||||
// NewKeybase returns a new Keybase. Optionally, you can pass a string containing the path to the Keybase executable as the first argument.
|
// NewKeybase returns a new Keybase. Optionally, you can pass a string containing the path to the Keybase executable as the first argument.
|
||||||
|
// This is deprecated and will be removed in a future update. Use New() instead.
|
||||||
func NewKeybase(path ...string) *Keybase {
|
func NewKeybase(path ...string) *Keybase {
|
||||||
k := &Keybase{}
|
k := &Keybase{}
|
||||||
if len(path) < 1 {
|
if len(path) < 1 {
|
||||||
k.Path = "keybase"
|
k.ExePath = "keybase"
|
||||||
} else {
|
} else {
|
||||||
k.Path = path[0]
|
k.ExePath = path[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
s := k.status()
|
s := k.status()
|
||||||
@ -42,7 +65,15 @@ func NewKeybase(path ...string) *Keybase {
|
|||||||
|
|
||||||
// Exec executes the given Keybase command
|
// Exec executes the given Keybase command
|
||||||
func (k *Keybase) Exec(command ...string) ([]byte, error) {
|
func (k *Keybase) Exec(command ...string) ([]byte, error) {
|
||||||
out, err := exec.Command(k.Path, command...).Output()
|
cmd := make([]string, 0)
|
||||||
|
|
||||||
|
if k.HomePath != "" {
|
||||||
|
cmd = append(cmd, "--home", k.HomePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = append(cmd, command...)
|
||||||
|
|
||||||
|
out, err := execCommand(k.ExePath, cmd...).Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []byte{}, err
|
return []byte{}, err
|
||||||
}
|
}
|
||||||
68
v2/keybase_test.go
Normal file
68
v2/keybase_test.go
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createFakeExecCommand(caller string) func(command string, args ...string) *exec.Cmd {
|
||||||
|
return func(command string, args ...string) *exec.Cmd {
|
||||||
|
cs := []string{"-test.run=ExecHelper", "--"}
|
||||||
|
cs = append(cs, args...)
|
||||||
|
cmd := exec.Command(os.Args[0], cs...)
|
||||||
|
cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1", "GO_WANT_HELPER_CALLER=" + caller}
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNew(t *testing.T) {
|
||||||
|
execCommand = createFakeExecCommand("new")
|
||||||
|
defer func() { execCommand = exec.Command }()
|
||||||
|
|
||||||
|
k := New()
|
||||||
|
|
||||||
|
if expected := "keybase"; k.ExePath != expected {
|
||||||
|
t.Errorf(`k.ExePath: expected "%s", got "%s"`, expected, k.ExePath)
|
||||||
|
}
|
||||||
|
if expected := ""; k.HomePath != expected {
|
||||||
|
t.Errorf(`k.HomePath: expected "%s", got "%s"`, expected, k.HomePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
k = New(
|
||||||
|
SetExePath("/path/to/exepath"),
|
||||||
|
SetHomePath("/path/to/homepath"),
|
||||||
|
)
|
||||||
|
|
||||||
|
if expected := "/path/to/exepath"; k.ExePath != expected {
|
||||||
|
t.Errorf(`k.ExePath: expected "%s", got "%s"`, expected, k.ExePath)
|
||||||
|
}
|
||||||
|
if expected := "/path/to/homepath"; k.HomePath != expected {
|
||||||
|
t.Errorf(`k.HomePath: expected "%s", got "%s"`, expected, k.HomePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExecHelper(t *testing.T) {
|
||||||
|
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
listconvsonname = `{"result":{"conversations":[{"id":"0000b9d9be8586029d4876af2192b94d6705603cf6859fc27c746de94befd45c","channel":{"name":"mkbot","members_type":"team","topic_type":"chat"},"is_default_conv":false,"unread":true,"active_at":1589468132,"active_at_ms":1589468132734,"member_status":"active","creator_info":{"ctime":1551848940888,"username":"dxb"}},{"id":"0000d2c4d915aa04c093a25b9496cd885ff510f4eeeacac5a7249f65d82ed0ad","channel":{"name":"mkbot","members_type":"team","topic_type":"chat"},"is_default_conv":false,"unread":false,"active_at":1589633805,"active_at_ms":1589633805970,"member_status":"active","creator_info":{"ctime":1551848919282,"username":"dxb"}},{"id":"0000e967261971be5aae47d1cfd7d77e695d4a2f90e2ee35236ef3472b2884d4","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"gameroom"},"is_default_conv":false,"unread":true,"active_at":1589468113,"active_at_ms":1589468113173,"member_status":"active","creator_info":{"ctime":1566244683161,"username":"dxb"}},{"id":"0000d5ae3da566307f6c9906881e5bd08dc9a0bf8c341b5769240026e367c478","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"general"},"is_default_conv":true,"unread":false,"active_at":1589348381,"active_at_ms":1589348381358,"member_status":"active","creator_info":{"ctime":1551840458201,"username":"dxb"}},{"id":"0000d7cf1e6f51d75f9a354c2cb7c3bd30415f184bbb9eba0c57aa50827b7663","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"test1"},"is_default_conv":false,"unread":true,"active_at":1589468203,"active_at_ms":1589468203686,"member_status":"active","creator_info":{"ctime":1551849049656,"username":"dxb"}},{"id":"0000d0cf70804671490e7f8f21c207a1ac6a8bc2ee05db804fb4531ab6c06f05","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"test2"},"is_default_conv":false,"unread":true,"active_at":1589468118,"active_at_ms":1589468118254,"member_status":"active","creator_info":{"ctime":1551849050007,"username":"dxb"}},{"id":"000044e620fef1e84b623350faff06ebef7a0cd7e403ba81a1b35d311976b9f6","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"test3"},"is_default_conv":false,"unread":true,"active_at":1589468117,"active_at_ms":1589468117094,"member_status":"active","creator_info":{"ctime":1551849050351,"username":"dxb"}},{"id":"0000a8dd5969f6bb414562278a5abf8f3bd80b39d7cdcf0d3df5045f05fbac77","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"test4"},"is_default_conv":false,"unread":true,"active_at":1589468197,"active_at_ms":1589468197735,"member_status":"active","creator_info":{"ctime":1551849050729,"username":"dxb"}},{"id":"00004380e20bf4d56cf5e80a7435d594e07ebe043da93468c93c9bf0080f9ef5","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"test5"},"is_default_conv":false,"unread":true,"active_at":1589468203,"active_at_ms":1589468203980,"member_status":"active","creator_info":{"ctime":1551849051084,"username":"dxb"}},{"id":"00003bd0aa429c33eee546f20efb76c9e0a9854b0ca18278300bcf6fc4c4fb93","channel":{"name":"mkbot","members_type":"team","topic_type":"chat","topic_name":"trivia"},"is_default_conv":false,"unread":false,"active_at":1589468113,"active_at_ms":1589468113074,"member_status":"active","creator_info":{"ctime":1580428008401,"username":"dxb"}}],"offline":false}}`
|
||||||
|
send = `{"result":{"message":"message sent","id":894,"ratelimits":[{"tank":"chat","capacity":9000,"reset":155,"gas":8991}]}}`
|
||||||
|
)
|
||||||
|
|
||||||
|
var jsonOut string
|
||||||
|
switch os.Getenv("GO_WANT_HELPER_CALLER") {
|
||||||
|
case "listconvsonname":
|
||||||
|
jsonOut = listconvsonname
|
||||||
|
case "send":
|
||||||
|
jsonOut = send
|
||||||
|
default:
|
||||||
|
jsonOut = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(os.Stdout, jsonOut)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
189
v2/team.go
Normal file
189
v2/team.go
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
package keybase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// teamAPIOut sends JSON requests to the team API and returns its response.
|
||||||
|
func teamAPIOut(k *Keybase, t TeamAPI) (TeamAPI, error) {
|
||||||
|
jsonBytes, _ := json.Marshal(t)
|
||||||
|
|
||||||
|
cmdOut, err := k.Exec("team", "api", "-m", string(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
|
return TeamAPI{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var r TeamAPI
|
||||||
|
if err := json.Unmarshal(cmdOut, &r); err != nil {
|
||||||
|
return TeamAPI{}, err
|
||||||
|
}
|
||||||
|
if r.Error != nil {
|
||||||
|
return TeamAPI{}, errors.New(r.Error.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddUser adds a member to a team by username
|
||||||
|
func (t Team) AddUser(user, role string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "add-members"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
m.Params.Options.Usernames = []usernames{
|
||||||
|
{
|
||||||
|
Username: user,
|
||||||
|
Role: role,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
if err == nil && r.Error == nil {
|
||||||
|
r, err = t.MemberList()
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveUser removes a member from a team
|
||||||
|
func (t Team) RemoveUser(user string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "remove-member"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
m.Params.Options.Username = user
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddReaders adds members to a team by username, and sets their roles to Reader
|
||||||
|
func (t Team) AddReaders(users ...string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "add-members"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
addUsers := []usernames{}
|
||||||
|
for _, u := range users {
|
||||||
|
addUsers = append(addUsers, usernames{Username: u, Role: "reader"})
|
||||||
|
}
|
||||||
|
m.Params.Options.Usernames = addUsers
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
if err == nil && r.Error == nil {
|
||||||
|
r, err = t.MemberList()
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddWriters adds members to a team by username, and sets their roles to Writer
|
||||||
|
func (t Team) AddWriters(users ...string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "add-members"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
addUsers := []usernames{}
|
||||||
|
for _, u := range users {
|
||||||
|
addUsers = append(addUsers, usernames{Username: u, Role: "writer"})
|
||||||
|
}
|
||||||
|
m.Params.Options.Usernames = addUsers
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
if err == nil && r.Error == nil {
|
||||||
|
r, err = t.MemberList()
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddAdmins adds members to a team by username, and sets their roles to Writer
|
||||||
|
func (t Team) AddAdmins(users ...string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "add-members"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
addUsers := []usernames{}
|
||||||
|
for _, u := range users {
|
||||||
|
addUsers = append(addUsers, usernames{Username: u, Role: "admin"})
|
||||||
|
}
|
||||||
|
m.Params.Options.Usernames = addUsers
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
if err == nil && r.Error == nil {
|
||||||
|
r, err = t.MemberList()
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOwners adds members to a team by username, and sets their roles to Writer
|
||||||
|
func (t Team) AddOwners(users ...string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "add-members"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
addUsers := []usernames{}
|
||||||
|
for _, u := range users {
|
||||||
|
addUsers = append(addUsers, usernames{Username: u, Role: "owner"})
|
||||||
|
}
|
||||||
|
m.Params.Options.Usernames = addUsers
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
if err == nil && r.Error == nil {
|
||||||
|
r, err = t.MemberList()
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// MemberList returns a list of a team's members
|
||||||
|
func (t Team) MemberList() (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "list-team-memberships"
|
||||||
|
m.Params.Options.Team = t.Name
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateSubteam creates a subteam
|
||||||
|
func (t Team) CreateSubteam(name string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "create-team"
|
||||||
|
m.Params.Options.Team = fmt.Sprintf("%s.%s", t.Name, name)
|
||||||
|
|
||||||
|
r, err := teamAPIOut(t.keybase, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTeam creates a new team
|
||||||
|
func (k *Keybase) CreateTeam(name string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "create-team"
|
||||||
|
m.Params.Options.Team = name
|
||||||
|
|
||||||
|
r, err := teamAPIOut(k, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListUserMemberships returns information about a given user's team memberships
|
||||||
|
func (k *Keybase) ListUserMemberships(user string) (TeamAPI, error) {
|
||||||
|
m := TeamAPI{
|
||||||
|
Params: &tParams{},
|
||||||
|
}
|
||||||
|
m.Method = "list-user-memberships"
|
||||||
|
m.Params.Options.Username = user
|
||||||
|
|
||||||
|
r, err := teamAPIOut(k, m)
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
@ -20,6 +20,37 @@ type RunOptions struct {
|
|||||||
FilterChannels []chat1.ChatChannel // Only subscribe to messages from specified channels
|
FilterChannels []chat1.ChatChannel // Only subscribe to messages from specified channels
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KeybaseOpt configures a Keybase
|
||||||
|
type KeybaseOpt interface {
|
||||||
|
apply(kb *Keybase)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetExePath sets the path to the Keybase executable
|
||||||
|
func SetExePath(path string) KeybaseOpt {
|
||||||
|
return setExePath{path}
|
||||||
|
}
|
||||||
|
|
||||||
|
type setExePath struct {
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o setExePath) apply(kb *Keybase) {
|
||||||
|
kb.ExePath = o.path
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHomePath sets the path to the Keybase home directory
|
||||||
|
func SetHomePath(path string) KeybaseOpt {
|
||||||
|
return setHomePath{path}
|
||||||
|
}
|
||||||
|
|
||||||
|
type setHomePath struct {
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o setHomePath) apply(kb *Keybase) {
|
||||||
|
kb.HomePath = o.path
|
||||||
|
}
|
||||||
|
|
||||||
type subscriptionType struct {
|
type subscriptionType struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
}
|
}
|
||||||
@ -83,6 +114,7 @@ type SendMessageOptions struct {
|
|||||||
ReplyTo *chat1.MessageID `json:"reply_to,omitempty"`
|
ReplyTo *chat1.MessageID `json:"reply_to,omitempty"`
|
||||||
ExplodingLifetime *ExplodingLifetime `json:"exploding_lifetime,omitempty"`
|
ExplodingLifetime *ExplodingLifetime `json:"exploding_lifetime,omitempty"`
|
||||||
UnreadOnly bool `json:"unread_only,omitempty"`
|
UnreadOnly bool `json:"unread_only,omitempty"`
|
||||||
|
NonBlock bool `json:"nonblock,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type sendMessageParams struct {
|
type sendMessageParams struct {
|
||||||
@ -207,6 +239,24 @@ func newListMembersArg(options ListMembersOptions) listMembersArg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type listConvsOnNameParams struct {
|
||||||
|
Options chat1.ChatChannel
|
||||||
|
}
|
||||||
|
|
||||||
|
type listConvsOnNameArg struct {
|
||||||
|
Method string
|
||||||
|
Params listConvsOnNameParams
|
||||||
|
}
|
||||||
|
|
||||||
|
func newListConvsOnNameArg(channel chat1.ChatChannel) listConvsOnNameArg {
|
||||||
|
return listConvsOnNameArg{
|
||||||
|
Method: "listconvsonname",
|
||||||
|
Params: listConvsOnNameParams{
|
||||||
|
Options: channel,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// KVOptions holds a set of options to be passed to the KV methods
|
// KVOptions holds a set of options to be passed to the KV methods
|
||||||
type KVOptions struct {
|
type KVOptions struct {
|
||||||
Team *string `json:"team"`
|
Team *string `json:"team"`
|
||||||
@ -954,7 +1004,8 @@ type userBlocks struct {
|
|||||||
|
|
||||||
// Keybase holds basic information about the local Keybase executable
|
// Keybase holds basic information about the local Keybase executable
|
||||||
type Keybase struct {
|
type Keybase struct {
|
||||||
Path string
|
HomePath string
|
||||||
|
ExePath string
|
||||||
Username string
|
Username string
|
||||||
LoggedIn bool
|
LoggedIn bool
|
||||||
Version string
|
Version string
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/api.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/api.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
@ -942,6 +942,7 @@ type AdvertiseCommandAPIParam struct {
|
|||||||
Typ string `codec:"typ" json:"type"`
|
Typ string `codec:"typ" json:"type"`
|
||||||
Commands []UserBotCommandInput `codec:"commands" json:"commands"`
|
Commands []UserBotCommandInput `codec:"commands" json:"commands"`
|
||||||
TeamName string `codec:"teamName,omitempty" json:"team_name,omitempty"`
|
TeamName string `codec:"teamName,omitempty" json:"team_name,omitempty"`
|
||||||
|
ConvID ConvIDStr `codec:"convID,omitempty" json:"conv_id,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
|
func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
|
||||||
@ -959,6 +960,7 @@ func (o AdvertiseCommandAPIParam) DeepCopy() AdvertiseCommandAPIParam {
|
|||||||
return ret
|
return ret
|
||||||
})(o.Commands),
|
})(o.Commands),
|
||||||
TeamName: o.TeamName,
|
TeamName: o.TeamName,
|
||||||
|
ConvID: o.ConvID.DeepCopy(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/blocking.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/blocking.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
@ -1,14 +1,15 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/chat_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/chat_ui.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
||||||
stellar1 "samhofi.us/x/keybase/v2/types/stellar1"
|
stellar1 "samhofi.us/x/keybase/v2/types/stellar1"
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UIPagination struct {
|
type UIPagination struct {
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/commands.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/commands.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
@ -1,13 +1,15 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/common.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
|
||||||
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
|
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
||||||
|
stellar1 "samhofi.us/x/keybase/v2/types/stellar1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ThreadID []byte
|
type ThreadID []byte
|
||||||
@ -1368,6 +1370,7 @@ type MessageClientHeader struct {
|
|||||||
EphemeralMetadata *MsgEphemeralMetadata `codec:"em,omitempty" json:"em,omitempty"`
|
EphemeralMetadata *MsgEphemeralMetadata `codec:"em,omitempty" json:"em,omitempty"`
|
||||||
PairwiseMacs map[keybase1.KID][]byte `codec:"pm" json:"pm"`
|
PairwiseMacs map[keybase1.KID][]byte `codec:"pm" json:"pm"`
|
||||||
BotUID *gregor1.UID `codec:"b,omitempty" json:"b,omitempty"`
|
BotUID *gregor1.UID `codec:"b,omitempty" json:"b,omitempty"`
|
||||||
|
TxID *stellar1.TransactionID `codec:"t,omitempty" json:"t,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o MessageClientHeader) DeepCopy() MessageClientHeader {
|
func (o MessageClientHeader) DeepCopy() MessageClientHeader {
|
||||||
@ -1467,6 +1470,13 @@ func (o MessageClientHeader) DeepCopy() MessageClientHeader {
|
|||||||
tmp := (*x).DeepCopy()
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.BotUID),
|
})(o.BotUID),
|
||||||
|
TxID: (func(x *stellar1.TransactionID) *stellar1.TransactionID {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x).DeepCopy()
|
||||||
|
return &tmp
|
||||||
|
})(o.TxID),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2481,6 +2491,7 @@ const (
|
|||||||
BotCommandsAdvertisementTyp_PUBLIC BotCommandsAdvertisementTyp = 0
|
BotCommandsAdvertisementTyp_PUBLIC BotCommandsAdvertisementTyp = 0
|
||||||
BotCommandsAdvertisementTyp_TLFID_MEMBERS BotCommandsAdvertisementTyp = 1
|
BotCommandsAdvertisementTyp_TLFID_MEMBERS BotCommandsAdvertisementTyp = 1
|
||||||
BotCommandsAdvertisementTyp_TLFID_CONVS BotCommandsAdvertisementTyp = 2
|
BotCommandsAdvertisementTyp_TLFID_CONVS BotCommandsAdvertisementTyp = 2
|
||||||
|
BotCommandsAdvertisementTyp_CONV BotCommandsAdvertisementTyp = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
func (o BotCommandsAdvertisementTyp) DeepCopy() BotCommandsAdvertisementTyp { return o }
|
func (o BotCommandsAdvertisementTyp) DeepCopy() BotCommandsAdvertisementTyp { return o }
|
||||||
@ -2489,12 +2500,14 @@ var BotCommandsAdvertisementTypMap = map[string]BotCommandsAdvertisementTyp{
|
|||||||
"PUBLIC": 0,
|
"PUBLIC": 0,
|
||||||
"TLFID_MEMBERS": 1,
|
"TLFID_MEMBERS": 1,
|
||||||
"TLFID_CONVS": 2,
|
"TLFID_CONVS": 2,
|
||||||
|
"CONV": 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
var BotCommandsAdvertisementTypRevMap = map[BotCommandsAdvertisementTyp]string{
|
var BotCommandsAdvertisementTypRevMap = map[BotCommandsAdvertisementTyp]string{
|
||||||
0: "PUBLIC",
|
0: "PUBLIC",
|
||||||
1: "TLFID_MEMBERS",
|
1: "TLFID_MEMBERS",
|
||||||
2: "TLFID_CONVS",
|
2: "TLFID_CONVS",
|
||||||
|
3: "CONV",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e BotCommandsAdvertisementTyp) String() string {
|
func (e BotCommandsAdvertisementTyp) String() string {
|
||||||
@ -2546,3 +2559,97 @@ func (e LastActiveStatus) String() string {
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("%v", int(e))
|
return fmt.Sprintf("%v", int(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ChatMemberDetails struct {
|
||||||
|
Uid keybase1.UID `codec:"uid" json:"uid"`
|
||||||
|
Username string `codec:"username" json:"username"`
|
||||||
|
FullName keybase1.FullName `codec:"fullName" json:"fullName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o ChatMemberDetails) DeepCopy() ChatMemberDetails {
|
||||||
|
return ChatMemberDetails{
|
||||||
|
Uid: o.Uid.DeepCopy(),
|
||||||
|
Username: o.Username,
|
||||||
|
FullName: o.FullName.DeepCopy(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChatMembersDetails struct {
|
||||||
|
Owners []ChatMemberDetails `codec:"owners" json:"owners"`
|
||||||
|
Admins []ChatMemberDetails `codec:"admins" json:"admins"`
|
||||||
|
Writers []ChatMemberDetails `codec:"writers" json:"writers"`
|
||||||
|
Readers []ChatMemberDetails `codec:"readers" json:"readers"`
|
||||||
|
Bots []ChatMemberDetails `codec:"bots" json:"bots"`
|
||||||
|
RestrictedBots []ChatMemberDetails `codec:"restrictedBots" json:"restrictedBots"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o ChatMembersDetails) DeepCopy() ChatMembersDetails {
|
||||||
|
return ChatMembersDetails{
|
||||||
|
Owners: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Owners),
|
||||||
|
Admins: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Admins),
|
||||||
|
Writers: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Writers),
|
||||||
|
Readers: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Readers),
|
||||||
|
Bots: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Bots),
|
||||||
|
RestrictedBots: (func(x []ChatMemberDetails) []ChatMemberDetails {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]ChatMemberDetails, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.RestrictedBots),
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,13 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/emoji.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/emoji.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EmojiLoadSourceTyp int
|
type EmojiLoadSourceTyp int
|
||||||
@ -274,9 +275,12 @@ type Emoji struct {
|
|||||||
IsBig bool `codec:"isBig" json:"isBig"`
|
IsBig bool `codec:"isBig" json:"isBig"`
|
||||||
IsReacji bool `codec:"isReacji" json:"isReacji"`
|
IsReacji bool `codec:"isReacji" json:"isReacji"`
|
||||||
IsCrossTeam bool `codec:"isCrossTeam" json:"isCrossTeam"`
|
IsCrossTeam bool `codec:"isCrossTeam" json:"isCrossTeam"`
|
||||||
|
IsAlias bool `codec:"isAlias" json:"isAlias"`
|
||||||
Source EmojiLoadSource `codec:"source" json:"source"`
|
Source EmojiLoadSource `codec:"source" json:"source"`
|
||||||
|
NoAnimSource EmojiLoadSource `codec:"noAnimSource" json:"noAnimSource"`
|
||||||
RemoteSource EmojiRemoteSource `codec:"remoteSource" json:"remoteSource"`
|
RemoteSource EmojiRemoteSource `codec:"remoteSource" json:"remoteSource"`
|
||||||
CreationInfo *EmojiCreationInfo `codec:"creationInfo,omitempty" json:"creationInfo,omitempty"`
|
CreationInfo *EmojiCreationInfo `codec:"creationInfo,omitempty" json:"creationInfo,omitempty"`
|
||||||
|
Teamname *string `codec:"teamname,omitempty" json:"teamname,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o Emoji) DeepCopy() Emoji {
|
func (o Emoji) DeepCopy() Emoji {
|
||||||
@ -285,7 +289,9 @@ func (o Emoji) DeepCopy() Emoji {
|
|||||||
IsBig: o.IsBig,
|
IsBig: o.IsBig,
|
||||||
IsReacji: o.IsReacji,
|
IsReacji: o.IsReacji,
|
||||||
IsCrossTeam: o.IsCrossTeam,
|
IsCrossTeam: o.IsCrossTeam,
|
||||||
|
IsAlias: o.IsAlias,
|
||||||
Source: o.Source.DeepCopy(),
|
Source: o.Source.DeepCopy(),
|
||||||
|
NoAnimSource: o.NoAnimSource.DeepCopy(),
|
||||||
RemoteSource: o.RemoteSource.DeepCopy(),
|
RemoteSource: o.RemoteSource.DeepCopy(),
|
||||||
CreationInfo: (func(x *EmojiCreationInfo) *EmojiCreationInfo {
|
CreationInfo: (func(x *EmojiCreationInfo) *EmojiCreationInfo {
|
||||||
if x == nil {
|
if x == nil {
|
||||||
@ -294,6 +300,13 @@ func (o Emoji) DeepCopy() Emoji {
|
|||||||
tmp := (*x).DeepCopy()
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.CreationInfo),
|
})(o.CreationInfo),
|
||||||
|
Teamname: (func(x *string) *string {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x)
|
||||||
|
return &tmp
|
||||||
|
})(o.Teamname),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/gregor.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/gregor.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
@ -1,14 +1,15 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/local.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/local.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
||||||
stellar1 "samhofi.us/x/keybase/v2/types/stellar1"
|
stellar1 "samhofi.us/x/keybase/v2/types/stellar1"
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type VersionKind string
|
type VersionKind string
|
||||||
@ -356,12 +357,25 @@ func (o MessageDelete) DeepCopy() MessageDelete {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MessageHeadline struct {
|
type MessageHeadline struct {
|
||||||
Headline string `codec:"headline" json:"headline"`
|
Headline string `codec:"headline" json:"headline"`
|
||||||
|
Emojis map[string]HarvestedEmoji `codec:"emojis" json:"emojis"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o MessageHeadline) DeepCopy() MessageHeadline {
|
func (o MessageHeadline) DeepCopy() MessageHeadline {
|
||||||
return MessageHeadline{
|
return MessageHeadline{
|
||||||
Headline: o.Headline,
|
Headline: o.Headline,
|
||||||
|
Emojis: (func(x map[string]HarvestedEmoji) map[string]HarvestedEmoji {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make(map[string]HarvestedEmoji, len(x))
|
||||||
|
for k, v := range x {
|
||||||
|
kCopy := k
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[kCopy] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Emojis),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,13 +984,14 @@ func (o MessageDeleteHistory) DeepCopy() MessageDeleteHistory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MessageAttachment struct {
|
type MessageAttachment struct {
|
||||||
Object Asset `codec:"object" json:"object"`
|
Object Asset `codec:"object" json:"object"`
|
||||||
Preview *Asset `codec:"preview,omitempty" json:"preview,omitempty"`
|
Preview *Asset `codec:"preview,omitempty" json:"preview,omitempty"`
|
||||||
Previews []Asset `codec:"previews" json:"previews"`
|
Previews []Asset `codec:"previews" json:"previews"`
|
||||||
Metadata []byte `codec:"metadata" json:"metadata"`
|
Metadata []byte `codec:"metadata" json:"metadata"`
|
||||||
Uploaded bool `codec:"uploaded" json:"uploaded"`
|
Uploaded bool `codec:"uploaded" json:"uploaded"`
|
||||||
UserMentions []KnownUserMention `codec:"userMentions" json:"userMentions"`
|
UserMentions []KnownUserMention `codec:"userMentions" json:"userMentions"`
|
||||||
TeamMentions []KnownTeamMention `codec:"teamMentions" json:"teamMentions"`
|
TeamMentions []KnownTeamMention `codec:"teamMentions" json:"teamMentions"`
|
||||||
|
Emojis map[string]HarvestedEmoji `codec:"emojis" json:"emojis"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o MessageAttachment) DeepCopy() MessageAttachment {
|
func (o MessageAttachment) DeepCopy() MessageAttachment {
|
||||||
@ -1029,6 +1044,18 @@ func (o MessageAttachment) DeepCopy() MessageAttachment {
|
|||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
})(o.TeamMentions),
|
})(o.TeamMentions),
|
||||||
|
Emojis: (func(x map[string]HarvestedEmoji) map[string]HarvestedEmoji {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make(map[string]HarvestedEmoji, len(x))
|
||||||
|
for k, v := range x {
|
||||||
|
kCopy := k
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[kCopy] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.Emojis),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3385,26 +3412,27 @@ func (o ConversationPinnedMessage) DeepCopy() ConversationPinnedMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ConversationInfoLocal struct {
|
type ConversationInfoLocal struct {
|
||||||
Id ConversationID `codec:"id" json:"id"`
|
Id ConversationID `codec:"id" json:"id"`
|
||||||
Triple ConversationIDTriple `codec:"triple" json:"triple"`
|
Triple ConversationIDTriple `codec:"triple" json:"triple"`
|
||||||
TlfName string `codec:"tlfName" json:"tlfName"`
|
TlfName string `codec:"tlfName" json:"tlfName"`
|
||||||
TopicName string `codec:"topicName" json:"topicName"`
|
TopicName string `codec:"topicName" json:"topicName"`
|
||||||
Headline string `codec:"headline" json:"headline"`
|
Headline string `codec:"headline" json:"headline"`
|
||||||
SnippetMsg *MessageUnboxed `codec:"snippetMsg,omitempty" json:"snippetMsg,omitempty"`
|
HeadlineEmojis []HarvestedEmoji `codec:"headlineEmojis" json:"headlineEmojis"`
|
||||||
PinnedMsg *ConversationPinnedMessage `codec:"pinnedMsg,omitempty" json:"pinnedMsg,omitempty"`
|
SnippetMsg *MessageUnboxed `codec:"snippetMsg,omitempty" json:"snippetMsg,omitempty"`
|
||||||
Draft *string `codec:"draft,omitempty" json:"draft,omitempty"`
|
PinnedMsg *ConversationPinnedMessage `codec:"pinnedMsg,omitempty" json:"pinnedMsg,omitempty"`
|
||||||
Visibility keybase1.TLFVisibility `codec:"visibility" json:"visibility"`
|
Draft *string `codec:"draft,omitempty" json:"draft,omitempty"`
|
||||||
IsDefaultConv bool `codec:"isDefaultConv" json:"isDefaultConv"`
|
Visibility keybase1.TLFVisibility `codec:"visibility" json:"visibility"`
|
||||||
Status ConversationStatus `codec:"status" json:"status"`
|
IsDefaultConv bool `codec:"isDefaultConv" json:"isDefaultConv"`
|
||||||
MembersType ConversationMembersType `codec:"membersType" json:"membersType"`
|
Status ConversationStatus `codec:"status" json:"status"`
|
||||||
MemberStatus ConversationMemberStatus `codec:"memberStatus" json:"memberStatus"`
|
MembersType ConversationMembersType `codec:"membersType" json:"membersType"`
|
||||||
TeamType TeamType `codec:"teamType" json:"teamType"`
|
MemberStatus ConversationMemberStatus `codec:"memberStatus" json:"memberStatus"`
|
||||||
Existence ConversationExistence `codec:"existence" json:"existence"`
|
TeamType TeamType `codec:"teamType" json:"teamType"`
|
||||||
Version ConversationVers `codec:"version" json:"version"`
|
Existence ConversationExistence `codec:"existence" json:"existence"`
|
||||||
LocalVersion LocalConversationVers `codec:"localVersion" json:"localVersion"`
|
Version ConversationVers `codec:"version" json:"version"`
|
||||||
Participants []ConversationLocalParticipant `codec:"participants" json:"participants"`
|
LocalVersion LocalConversationVers `codec:"localVersion" json:"localVersion"`
|
||||||
FinalizeInfo *ConversationFinalizeInfo `codec:"finalizeInfo,omitempty" json:"finalizeInfo,omitempty"`
|
Participants []ConversationLocalParticipant `codec:"participants" json:"participants"`
|
||||||
ResetNames []string `codec:"resetNames" json:"resetNames"`
|
FinalizeInfo *ConversationFinalizeInfo `codec:"finalizeInfo,omitempty" json:"finalizeInfo,omitempty"`
|
||||||
|
ResetNames []string `codec:"resetNames" json:"resetNames"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o ConversationInfoLocal) DeepCopy() ConversationInfoLocal {
|
func (o ConversationInfoLocal) DeepCopy() ConversationInfoLocal {
|
||||||
@ -3414,6 +3442,17 @@ func (o ConversationInfoLocal) DeepCopy() ConversationInfoLocal {
|
|||||||
TlfName: o.TlfName,
|
TlfName: o.TlfName,
|
||||||
TopicName: o.TopicName,
|
TopicName: o.TopicName,
|
||||||
Headline: o.Headline,
|
Headline: o.Headline,
|
||||||
|
HeadlineEmojis: (func(x []HarvestedEmoji) []HarvestedEmoji {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]HarvestedEmoji, len(x))
|
||||||
|
for i, v := range x {
|
||||||
|
vCopy := v.DeepCopy()
|
||||||
|
ret[i] = vCopy
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
})(o.HeadlineEmojis),
|
||||||
SnippetMsg: (func(x *MessageUnboxed) *MessageUnboxed {
|
SnippetMsg: (func(x *MessageUnboxed) *MessageUnboxed {
|
||||||
if x == nil {
|
if x == nil {
|
||||||
return nil
|
return nil
|
||||||
@ -5909,6 +5948,7 @@ type AdvertiseCommandsParam struct {
|
|||||||
Typ BotCommandsAdvertisementTyp `codec:"typ" json:"typ"`
|
Typ BotCommandsAdvertisementTyp `codec:"typ" json:"typ"`
|
||||||
Commands []UserBotCommandInput `codec:"commands" json:"commands"`
|
Commands []UserBotCommandInput `codec:"commands" json:"commands"`
|
||||||
TeamName *string `codec:"teamName,omitempty" json:"teamName,omitempty"`
|
TeamName *string `codec:"teamName,omitempty" json:"teamName,omitempty"`
|
||||||
|
ConvID *ConversationID `codec:"convID,omitempty" json:"convID,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AdvertiseCommandsParam) DeepCopy() AdvertiseCommandsParam {
|
func (o AdvertiseCommandsParam) DeepCopy() AdvertiseCommandsParam {
|
||||||
@ -5932,6 +5972,13 @@ func (o AdvertiseCommandsParam) DeepCopy() AdvertiseCommandsParam {
|
|||||||
tmp := (*x)
|
tmp := (*x)
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.TeamName),
|
})(o.TeamName),
|
||||||
|
ConvID: (func(x *ConversationID) *ConversationID {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x).DeepCopy()
|
||||||
|
return &tmp
|
||||||
|
})(o.ConvID),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6259,8 +6306,21 @@ func (o LastActiveStatusAll) DeepCopy() LastActiveStatusAll {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type EmojiError struct {
|
||||||
|
Clidisplay string `codec:"clidisplay" json:"clidisplay"`
|
||||||
|
Uidisplay string `codec:"uidisplay" json:"uidisplay"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o EmojiError) DeepCopy() EmojiError {
|
||||||
|
return EmojiError{
|
||||||
|
Clidisplay: o.Clidisplay,
|
||||||
|
Uidisplay: o.Uidisplay,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type AddEmojiRes struct {
|
type AddEmojiRes struct {
|
||||||
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
||||||
|
Error *EmojiError `codec:"error,omitempty" json:"error,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AddEmojiRes) DeepCopy() AddEmojiRes {
|
func (o AddEmojiRes) DeepCopy() AddEmojiRes {
|
||||||
@ -6272,13 +6332,20 @@ func (o AddEmojiRes) DeepCopy() AddEmojiRes {
|
|||||||
tmp := (*x).DeepCopy()
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.RateLimit),
|
})(o.RateLimit),
|
||||||
|
Error: (func(x *EmojiError) *EmojiError {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x).DeepCopy()
|
||||||
|
return &tmp
|
||||||
|
})(o.Error),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type AddEmojisRes struct {
|
type AddEmojisRes struct {
|
||||||
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
||||||
SuccessFilenames []string `codec:"successFilenames" json:"successFilenames"`
|
SuccessFilenames []string `codec:"successFilenames" json:"successFilenames"`
|
||||||
FailedFilenames map[string]string `codec:"failedFilenames" json:"failedFilenames"`
|
FailedFilenames map[string]EmojiError `codec:"failedFilenames" json:"failedFilenames"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AddEmojisRes) DeepCopy() AddEmojisRes {
|
func (o AddEmojisRes) DeepCopy() AddEmojisRes {
|
||||||
@ -6301,14 +6368,14 @@ func (o AddEmojisRes) DeepCopy() AddEmojisRes {
|
|||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
})(o.SuccessFilenames),
|
})(o.SuccessFilenames),
|
||||||
FailedFilenames: (func(x map[string]string) map[string]string {
|
FailedFilenames: (func(x map[string]EmojiError) map[string]EmojiError {
|
||||||
if x == nil {
|
if x == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
ret := make(map[string]string, len(x))
|
ret := make(map[string]EmojiError, len(x))
|
||||||
for k, v := range x {
|
for k, v := range x {
|
||||||
kCopy := k
|
kCopy := k
|
||||||
vCopy := v
|
vCopy := v.DeepCopy()
|
||||||
ret[kCopy] = vCopy
|
ret[kCopy] = vCopy
|
||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
@ -6317,8 +6384,8 @@ func (o AddEmojisRes) DeepCopy() AddEmojisRes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AddEmojiAliasRes struct {
|
type AddEmojiAliasRes struct {
|
||||||
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
RateLimit *RateLimit `codec:"rateLimit,omitempty" json:"rateLimit,omitempty"`
|
||||||
ErrorString *string `codec:"errorString,omitempty" json:"errorString,omitempty"`
|
Error *EmojiError `codec:"error,omitempty" json:"error,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AddEmojiAliasRes) DeepCopy() AddEmojiAliasRes {
|
func (o AddEmojiAliasRes) DeepCopy() AddEmojiAliasRes {
|
||||||
@ -6330,13 +6397,13 @@ func (o AddEmojiAliasRes) DeepCopy() AddEmojiAliasRes {
|
|||||||
tmp := (*x).DeepCopy()
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.RateLimit),
|
})(o.RateLimit),
|
||||||
ErrorString: (func(x *string) *string {
|
Error: (func(x *EmojiError) *EmojiError {
|
||||||
if x == nil {
|
if x == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
tmp := (*x)
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.ErrorString),
|
})(o.Error),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,12 +1,13 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/notify.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/notify.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ChatActivitySource int
|
type ChatActivitySource int
|
||||||
@ -1,13 +1,14 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/remote.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/remote.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
|
||||||
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
|
keybase1 "samhofi.us/x/keybase/v2/types/keybase1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MessageBoxed struct {
|
type MessageBoxed struct {
|
||||||
@ -965,11 +966,24 @@ func (o RemoteBotCommandsAdvertisementTLFID) DeepCopy() RemoteBotCommandsAdverti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RemoteBotCommandsAdvertisementConv struct {
|
||||||
|
ConvID ConversationID `codec:"convID" json:"convID"`
|
||||||
|
AdvertiseConvID ConversationID `codec:"advertiseConvID" json:"advertiseConvID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o RemoteBotCommandsAdvertisementConv) DeepCopy() RemoteBotCommandsAdvertisementConv {
|
||||||
|
return RemoteBotCommandsAdvertisementConv{
|
||||||
|
ConvID: o.ConvID.DeepCopy(),
|
||||||
|
AdvertiseConvID: o.AdvertiseConvID.DeepCopy(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type RemoteBotCommandsAdvertisement struct {
|
type RemoteBotCommandsAdvertisement struct {
|
||||||
Typ__ BotCommandsAdvertisementTyp `codec:"typ" json:"typ"`
|
Typ__ BotCommandsAdvertisementTyp `codec:"typ" json:"typ"`
|
||||||
Public__ *RemoteBotCommandsAdvertisementPublic `codec:"public,omitempty" json:"public,omitempty"`
|
Public__ *RemoteBotCommandsAdvertisementPublic `codec:"public,omitempty" json:"public,omitempty"`
|
||||||
TlfidMembers__ *RemoteBotCommandsAdvertisementTLFID `codec:"tlfidMembers,omitempty" json:"tlfidMembers,omitempty"`
|
TlfidMembers__ *RemoteBotCommandsAdvertisementTLFID `codec:"tlfidMembers,omitempty" json:"tlfidMembers,omitempty"`
|
||||||
TlfidConvs__ *RemoteBotCommandsAdvertisementTLFID `codec:"tlfidConvs,omitempty" json:"tlfidConvs,omitempty"`
|
TlfidConvs__ *RemoteBotCommandsAdvertisementTLFID `codec:"tlfidConvs,omitempty" json:"tlfidConvs,omitempty"`
|
||||||
|
Conv__ *RemoteBotCommandsAdvertisementConv `codec:"conv,omitempty" json:"conv,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp, err error) {
|
func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp, err error) {
|
||||||
@ -989,6 +1003,11 @@ func (o *RemoteBotCommandsAdvertisement) Typ() (ret BotCommandsAdvertisementTyp,
|
|||||||
err = errors.New("unexpected nil value for TlfidConvs__")
|
err = errors.New("unexpected nil value for TlfidConvs__")
|
||||||
return ret, err
|
return ret, err
|
||||||
}
|
}
|
||||||
|
case BotCommandsAdvertisementTyp_CONV:
|
||||||
|
if o.Conv__ == nil {
|
||||||
|
err = errors.New("unexpected nil value for Conv__")
|
||||||
|
return ret, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return o.Typ__, nil
|
return o.Typ__, nil
|
||||||
}
|
}
|
||||||
@ -1023,6 +1042,16 @@ func (o RemoteBotCommandsAdvertisement) TlfidConvs() (res RemoteBotCommandsAdver
|
|||||||
return *o.TlfidConvs__
|
return *o.TlfidConvs__
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o RemoteBotCommandsAdvertisement) Conv() (res RemoteBotCommandsAdvertisementConv) {
|
||||||
|
if o.Typ__ != BotCommandsAdvertisementTyp_CONV {
|
||||||
|
panic("wrong case accessed")
|
||||||
|
}
|
||||||
|
if o.Conv__ == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return *o.Conv__
|
||||||
|
}
|
||||||
|
|
||||||
func NewRemoteBotCommandsAdvertisementWithPublic(v RemoteBotCommandsAdvertisementPublic) RemoteBotCommandsAdvertisement {
|
func NewRemoteBotCommandsAdvertisementWithPublic(v RemoteBotCommandsAdvertisementPublic) RemoteBotCommandsAdvertisement {
|
||||||
return RemoteBotCommandsAdvertisement{
|
return RemoteBotCommandsAdvertisement{
|
||||||
Typ__: BotCommandsAdvertisementTyp_PUBLIC,
|
Typ__: BotCommandsAdvertisementTyp_PUBLIC,
|
||||||
@ -1044,6 +1073,13 @@ func NewRemoteBotCommandsAdvertisementWithTlfidConvs(v RemoteBotCommandsAdvertis
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewRemoteBotCommandsAdvertisementWithConv(v RemoteBotCommandsAdvertisementConv) RemoteBotCommandsAdvertisement {
|
||||||
|
return RemoteBotCommandsAdvertisement{
|
||||||
|
Typ__: BotCommandsAdvertisementTyp_CONV,
|
||||||
|
Conv__: &v,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisement {
|
func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisement {
|
||||||
return RemoteBotCommandsAdvertisement{
|
return RemoteBotCommandsAdvertisement{
|
||||||
Typ__: o.Typ__.DeepCopy(),
|
Typ__: o.Typ__.DeepCopy(),
|
||||||
@ -1068,6 +1104,13 @@ func (o RemoteBotCommandsAdvertisement) DeepCopy() RemoteBotCommandsAdvertisemen
|
|||||||
tmp := (*x).DeepCopy()
|
tmp := (*x).DeepCopy()
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.TlfidConvs__),
|
})(o.TlfidConvs__),
|
||||||
|
Conv__: (func(x *RemoteBotCommandsAdvertisementConv) *RemoteBotCommandsAdvertisementConv {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x).DeepCopy()
|
||||||
|
return &tmp
|
||||||
|
})(o.Conv__),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,12 +1,13 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/chat1/unfurl.avdl
|
// Input file: ../../../../../../client/protocol/avdl/chat1/unfurl.avdl
|
||||||
|
|
||||||
package chat1
|
package chat1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
gregor1 "samhofi.us/x/keybase/v2/types/gregor1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UnfurlType int
|
type UnfurlType int
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/auth.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/auth.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/auth_internal.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/auth_internal.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/auth_update.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/auth_update.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/common.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/incoming.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/incoming.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/outgoing.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/outgoing.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/gregor1/remind.avdl
|
// Input file: ../../../../../../client/protocol/avdl/gregor1/remind.avdl
|
||||||
|
|
||||||
package gregor1
|
package gregor1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/account.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/account.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/airdrop.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/airdrop.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/apiserver.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/apiserver.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/appstate.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/appstate.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/audit.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/audit.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/avatars.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/avatars.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/backend_common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/backend_common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/badger.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/badger.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/block.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/block.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/bot.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/bot.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/btc.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/btc.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1074,8 +1074,9 @@ func (e OfflineAvailability) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type UserReacji struct {
|
type UserReacji struct {
|
||||||
Name string `codec:"name" json:"name"`
|
Name string `codec:"name" json:"name"`
|
||||||
CustomAddr *string `codec:"customAddr,omitempty" json:"customAddr,omitempty"`
|
CustomAddr *string `codec:"customAddr,omitempty" json:"customAddr,omitempty"`
|
||||||
|
CustomAddrNoAnim *string `codec:"customAddrNoAnim,omitempty" json:"customAddrNoAnim,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o UserReacji) DeepCopy() UserReacji {
|
func (o UserReacji) DeepCopy() UserReacji {
|
||||||
@ -1088,13 +1089,52 @@ func (o UserReacji) DeepCopy() UserReacji {
|
|||||||
tmp := (*x)
|
tmp := (*x)
|
||||||
return &tmp
|
return &tmp
|
||||||
})(o.CustomAddr),
|
})(o.CustomAddr),
|
||||||
|
CustomAddrNoAnim: (func(x *string) *string {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x)
|
||||||
|
return &tmp
|
||||||
|
})(o.CustomAddrNoAnim),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReacjiSkinTone int
|
type ReacjiSkinTone int
|
||||||
|
|
||||||
func (o ReacjiSkinTone) DeepCopy() ReacjiSkinTone {
|
const (
|
||||||
return o
|
ReacjiSkinTone_NONE ReacjiSkinTone = 0
|
||||||
|
ReacjiSkinTone_SKINTONE1 ReacjiSkinTone = 1
|
||||||
|
ReacjiSkinTone_SKINTONE2 ReacjiSkinTone = 2
|
||||||
|
ReacjiSkinTone_SKINTONE3 ReacjiSkinTone = 3
|
||||||
|
ReacjiSkinTone_SKINTONE4 ReacjiSkinTone = 4
|
||||||
|
ReacjiSkinTone_SKINTONE5 ReacjiSkinTone = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
func (o ReacjiSkinTone) DeepCopy() ReacjiSkinTone { return o }
|
||||||
|
|
||||||
|
var ReacjiSkinToneMap = map[string]ReacjiSkinTone{
|
||||||
|
"NONE": 0,
|
||||||
|
"SKINTONE1": 1,
|
||||||
|
"SKINTONE2": 2,
|
||||||
|
"SKINTONE3": 3,
|
||||||
|
"SKINTONE4": 4,
|
||||||
|
"SKINTONE5": 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
var ReacjiSkinToneRevMap = map[ReacjiSkinTone]string{
|
||||||
|
0: "NONE",
|
||||||
|
1: "SKINTONE1",
|
||||||
|
2: "SKINTONE2",
|
||||||
|
3: "SKINTONE3",
|
||||||
|
4: "SKINTONE4",
|
||||||
|
5: "SKINTONE5",
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ReacjiSkinTone) String() string {
|
||||||
|
if v, ok := ReacjiSkinToneRevMap[e]; ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%v", int(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserReacjis struct {
|
type UserReacjis struct {
|
||||||
@ -1153,13 +1193,3 @@ func (e WotStatusType) String() string {
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("%v", int(e))
|
return fmt.Sprintf("%v", int(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
type GenericError struct {
|
|
||||||
Message string `codec:"message" json:"message"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o GenericError) DeepCopy() GenericError {
|
|
||||||
return GenericError{
|
|
||||||
Message: o.Message,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/config.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/config.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/constants.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/constants.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/contacts.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/contacts.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/crypto.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/crypto.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/cryptocurrency.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/cryptocurrency.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/ctl.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/ctl.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/debugging.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/debugging.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/delegate_ui_ctl.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/delegate_ui_ctl.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/device.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/device.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/emails.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/emails.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/ephemeral.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/ephemeral.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/favorite.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/favorite.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/featured_bot.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/featured_bot.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/fs.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/fs.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/git.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/git.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/gpg_common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/gpg_common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/gpg_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/gpg_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/gregor.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/gregor.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/gregor_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/gregor_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/home.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/home.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -298,19 +298,19 @@ const (
|
|||||||
HomeScreenTodoType_PROOF HomeScreenTodoType = 2
|
HomeScreenTodoType_PROOF HomeScreenTodoType = 2
|
||||||
HomeScreenTodoType_DEVICE HomeScreenTodoType = 3
|
HomeScreenTodoType_DEVICE HomeScreenTodoType = 3
|
||||||
HomeScreenTodoType_FOLLOW HomeScreenTodoType = 4
|
HomeScreenTodoType_FOLLOW HomeScreenTodoType = 4
|
||||||
HomeScreenTodoType_CHAT HomeScreenTodoType = 5
|
|
||||||
HomeScreenTodoType_PAPERKEY HomeScreenTodoType = 6
|
HomeScreenTodoType_PAPERKEY HomeScreenTodoType = 6
|
||||||
HomeScreenTodoType_TEAM HomeScreenTodoType = 7
|
HomeScreenTodoType_TEAM HomeScreenTodoType = 7
|
||||||
HomeScreenTodoType_FOLDER HomeScreenTodoType = 8
|
HomeScreenTodoType_FOLDER HomeScreenTodoType = 8
|
||||||
HomeScreenTodoType_GIT_REPO HomeScreenTodoType = 9
|
HomeScreenTodoType_GIT_REPO HomeScreenTodoType = 9
|
||||||
HomeScreenTodoType_TEAM_SHOWCASE HomeScreenTodoType = 10
|
HomeScreenTodoType_TEAM_SHOWCASE HomeScreenTodoType = 10
|
||||||
HomeScreenTodoType_AVATAR_USER HomeScreenTodoType = 11
|
|
||||||
HomeScreenTodoType_AVATAR_TEAM HomeScreenTodoType = 12
|
HomeScreenTodoType_AVATAR_TEAM HomeScreenTodoType = 12
|
||||||
HomeScreenTodoType_ADD_PHONE_NUMBER HomeScreenTodoType = 18
|
HomeScreenTodoType_ADD_PHONE_NUMBER HomeScreenTodoType = 18
|
||||||
HomeScreenTodoType_VERIFY_ALL_PHONE_NUMBER HomeScreenTodoType = 19
|
HomeScreenTodoType_VERIFY_ALL_PHONE_NUMBER HomeScreenTodoType = 19
|
||||||
HomeScreenTodoType_VERIFY_ALL_EMAIL HomeScreenTodoType = 20
|
HomeScreenTodoType_VERIFY_ALL_EMAIL HomeScreenTodoType = 20
|
||||||
HomeScreenTodoType_LEGACY_EMAIL_VISIBILITY HomeScreenTodoType = 21
|
HomeScreenTodoType_LEGACY_EMAIL_VISIBILITY HomeScreenTodoType = 21
|
||||||
HomeScreenTodoType_ADD_EMAIL HomeScreenTodoType = 22
|
HomeScreenTodoType_ADD_EMAIL HomeScreenTodoType = 22
|
||||||
|
HomeScreenTodoType_AVATAR_USER HomeScreenTodoType = 23
|
||||||
|
HomeScreenTodoType_CHAT HomeScreenTodoType = 24
|
||||||
HomeScreenTodoType_ANNONCEMENT_PLACEHOLDER HomeScreenTodoType = 10000
|
HomeScreenTodoType_ANNONCEMENT_PLACEHOLDER HomeScreenTodoType = 10000
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -322,19 +322,19 @@ var HomeScreenTodoTypeMap = map[string]HomeScreenTodoType{
|
|||||||
"PROOF": 2,
|
"PROOF": 2,
|
||||||
"DEVICE": 3,
|
"DEVICE": 3,
|
||||||
"FOLLOW": 4,
|
"FOLLOW": 4,
|
||||||
"CHAT": 5,
|
|
||||||
"PAPERKEY": 6,
|
"PAPERKEY": 6,
|
||||||
"TEAM": 7,
|
"TEAM": 7,
|
||||||
"FOLDER": 8,
|
"FOLDER": 8,
|
||||||
"GIT_REPO": 9,
|
"GIT_REPO": 9,
|
||||||
"TEAM_SHOWCASE": 10,
|
"TEAM_SHOWCASE": 10,
|
||||||
"AVATAR_USER": 11,
|
|
||||||
"AVATAR_TEAM": 12,
|
"AVATAR_TEAM": 12,
|
||||||
"ADD_PHONE_NUMBER": 18,
|
"ADD_PHONE_NUMBER": 18,
|
||||||
"VERIFY_ALL_PHONE_NUMBER": 19,
|
"VERIFY_ALL_PHONE_NUMBER": 19,
|
||||||
"VERIFY_ALL_EMAIL": 20,
|
"VERIFY_ALL_EMAIL": 20,
|
||||||
"LEGACY_EMAIL_VISIBILITY": 21,
|
"LEGACY_EMAIL_VISIBILITY": 21,
|
||||||
"ADD_EMAIL": 22,
|
"ADD_EMAIL": 22,
|
||||||
|
"AVATAR_USER": 23,
|
||||||
|
"CHAT": 24,
|
||||||
"ANNONCEMENT_PLACEHOLDER": 10000,
|
"ANNONCEMENT_PLACEHOLDER": 10000,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,19 +344,19 @@ var HomeScreenTodoTypeRevMap = map[HomeScreenTodoType]string{
|
|||||||
2: "PROOF",
|
2: "PROOF",
|
||||||
3: "DEVICE",
|
3: "DEVICE",
|
||||||
4: "FOLLOW",
|
4: "FOLLOW",
|
||||||
5: "CHAT",
|
|
||||||
6: "PAPERKEY",
|
6: "PAPERKEY",
|
||||||
7: "TEAM",
|
7: "TEAM",
|
||||||
8: "FOLDER",
|
8: "FOLDER",
|
||||||
9: "GIT_REPO",
|
9: "GIT_REPO",
|
||||||
10: "TEAM_SHOWCASE",
|
10: "TEAM_SHOWCASE",
|
||||||
11: "AVATAR_USER",
|
|
||||||
12: "AVATAR_TEAM",
|
12: "AVATAR_TEAM",
|
||||||
18: "ADD_PHONE_NUMBER",
|
18: "ADD_PHONE_NUMBER",
|
||||||
19: "VERIFY_ALL_PHONE_NUMBER",
|
19: "VERIFY_ALL_PHONE_NUMBER",
|
||||||
20: "VERIFY_ALL_EMAIL",
|
20: "VERIFY_ALL_EMAIL",
|
||||||
21: "LEGACY_EMAIL_VISIBILITY",
|
21: "LEGACY_EMAIL_VISIBILITY",
|
||||||
22: "ADD_EMAIL",
|
22: "ADD_EMAIL",
|
||||||
|
23: "AVATAR_USER",
|
||||||
|
24: "CHAT",
|
||||||
10000: "ANNONCEMENT_PLACEHOLDER",
|
10000: "ANNONCEMENT_PLACEHOLDER",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/home_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/home_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify3.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify3.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify3_common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify3_common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify3_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify3_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify_common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify_common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/identify_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/identify_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/implicit_team_migration.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/implicit_team_migration.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/incoming-share.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/incoming-share.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -41,8 +41,8 @@ func (e IncomingShareType) String() string {
|
|||||||
|
|
||||||
type IncomingShareItem struct {
|
type IncomingShareItem struct {
|
||||||
Type IncomingShareType `codec:"type" json:"type"`
|
Type IncomingShareType `codec:"type" json:"type"`
|
||||||
OriginalPath string `codec:"originalPath" json:"originalPath"`
|
OriginalPath *string `codec:"originalPath,omitempty" json:"originalPath,omitempty"`
|
||||||
OriginalSize int `codec:"originalSize" json:"originalSize"`
|
OriginalSize *int `codec:"originalSize,omitempty" json:"originalSize,omitempty"`
|
||||||
ScaledPath *string `codec:"scaledPath,omitempty" json:"scaledPath,omitempty"`
|
ScaledPath *string `codec:"scaledPath,omitempty" json:"scaledPath,omitempty"`
|
||||||
ScaledSize *int `codec:"scaledSize,omitempty" json:"scaledSize,omitempty"`
|
ScaledSize *int `codec:"scaledSize,omitempty" json:"scaledSize,omitempty"`
|
||||||
ThumbnailPath *string `codec:"thumbnailPath,omitempty" json:"thumbnailPath,omitempty"`
|
ThumbnailPath *string `codec:"thumbnailPath,omitempty" json:"thumbnailPath,omitempty"`
|
||||||
@ -51,9 +51,21 @@ type IncomingShareItem struct {
|
|||||||
|
|
||||||
func (o IncomingShareItem) DeepCopy() IncomingShareItem {
|
func (o IncomingShareItem) DeepCopy() IncomingShareItem {
|
||||||
return IncomingShareItem{
|
return IncomingShareItem{
|
||||||
Type: o.Type.DeepCopy(),
|
Type: o.Type.DeepCopy(),
|
||||||
OriginalPath: o.OriginalPath,
|
OriginalPath: (func(x *string) *string {
|
||||||
OriginalSize: o.OriginalSize,
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x)
|
||||||
|
return &tmp
|
||||||
|
})(o.OriginalPath),
|
||||||
|
OriginalSize: (func(x *int) *int {
|
||||||
|
if x == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tmp := (*x)
|
||||||
|
return &tmp
|
||||||
|
})(o.OriginalSize),
|
||||||
ScaledPath: (func(x *string) *string {
|
ScaledPath: (func(x *string) *string {
|
||||||
if x == nil {
|
if x == nil {
|
||||||
return nil
|
return nil
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/install.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/install.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/invite_friends.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/invite_friends.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -8,6 +8,7 @@ type InviteCounts struct {
|
|||||||
PercentageChange float64 `codec:"percentageChange" json:"percentageChange"`
|
PercentageChange float64 `codec:"percentageChange" json:"percentageChange"`
|
||||||
ShowNumInvites bool `codec:"showNumInvites" json:"showNumInvites"`
|
ShowNumInvites bool `codec:"showNumInvites" json:"showNumInvites"`
|
||||||
ShowFire bool `codec:"showFire" json:"showFire"`
|
ShowFire bool `codec:"showFire" json:"showFire"`
|
||||||
|
TooltipMarkdown string `codec:"tooltipMarkdown" json:"tooltipMarkdown"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o InviteCounts) DeepCopy() InviteCounts {
|
func (o InviteCounts) DeepCopy() InviteCounts {
|
||||||
@ -16,6 +17,7 @@ func (o InviteCounts) DeepCopy() InviteCounts {
|
|||||||
PercentageChange: o.PercentageChange,
|
PercentageChange: o.PercentageChange,
|
||||||
ShowNumInvites: o.ShowNumInvites,
|
ShowNumInvites: o.ShowNumInvites,
|
||||||
ShowFire: o.ShowFire,
|
ShowFire: o.ShowFire,
|
||||||
|
TooltipMarkdown: o.TooltipMarkdown,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kbfs.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kbfs.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kbfs_common.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kbfs_common.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kbfs_git.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kbfs_git.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kbfsmount.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kbfsmount.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kex2provisionee.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kex2provisionee.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kex2provisionee2.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kex2provisionee2.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kex2provisioner.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kex2provisioner.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/kvstore.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/kvstore.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/log.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/log.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/log_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/log_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/login.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/login.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/login_ui.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/login_ui.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/logsend.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/logsend.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/merkle.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/merkle.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/merkle_store.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/merkle_store.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/metadata.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/metadata.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/metadata_update.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/metadata_update.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/network_stats.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/network_stats.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/notify_app.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/notify_app.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
// Auto-generated to Go types using avdl-compiler v1.4.6 (https://github.com/keybase/node-avdl-compiler)
|
||||||
// Input file: ../client/protocol/avdl/keybase1/notify_audit.avdl
|
// Input file: ../../../../../../client/protocol/avdl/keybase1/notify_audit.avdl
|
||||||
|
|
||||||
package keybase1
|
package keybase1
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user