github.com/windmeup/goreleaser@v1.21.95/internal/pipe/discord/discord.go (about)

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