Browse Source

example ping bot

master
David Haukeness 5 years ago
parent
commit
2422657daf
  1. 49
      args.go
  2. 9
      go.mod
  3. 8
      go.sum
  4. 54
      main.go
  5. 17
      ping.go

49
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
}

9
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
)

8
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=

54
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()
}

17
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
}
Loading…
Cancel
Save