CI / test (pull_request) Successful in 6m25s
Stacks on #16. Opens a public thread named "{author} asks: {title}" and puts the post body in the first thread message. Reviewed-on: #17 Co-authored-by: codegirl-007 <s.raide@gmail.com>
107 lines
2.8 KiB
Go
107 lines
2.8 KiB
Go
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, 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, name string) (string, error) {
|
|
thread, err := s.session.ThreadStartComplex(channelID, &discordgo.ThreadStart{
|
|
Name: name,
|
|
Type: discordgo.ChannelTypeGuildPublicThread,
|
|
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 {
|
|
content := messageContent(msg)
|
|
embeds := toEmbeds(msg)
|
|
_, err := s.session.ChannelMessageEditComplex(&discordgo.MessageEdit{
|
|
ID: messageID,
|
|
Channel: channelID,
|
|
Content: &content,
|
|
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{
|
|
Content: messageContent(msg),
|
|
Embeds: toEmbeds(msg),
|
|
AllowedMentions: &discordgo.MessageAllowedMentions{},
|
|
}
|
|
}
|
|
|
|
func toEmbeds(msg Message) []*discordgo.MessageEmbed {
|
|
main := &discordgo.MessageEmbed{
|
|
Title: msg.Title,
|
|
URL: publicURL(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
|
|
}
|