From e210a742dbcd849ced6aa532b46350377070307c Mon Sep 17 00:00:00 2001 From: David Haukeness Date: Thu, 14 Jan 2021 14:18:43 -0700 Subject: [PATCH] added age command --- cmd/age.go | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 7 +++- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 cmd/age.go diff --git a/cmd/age.go b/cmd/age.go new file mode 100644 index 0000000..5b26cfa --- /dev/null +++ b/cmd/age.go @@ -0,0 +1,100 @@ +package cmd + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" + + "github.com/kf5grd/keybasebot" + "github.com/teris-io/shortid" + "samhofi.us/x/keybase/v2/types/chat1" +) + +var baseURL = "https://keybase.io/_/api/1.0/user/lookup.json?fields=basics&username=" + +type outer struct { + Status status `json:"status"` + Them them `json:"them"` +} + +type status struct { + Code int `json:"code"` + Name string `json:"name"` +} + +type them struct { + Id string `json:"id"` + User keybaseUser `json:"basics"` +} + +type keybaseUser struct { + Username string `json:"username"` + Ctime int64 `json:"ctime"` + Mtime int64 `json:"mtime"` + ID_Version int64 `json:"id_version"` + Track_Version int `json:"track_version"` + Last_ID_Change int64 `json:"last_id_change"` + Username_Cased string `json:"username_cased"` + Status int `json:"status"` + Salt string `json:"salt"` +} + +var AgeAd = chat1.UserBotCommandInput{ + Name: "age", + Usage: "@username", + Description: "Gets the account age of a keybase user", +} + +func Age(m chat1.MsgSummary, b *keybasebot.Bot) (bool, error) { + fields := strings.Fields(strings.TrimSpace(strings.Replace(m.Content.Text.Body, "!age", "", 1))) + var username string + if len(fields) > 1 { + return true, fmt.Errorf("Too many parameters. Please specify one username, or none for your own account age.") + } else if len(fields) < 1 { + username = m.Sender.Username + } else { + username = strings.Replace(fields[0], "@", "", 1) + } + queryURL := baseURL + url.QueryEscape(username) + res, err := http.Get(queryURL) + if err != nil { + eid := shortid.MustGenerate() + b.Logger.Error("%s: %+v", eid, err) + b.KB.ReactByConvID(m.ConvID, m.Id, "Error: %s", eid) + return true, nil + } + defer res.Body.Close() + body, err := ioutil.ReadAll(res.Body) + if err != nil { + eid := shortid.MustGenerate() + b.Logger.Error("%s: %+v", eid, err) + b.KB.ReactByConvID(m.ConvID, m.Id, "Error: %s", eid) + return true, nil + } + var qres outer + if err := json.Unmarshal(body, &qres); err != nil { + eid := shortid.MustGenerate() + b.Logger.Error("%s: %+v", eid, err) + b.KB.ReactByConvID(m.ConvID, m.Id, "Error: %s", eid) + return true, nil + } + var result string + switch qres.Status.Code { + case 0: + // success + t := time.Unix(qres.Them.User.Ctime, 0) + result = fmt.Sprintf("Account %s created at %s", username, t.Format("January 02, 2006 - 15:04:05")) + case 205: + result = fmt.Sprintf("User %s not found.", username) + case 100: + result = "An input error occured" + default: + result = "Unable to complete request" + } + b.KB.SendMessageByConvID(m.ConvID, result) + return true, nil +} diff --git a/main.go b/main.go index 3b53a7b..0aa837d 100644 --- a/main.go +++ b/main.go @@ -46,10 +46,15 @@ func main() { // register the bot commands b.Commands = append(b.Commands, keybasebot.BotCommand{ - Name: "Ping", + Name: "ping", Ad: &cmd.PingAd, Run: keybasebot.Adapt(cmd.SendPong, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!ping")), }, + keybasebot.BotCommand{ + Name: "age", + Ad: &cmd.AgeAd, + Run: keybasebot.Adapt(cmd.Age, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!age")), + }, ) // catch ctrl-c so we can clean up c := make(chan os.Signal)