package discord import ( "context" "github.com/bwmarrin/discordgo" ) // API is the Discord REST surface used by the outbound subscriber. type API interface { SendToChannel(ctx context.Context, channelID string, msg Message) (messageID string, err error) StartThread(ctx context.Context, channelID, messageID, name string) (threadID string, err error) SendToThread(ctx context.Context, threadID string, msg Message) (messageID string, err error) Edit(ctx context.Context, channelID, messageID string, msg Message) error Close() error } type sessionAPI struct { session *discordgo.Session } func (s *sessionAPI) SendToChannel(_ context.Context, channelID string, msg Message) (string, error) { sent, err := s.session.ChannelMessageSendComplex(channelID, toMessageSend(msg)) if err != nil { return "", err } return sent.ID, nil } func (s *sessionAPI) StartThread(_ context.Context, channelID, messageID, name string) (string, error) { thread, err := s.session.MessageThreadStartComplex(channelID, messageID, &discordgo.ThreadStart{ Name: name, AutoArchiveDuration: 10080, }) if err != nil { return "", err } return thread.ID, nil } func (s *sessionAPI) SendToThread(ctx context.Context, threadID string, msg Message) (string, error) { return s.SendToChannel(ctx, threadID, msg) } func (s *sessionAPI) Edit(_ context.Context, channelID, messageID string, msg Message) error { embeds := toEmbeds(msg) _, err := s.session.ChannelMessageEditComplex(&discordgo.MessageEdit{ ID: messageID, Channel: channelID, Embeds: &embeds, }) return err } func (s *sessionAPI) Close() error { if s == nil || s.session == nil { return nil } return s.session.Close() } func toMessageSend(msg Message) *discordgo.MessageSend { return &discordgo.MessageSend{ Embeds: toEmbeds(msg), AllowedMentions: &discordgo.MessageAllowedMentions{}, } } func toEmbeds(msg Message) []*discordgo.MessageEmbed { main := &discordgo.MessageEmbed{ Title: msg.Title, URL: msg.URL, Description: msg.Description, Color: embedColor, } if msg.City != "" { main.Fields = append(main.Fields, &discordgo.MessageEmbedField{ Name: "City", Value: msg.City, Inline: true, }) } if msg.Author != "" { main.Fields = append(main.Fields, &discordgo.MessageEmbedField{ Name: "Author", Value: msg.Author, Inline: true, }) } embeds := []*discordgo.MessageEmbed{main} for i, url := range msg.ImageURLs { if i == 0 { main.Image = &discordgo.MessageEmbedImage{URL: url} continue } embeds = append(embeds, &discordgo.MessageEmbed{ Color: embedColor, Image: &discordgo.MessageEmbedImage{URL: url}, }) } return embeds }