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 }