otiai10/amesh-bot

View on GitHub
commands/lgtm.go

Summary

Maintainability
A
0 mins
Test Coverage
package commands

import (
    "bytes"
    "context"

    "github.com/otiai10/amesh-bot/service"
    "github.com/otiai10/largo"
    "github.com/slack-go/slack"
    "github.com/slack-go/slack/slackevents"
)

type (
    LGTM interface {
        Random() (string, string, error)
    }
)

type LGTMCommand struct {
    Service LGTM
}

func (cmd LGTMCommand) Match(event slackevents.AppMentionEvent) bool {
    tokens := largo.Tokenize(event.Text)[1:]
    return len(tokens) > 0 && tokens[0] == "lgtm"
}

func (cmd LGTMCommand) Help() string {
    return "lgtmコマンド\n```@amesh lgtm [-markdown|-md]```"
}

func (cmd LGTMCommand) Execute(ctx context.Context, client service.ISlackClient, event slackevents.AppMentionEvent) error {
    imgurl, mrkdwn, err := cmd.Service.Random()
    msg := inreply(event)

    help := bytes.NewBuffer(nil)
    fset := largo.NewFlagSet("", largo.ContinueOnError)
    fset.Output = help
    var includeMarkdown bool
    fset.BoolVar(&includeMarkdown, "markdown", false, "Markdownを表示").Alias("md")

    fset.Parse(largo.Tokenize(event.Text)[2:])

    if fset.HelpRequested() {
        msg.Text = cmd.Help()
        _, err = client.PostMessage(ctx, msg)
        return err
    }

    msg.Blocks = append(msg.Blocks, slack.NewImageBlock(imgurl, "LGTM", "", nil))
    if includeMarkdown {
        msg.Blocks = append(msg.Blocks, slack.NewSectionBlock(
            slack.NewTextBlockObject(slack.MarkdownType, "```"+mrkdwn+"```", false, false), nil, nil),
        )
    }

    _, err = client.PostMessage(ctx, msg)
    return err
}