github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/telegram/telegram.go (about) 1 package telegram 2 3 import ( 4 "fmt" 5 "strconv" 6 7 "github.com/caarlos0/env/v9" 8 "github.com/caarlos0/log" 9 api "github.com/go-telegram-bot-api/telegram-bot-api" 10 "github.com/goreleaser/goreleaser/internal/tmpl" 11 "github.com/goreleaser/goreleaser/pkg/context" 12 ) 13 14 const ( 15 defaultMessageTemplate = `{{ .ProjectName }} {{ mdv2escape .Tag }} is out! Check it out at {{ mdv2escape .ReleaseURL }}` 16 parseModeHTML = "HTML" 17 parseModeMarkdown = "MarkdownV2" 18 ) 19 20 type Pipe struct{} 21 22 func (Pipe) String() string { return "telegram" } 23 func (Pipe) Skip(ctx *context.Context) bool { return !ctx.Config.Announce.Telegram.Enabled } 24 25 type Config struct { 26 ConsumerToken string `env:"TELEGRAM_TOKEN,notEmpty"` 27 } 28 29 func (Pipe) Default(ctx *context.Context) error { 30 if ctx.Config.Announce.Telegram.MessageTemplate == "" { 31 ctx.Config.Announce.Telegram.MessageTemplate = defaultMessageTemplate 32 } 33 switch ctx.Config.Announce.Telegram.ParseMode { 34 case parseModeHTML, parseModeMarkdown: 35 break 36 default: 37 ctx.Config.Announce.Telegram.ParseMode = parseModeMarkdown 38 } 39 return nil 40 } 41 42 func (Pipe) Announce(ctx *context.Context) error { 43 msg, chatID, err := getMessageDetails(ctx) 44 if err != nil { 45 return err 46 } 47 48 var cfg Config 49 if err := env.Parse(&cfg); err != nil { 50 return fmt.Errorf("telegram: %w", err) 51 } 52 53 log.Infof("posting: '%s'", msg) 54 bot, err := api.NewBotAPI(cfg.ConsumerToken) 55 if err != nil { 56 return fmt.Errorf("telegram: %w", err) 57 } 58 59 tm := api.NewMessage(chatID, msg) 60 tm.ParseMode = "MarkdownV2" 61 _, err = bot.Send(tm) 62 if err != nil { 63 return fmt.Errorf("telegram: %w", err) 64 } 65 log.Debug("message sent") 66 return nil 67 } 68 69 func getMessageDetails(ctx *context.Context) (string, int64, error) { 70 msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Telegram.MessageTemplate) 71 if err != nil { 72 return "", 0, fmt.Errorf("telegram: %w", err) 73 } 74 chatIDStr, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Telegram.ChatID) 75 if err != nil { 76 return "", 0, fmt.Errorf("telegram: %w", err) 77 } 78 chatID, err := strconv.ParseInt(chatIDStr, 10, 64) 79 if err != nil { 80 return "", 0, fmt.Errorf("telegram: %w", err) 81 } 82 83 return msg, chatID, nil 84 }