github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/reddit/reddit.go (about) 1 package reddit 2 3 import ( 4 "fmt" 5 6 "github.com/caarlos0/env/v9" 7 "github.com/caarlos0/go-reddit/v3/reddit" 8 "github.com/caarlos0/log" 9 "github.com/goreleaser/goreleaser/internal/tmpl" 10 "github.com/goreleaser/goreleaser/pkg/context" 11 ) 12 13 const ( 14 defaultTitleTemplate = `{{ .ProjectName }} {{ .Tag }} is out!` 15 defaultURLTemplate = `{{ .ReleaseURL }}` 16 ) 17 18 type Pipe struct{} 19 20 func (Pipe) String() string { return "reddit" } 21 func (Pipe) Skip(ctx *context.Context) bool { return !ctx.Config.Announce.Reddit.Enabled } 22 23 type Config struct { 24 Secret string `env:"REDDIT_SECRET,notEmpty"` 25 Password string `env:"REDDIT_PASSWORD,notEmpty"` 26 } 27 28 func (Pipe) Default(ctx *context.Context) error { 29 if ctx.Config.Announce.Reddit.TitleTemplate == "" { 30 ctx.Config.Announce.Reddit.TitleTemplate = defaultTitleTemplate 31 } 32 33 if ctx.Config.Announce.Reddit.URLTemplate == "" { 34 ctx.Config.Announce.Reddit.URLTemplate = defaultURLTemplate 35 } 36 37 return nil 38 } 39 40 func (Pipe) Announce(ctx *context.Context) error { 41 title, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Reddit.TitleTemplate) 42 if err != nil { 43 return fmt.Errorf("reddit: %w", err) 44 } 45 46 url, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Reddit.URLTemplate) 47 if err != nil { 48 return fmt.Errorf("reddit: %w", err) 49 } 50 51 linkRequest := reddit.SubmitLinkRequest{ 52 Subreddit: ctx.Config.Announce.Reddit.Sub, 53 Title: title, 54 URL: url, 55 } 56 57 var cfg Config 58 if err := env.Parse(&cfg); err != nil { 59 return fmt.Errorf("reddit: %w", err) 60 } 61 62 credentials := reddit.Credentials{ID: ctx.Config.Announce.Reddit.ApplicationID, Secret: cfg.Secret, Username: ctx.Config.Announce.Reddit.Username, Password: cfg.Password} 63 client, err := reddit.NewClient(credentials) 64 if err != nil { 65 return fmt.Errorf("reddit: %w", err) 66 } 67 68 post, _, err := client.Post.SubmitLink(ctx, linkRequest) 69 if err != nil { 70 return fmt.Errorf("reddit: %w", err) 71 } 72 73 log.Infof("The text post is available at: %s\n", post.URL) 74 75 return nil 76 }