package main import ( "log" "os" "os/signal" "syscall" "time" "app/cmd" "github.com/kf5grd/keybasebot" "github.com/kf5grd/keybasebot/pkg/kvstore" "github.com/urfave/cli/v2" "samhofi.us/x/keybase/v2" "samhofi.us/x/keybase/v2/types/chat1" ) var version string func main() { app := cli.NewApp() app.Name = "ssh0le" app.Version = version app.HideVersion = false app.Usage = "A general Keybase chat bot" app.Writer = os.Stdout app.HideVersion = false app.Flags = []cli.Flag{ &cli.StringFlag{ Name: "home", Aliases: []string{"H"}, Usage: "Keybase Home Folder", }, &cli.BoolFlag{ Name: "debug", Usage: "Enables debugging", EnvVars: []string{"BOT_DEBUG"}, }, &cli.BoolFlag{ Name: "json", Usage: "Enables JSON logging", EnvVars: []string{"BOT_LOG_JSON"}, }, &cli.StringFlag{ Name: "log-convid", Usage: "Set the Keybase log conversation id", EnvVars: []string{"BOT_LOG_CONVID"}, }, &cli.StringFlag{ Name: "reddit-user", Usage: "Set the Reddit auth user", EnvVars: []string{"BOT_REDDIT_USER"}, }, &cli.StringFlag{ Name: "reddit-pass", Usage: "Set the Reddit auth password", EnvVars: []string{"BOT_REDDIT_PASS"}, }, &cli.StringFlag{ Name: "owner", Usage: "Set the Keybase username of the bot owner", EnvVars: []string{"BOT_OWNER"}, }, &cli.StringFlag{ Name: "kvstore-team", Usage: "Set the kvstore team if you want to save configs", EnvVars: []string{"BOT_KVSTORE_TEAM"}, }, } app.Action = run if err := app.Run(os.Args); err != nil { log.Fatal(err) } } func run(c *cli.Context) error { b := keybasebot.New("", keybase.SetHomePath(c.String("home"))) b.Debug = c.Bool("debug") b.JSON = c.Bool("json") b.LogWriter = os.Stdout b.LogConv = chat1.ConvIDStr(c.String("log-convid")) // set the bot owner for private commands if c.String("owner") != "" { b.Meta["owner"] = c.String("owner") } if c.String("kbstore-team") != "" { b.Meta["kvstore"] = c.String("kvstore-team") loadNsfwAllowed(b) } // set reddit login, which enables reddit commands if c.String("reddit-user") != "" && c.String("reddit-pass") != "" { b.Meta["reddit-user"] = c.String("reddit-user") b.Meta["reddit-pass"] = c.String("reddit-user") } // register the bot commands b.Commands = append(b.Commands, keybasebot.BotCommand{ 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"), ), }, keybasebot.BotCommand{ Name: "convert", Ad: &cmd.ConvertAd, Run: keybasebot.Adapt( cmd.Convert, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!convert"), ), }, keybasebot.BotCommand{ Name: "price", Ad: &cmd.PriceAd, Run: keybasebot.Adapt( cmd.SendPrice, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!price"), ), }, keybasebot.BotCommand{ Name: "nsfw", Ad: nil, Run: keybasebot.Adapt( setNsfw, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!nsfw"), keybasebot.FromUser(c.String("owner")), ), }, ) // if there are reddit credentials add the reddit commands if c.String("reddit-user") != "" && c.String("reddit-pass") != "" { b.Commands = append(b.Commands, keybasebot.BotCommand{ Name: "eyebleach", Ad: &cmd.EyebleachAd, Run: keybasebot.Adapt( cmd.Eyebleach, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!eyebleach"), ), }, keybasebot.BotCommand{ Name: "boobs", Ad: nil, Run: keybasebot.Adapt( cmd.Boobs, keybasebot.MessageType("text"), keybasebot.CommandPrefix("!boobs"), nsfwFilter(), ), }, ) } // catch ctrl-c so we can clean up ch := make(chan os.Signal) signal.Notify(ch, os.Interrupt, syscall.SIGTERM) go func() { <-ch b.Logger.Info("Caught SIGINT, cleaning up.") b.KB.ClearCommands() b.Logger.Info("Cleared command adverts. Bye.") time.Sleep(time.Second * 2) os.Exit(0) }() // then run b.Run() return nil } func loadNsfwAllowed(b *keybasebot.Bot) { // get the team from meta data, ok := b.Meta["kvstore"] if ok { // make something to fill allowedTeams := make(map[chat1.ConvIDStr]bool) team := data.(string) kvKey := kvstore.New("nsfwAllowed", &allowedTeams, -1) err := kvstore.Get(b.KB, team, "ssh0le", &kvKey) if err != nil { return } // set the allowed teams into meta b.Meta["nsfwAllowed"] = allowedTeams } return }