You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.5 KiB

// +ignore
// +build allcommands wallcmd
package main
import (
"fmt"
"sort"
"strings"
"time"
"samhofi.us/x/keybase"
)
func init() {
command := Command{
Cmd: []string{"wall", "w"},
Description: "$user / !all - Show public messages for a user or all users you follow",
Help: "",
Exec: cmdWall,
}
RegisterCommand(command)
}
func cmdWall(cmd []string) {
go cmdPopulateWall(cmd)
}
func cmdPopulateWall(cmd []string) {
var users []keybase.Channel
var requestedUsers string
var printMe []string
var actuallyPrintMe string
result := make(map[int]keybase.ChatAPI)
start := time.Now()
if len(cmd) > 1 {
if cmd[1] == "!all" {
go cmdAllWall()
return
}
for _, username := range cmd[1:] {
requestedUsers += fmt.Sprintf("%s ", username)
var newChan keybase.Channel
newChan.MembersType = keybase.USER
newChan.Name = username
newChan.TopicName = ""
newChan.Public = true
users = append(users, newChan)
}
} else if channel.MembersType == keybase.USER {
users = append(users, channel)
users[0].Public = true
requestedUsers += cleanChannelName(channel.Name)
} else {
requestedUsers += k.Username
var newChan keybase.Channel
newChan.MembersType = keybase.USER
newChan.Name = k.Username
newChan.TopicName = ""
newChan.Public = true
users = append(users, newChan)
}
if len(users) < 1 {
return
}
printInfoF("Displaying public messages for user $TEXT", config.Colors.Message.LinkKeybase.stylize(requestedUsers))
for _, chann := range users {
chat := k.NewChat(chann)
api, err := chat.Read()
if err != nil {
if len(users) < 6 {
printError(fmt.Sprintf("There was an error for user %s: %+v", cleanChannelName(chann.Name), err))
return
}
} else {
for i, message := range api.Result.Messages {
if message.Msg.Content.Type == "text" {
var apiCast keybase.ChatAPI
apiCast.Msg = &api.Result.Messages[i].Msg
result[apiCast.Msg.SentAt] = apiCast
newMessage := formatOutput(apiCast)
printMe = append(printMe, newMessage.string())
}
}
}
}
keys := make([]int, 0, len(result))
for k := range result {
keys = append(keys, k)
}
sort.Ints(keys)
time.Sleep(1 * time.Millisecond)
for _, k := range keys {
actuallyPrintMe += formatOutput(result[k]).string() + "\n"
}
printToView("Chat", fmt.Sprintf("\n<Wall>\n\n%s\nYour wall query took %s\n</Wall>\n", actuallyPrintMe, time.Since(start)))
}
func cmdAllWall() {
bytes, _ := k.Exec("list-following")
bigString := string(bytes)
following := strings.Split(bigString, "\n")
go cmdPopulateWall(following)
}