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  }