From 2422657daf2210f2ceb8ad9714646d3c457a8915 Mon Sep 17 00:00:00 2001 From: David Haukeness Date: Thu, 14 Jan 2021 10:22:47 -0700 Subject: [PATCH] example ping bot --- args.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 9 +++++++++ go.sum | 8 ++++++++ main.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ping.go | 17 +++++++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 args.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 ping.go diff --git a/args.go b/args.go new file mode 100644 index 0000000..3c4bec9 --- /dev/null +++ b/args.go @@ -0,0 +1,49 @@ +package main + +import ( + "flag" + "log" + + "github.com/caarlos0/env" +) + +type botOptions struct { + Debug bool `env:"BOT_DEBUG" envDefault:"false"` + LogConvIDStr string `env:"BOT_LOG_CONVID" envDefault:""` + HomePath string `envDefault:""` + JSON bool `env:"BOT_LOG_JSON" envDefault:"false"` +} + +func parseArgs(args []string) botOptions { + // parse environment + opts := botOptions{} + if err := env.Parse(&opts); err != nil { + log.Fatalf("Unable to parse env vars: %+v", err) + } + // parse CLI + flags := flag.NewFlagSet(args[0], flag.ExitOnError) + cliOpts := botOptions{} + flags.BoolVar(&cliOpts.Debug, "debug", false, "enables debugging") + flags.BoolVar(&cliOpts.JSON, "json", false, "enables JSON logging") + flags.StringVar(&cliOpts.LogConvIDStr, "log-convid", "", "set the keybase conversation log id") + flags.StringVar(&cliOpts.HomePath, "kbhome", "", "sets alternate keybase home folder for debugging") + if err := flags.Parse(args[1:]); err != nil { + log.Fatalf("Unable to parse cli args: %+v", err) + } + //overwrite ENV with CLI + if flags.NFlag() > 0 { + if cliOpts.Debug == true { + opts.Debug = true + } + if cliOpts.JSON == true { + opts.JSON = true + } + if cliOpts.HomePath != "" { + opts.HomePath = cliOpts.HomePath + } + if cliOpts.LogConvIDStr != "" { + opts.LogConvIDStr = cliOpts.LogConvIDStr + } + } + return opts +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3abcf13 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module app + +go 1.15 + +require ( + github.com/caarlos0/env v3.5.0+incompatible + github.com/kf5grd/keybasebot v1.3.0 + samhofi.us/x/keybase/v2 v2.0.6 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..959010c --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/caarlos0/env v3.5.0+incompatible h1:Yy0UN8o9Wtr/jGHZDpCBLpNrzcFLLM2yixi/rBrKyJs= +github.com/caarlos0/env v3.5.0+incompatible/go.mod h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y= +github.com/kf5grd/keybasebot v1.2.0 h1:X/+dpP64G9mLLGEyZJ5oYK0l2yk8jDk1BVByxVKSo7M= +github.com/kf5grd/keybasebot v1.2.0/go.mod h1:aLjlXVBN7JQuBkKfUK/VT6fgXY8Gt4TlnNZGd3iPQXg= +github.com/kf5grd/keybasebot v1.3.0 h1:XWr96H4UmZQnHrvR5whuVJxrrUkqrJm/puGnckyqLFc= +github.com/kf5grd/keybasebot v1.3.0/go.mod h1:aLjlXVBN7JQuBkKfUK/VT6fgXY8Gt4TlnNZGd3iPQXg= +samhofi.us/x/keybase/v2 v2.0.6 h1:gLluTcyjbwckQxSarF1ig2klL4Li7O/THdxsgo1dUvw= +samhofi.us/x/keybase/v2 v2.0.6/go.mod h1:lJivwhzMSV+WUg+XUbatszStjjFVcuLGl+xcQpqQ5GQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..92422cc --- /dev/null +++ b/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "os" + + "github.com/kf5grd/keybasebot" + bot "github.com/kf5grd/keybasebot" + "samhofi.us/x/keybase/v2" + "samhofi.us/x/keybase/v2/types/chat1" +) + +// We'll use this to create a writer for the Logger which will be able to write logs to +// stdout, and optionally also to a Keybase chat conversation +type kbWriter struct { + convID chat1.ConvIDStr + bot *bot.Bot +} + +func (k kbWriter) Write(p []byte) (n int, err error) { + opt := keybase.SendMessageOptions{ + ConversationID: k.convID, + Message: keybase.SendMessageBody{Body: string(p)}, + } + go k.bot.KB.SendMessage("send", opt) + fmt.Fprintf(os.Stdout, string(p)) + return len(p), nil +} + +func main() { + opts := parseArgs(os.Args) + b := keybasebot.New("", keybase.SetHomePath(opts.HomePath)) + b.Debug = opts.Debug + b.JSON = opts.JSON + + // set up the log writer + w := kbWriter{ + convID: chat1.ConvIDStr(opts.LogConvIDStr), + bot: b, + } + b.LogWriter = w + + // register the bot commands + b.Commands = append(b.Commands, + keybasebot.BotCommand{ + Name: "Ping", + Ad: &pingAd, + Run: keybasebot.Adapt(sendPong, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!ping")), + }, + ) + + // then run + b.Run() +} diff --git a/ping.go b/ping.go new file mode 100644 index 0000000..4b2bfcc --- /dev/null +++ b/ping.go @@ -0,0 +1,17 @@ +package main + +import ( + "github.com/kf5grd/keybasebot" + "samhofi.us/x/keybase/v2/types/chat1" +) + +var pingAd = chat1.UserBotCommandInput{ + Name: "ping", + Usage: "Replies with Pong!", + Description: "You say ping, i say pong!", +} + +func sendPong(m chat1.MsgSummary, b *keybasebot.Bot) (bool, error) { + b.KB.SendMessageByConvID(m.ConvID, "Pong!") + return true, nil +}