github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/pipe/discord/discord.go (about) 1 package discord 2 3 import ( 4 "fmt" 5 "strconv" 6 7 "github.com/DisgoOrg/disgohook" 8 "github.com/DisgoOrg/disgohook/api" 9 "github.com/apex/log" 10 "github.com/caarlos0/env/v6" 11 "github.com/goreleaser/goreleaser/internal/tmpl" 12 "github.com/goreleaser/goreleaser/pkg/context" 13 ) 14 15 const ( 16 defaultAuthor = `GoReleaser` 17 defaultColor = "3888754" 18 defaultIcon = "https://goreleaser.com/static/avatar.png" 19 defaultMessageTemplate = `{{ .ProjectName }} {{ .Tag }} is out! Check it out at {{ .GitURL }}/releases/tag/{{ .Tag }}` 20 ) 21 22 type Pipe struct{} 23 24 func (Pipe) String() string { return "discord" } 25 func (Pipe) Skip(ctx *context.Context) bool { return !ctx.Config.Announce.Discord.Enabled } 26 27 type Config struct { 28 WebhookID string `env:"DISCORD_WEBHOOK_ID,notEmpty"` 29 WebhookToken string `env:"DISCORD_WEBHOOK_TOKEN,notEmpty"` 30 } 31 32 func (p Pipe) Default(ctx *context.Context) error { 33 if ctx.Config.Announce.Discord.MessageTemplate == "" { 34 ctx.Config.Announce.Discord.MessageTemplate = defaultMessageTemplate 35 } 36 if ctx.Config.Announce.Discord.IconURL == "" { 37 ctx.Config.Announce.Discord.IconURL = defaultIcon 38 } 39 if ctx.Config.Announce.Discord.Author == "" { 40 ctx.Config.Announce.Discord.Author = defaultAuthor 41 } 42 if ctx.Config.Announce.Discord.Color == "" { 43 ctx.Config.Announce.Discord.Color = defaultColor 44 } 45 return nil 46 } 47 48 func (p Pipe) Announce(ctx *context.Context) error { 49 msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Discord.MessageTemplate) 50 if err != nil { 51 return fmt.Errorf("announce: failed to announce to discord: %w", err) 52 } 53 54 var cfg Config 55 if err := env.Parse(&cfg); err != nil { 56 return fmt.Errorf("announce: failed to announce to discord: %w", err) 57 } 58 59 log.Infof("posting: '%s'", msg) 60 61 webhook, err := disgohook.NewWebhookClientByToken(nil, nil, fmt.Sprintf("%s/%s", cfg.WebhookID, cfg.WebhookToken)) 62 if err != nil { 63 return fmt.Errorf("announce: failed to announce to discord: %w", err) 64 } 65 color, err := strconv.Atoi(ctx.Config.Announce.Discord.Color) 66 if err != nil { 67 return fmt.Errorf("announce: failed to announce to discord: %w", err) 68 } 69 if _, err = webhook.SendMessage(api.NewWebhookMessageCreateBuilder(). 70 AddEmbeds(api.Embed{ 71 Author: &api.EmbedAuthor{ 72 Name: &ctx.Config.Announce.Discord.Author, 73 IconURL: &ctx.Config.Announce.Discord.IconURL, 74 }, 75 Description: &msg, 76 Color: &color, 77 }). 78 Build(), 79 ); err != nil { 80 return fmt.Errorf("announce: failed to announce to discord: %w", err) 81 } 82 return nil 83 }