github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/twitter/twitter.go (about)

     1  package twitter
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/caarlos0/env/v9"
     7  	"github.com/caarlos0/log"
     8  	"github.com/dghubble/go-twitter/twitter"
     9  	"github.com/dghubble/oauth1"
    10  	"github.com/goreleaser/goreleaser/internal/tmpl"
    11  	"github.com/goreleaser/goreleaser/pkg/context"
    12  )
    13  
    14  const defaultMessageTemplate = `{{ .ProjectName }} {{ .Tag }} is out! Check it out at {{ .ReleaseURL }}`
    15  
    16  type Pipe struct{}
    17  
    18  func (Pipe) String() string                 { return "twitter" }
    19  func (Pipe) Skip(ctx *context.Context) bool { return !ctx.Config.Announce.Twitter.Enabled }
    20  
    21  type Config struct {
    22  	ConsumerKey    string `env:"TWITTER_CONSUMER_KEY,notEmpty"`
    23  	ConsumerSecret string `env:"TWITTER_CONSUMER_SECRET,notEmpty"`
    24  	AccessToken    string `env:"TWITTER_ACCESS_TOKEN,notEmpty"`
    25  	AccessSecret   string `env:"TWITTER_ACCESS_TOKEN_SECRET,notEmpty"`
    26  }
    27  
    28  func (Pipe) Default(ctx *context.Context) error {
    29  	if ctx.Config.Announce.Twitter.MessageTemplate == "" {
    30  		ctx.Config.Announce.Twitter.MessageTemplate = defaultMessageTemplate
    31  	}
    32  	return nil
    33  }
    34  
    35  func (Pipe) Announce(ctx *context.Context) error {
    36  	msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Twitter.MessageTemplate)
    37  	if err != nil {
    38  		return fmt.Errorf("twitter: %w", err)
    39  	}
    40  
    41  	var cfg Config
    42  	if err := env.Parse(&cfg); err != nil {
    43  		return fmt.Errorf("twitter: %w", err)
    44  	}
    45  
    46  	log.Infof("posting: '%s'", msg)
    47  	config := oauth1.NewConfig(cfg.ConsumerKey, cfg.ConsumerSecret)
    48  	token := oauth1.NewToken(cfg.AccessToken, cfg.AccessSecret)
    49  	client := twitter.NewClient(config.Client(oauth1.NoContext, token))
    50  	if _, _, err := client.Statuses.Update(msg, nil); err != nil {
    51  		return fmt.Errorf("twitter: %w", err)
    52  	}
    53  	return nil
    54  }