This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user