diff --git a/README.md b/README.md index 6ca0c65..39d811e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,9 @@ This package requires the keybase binary installed on your system, and works on #### Running: ``` -debug - enables command debugging. + enables command debugging to stdout + -feedback-convid string + sets the keybase chat1.ConvIDStr to send feedback to. -log-convid string sets the keybase chat1.ConvIDStr to log debugging to keybase chat. ``` @@ -45,6 +47,7 @@ Required by keybase: (Must set all of these) Required by this package: (Set the values you feel like, if you don't set them they won't be used) - `BOT_DEBUG=true` - `BOT_LOG_CONVID=` + - `BOT_FEEDBACK_CONVID=` #### Example: `docker run --name myJitsi --rm -d -e KEYBASE_USERNAME=FOO -e KEYBASE_PAPERKEY="bar baz ..." -e KEYBASE_SERVICE=1 -e BOT_DEBUG=true haukeness/keybase-jitsi-bot` diff --git a/args.go b/args.go index 7afe7f2..baccdfe 100644 --- a/args.go +++ b/args.go @@ -18,6 +18,8 @@ func (b *bot) parseArgs(args []string) error { cliConfig := botConfig{} flags.BoolVar(&cliConfig.Debug, "debug", false, "enables command debugging to stdout") flags.StringVar(&cliConfig.LogConvIDStr, "log-convid", "", "sets the keybase chat1.ConvIDStr to log debugging to keybase chat.") + flags.StringVar(&cliConfig.FeedbackConvIDStr, "feedback-convid", "", "sets the keybase chat1.ConvIDStr to send feedback to.") + flags.StringVar(&cliConfig.FeedbackTeamAdvert, "feedback-team-advert", "", "sets the keybase team/channel to advertise feedback. @team#channel") if err := flags.Parse(args[1:]); err != nil { return err } @@ -30,6 +32,12 @@ func (b *bot) parseArgs(args []string) error { if cliConfig.LogConvIDStr != "" { b.config.LogConvIDStr = cliConfig.LogConvIDStr } + if cliConfig.FeedbackConvIDStr != "" { + b.config.FeedbackConvIDStr = cliConfig.FeedbackConvIDStr + } + if cliConfig.FeedbackTeamAdvert != "" { + b.config.FeedbackTeamAdvert = cliConfig.FeedbackTeamAdvert + } } // then print the running options @@ -37,6 +45,9 @@ func (b *bot) parseArgs(args []string) error { if b.config.LogConvIDStr != "" { b.debug("Logging to conversation %s", b.config.LogConvIDStr) } + if b.config.FeedbackConvIDStr != "" { + b.debug("Feedback enabled to %s and advertising %s", b.config.FeedbackConvIDStr, b.config.FeedbackTeamAdvert) + } return nil } diff --git a/commands.go b/commands.go index d3412d8..c12c26d 100644 --- a/commands.go +++ b/commands.go @@ -19,3 +19,19 @@ func (b *bot) setupMeeting(convid chat1.ConvIDStr, sender string, words []string message := fmt.Sprintf("@%s here's your meeting: %s", sender, meeting.getURL()) b.k.SendMessageByConvID(convid, message) } + +func (b *bot) sendFeedback(convid chat1.ConvIDStr, mesgID chat1.MessageID, sender string, message string) { + b.debug("feedback recieved in %s", convid) + if b.config.FeedbackConvIDStr != "" { + fcID := chat1.ConvIDStr(b.config.FeedbackConvIDStr) + if _, err := b.k.SendMessageByConvID(fcID, "Feedback from @%s:\n```%s```", sender, message); err != nil { + b.k.ReplyByConvID(convid, mesgID, "I'm sorry, I was unable to send your feedback because my benevolent overlords have not set a destination for feedback. :sad:") + log.Printf("Unable to send feedback: %s", err) + } else { + b.k.ReplyByConvID(convid, mesgID, "Thanks! Your feedback has been sent to my human overlords!") + b.debug("feedback sent") + } + } else { + b.debug("feedback not enabled. set --feedback-convid or BOT_FEEDBACK_CONVID") + } +} diff --git a/handlers.go b/handlers.go index ac95134..ec7b5d9 100644 --- a/handlers.go +++ b/handlers.go @@ -54,6 +54,8 @@ func (b *bot) chatHandler(m chat1.MsgSummary) { switch words[1] { case "meet": b.setupMeeting(m.ConvID, m.Sender.Username, words, m.Channel.MembersType) + case "feedback": + b.sendFeedback(m.ConvID, m.Id, m.Sender.Username, m.Content.Text.Body) } } } @@ -63,10 +65,16 @@ func (b *bot) chatHandler(m chat1.MsgSummary) { words := strings.Fields(m.Content.Text.Body) // strip the ! from the first word, and lowercase to derive the command thisCommand := strings.ToLower(strings.Replace(words[0], "!", "", 1)) + maybeSubCommand := strings.ToLower(words[1]) // decide if this is askind for extended commands switch thisCommand { case "jitsi": - b.setupMeeting(m.ConvID, m.Sender.Username, words, m.Channel.MembersType) + switch maybeSubCommand { + case "feedback": + b.sendFeedback(m.ConvID, m.Id, m.Sender.Username, m.Content.Text.Body) + default: + b.setupMeeting(m.ConvID, m.Sender.Username, words, m.Channel.MembersType) + } default: return } diff --git a/main.go b/main.go index d3146d8..d159e98 100644 --- a/main.go +++ b/main.go @@ -24,8 +24,10 @@ type bot struct { // botConfig hold env and cli flags and options // fields must be exported for package env (reflect) to work type botConfig struct { - Debug bool `env:"BOT_DEBUG" envDefault:"false"` - LogConvIDStr string `env:"BOT_LOG_CONVID" envDefault:""` + Debug bool `env:"BOT_DEBUG" envDefault:"false"` + LogConvIDStr string `env:"BOT_LOG_CONVID" envDefault:""` + FeedbackConvIDStr string `env:"BOT_FEEDBACK_CONVID" envDefault:""` + FeedbackTeamAdvert string `env:"BOT_FEEDBACK_TEAM_ADVERT" envDefault:""` } // hold reply information when needed @@ -81,6 +83,12 @@ func (b *bot) registerCommands() { Description: "Starts a meet.jit.si meeting", Usage: "", }, + { + Name: "jitsi feedback", + Description: "Tell us how we're doing!", + Usage: "", + ExtendedDescription: getFeedbackExtendedDescription(b.config), + }, }, }, }, diff --git a/utils.go b/utils.go index db28bb3..8f3c80e 100644 --- a/utils.go +++ b/utils.go @@ -2,6 +2,9 @@ package main import ( "encoding/json" + "fmt" + + "samhofi.us/x/keybase/types/chat1" ) // this JSON pretty prints errors and debug @@ -9,3 +12,18 @@ func p(b interface{}) string { s, _ := json.MarshalIndent(b, "", " ") return string(s) } + +func getFeedbackExtendedDescription(bc botConfig) *chat1.UserBotExtendedDescription { + if bc.FeedbackTeamAdvert != "" { + return &chat1.UserBotExtendedDescription{ + Title: "!jitsi feedback", + DesktopBody: fmt.Sprintf("Please note: Your feedback will be public!\nYour feedback will be posted to %s", bc.FeedbackTeamAdvert), + MobileBody: fmt.Sprintf("Please note: Your feedback will be public!\nYour feedback will be posted to %s", bc.FeedbackTeamAdvert), + } + } + return &chat1.UserBotExtendedDescription{ + Title: fmt.Sprintf("!jitsi feedback"), + DesktopBody: "Please note: Your feedback will be public!", + MobileBody: "Please note: Your feedback will be public!", + } +}