diff --git a/discord.go b/discord.go index f80d216..4f49354 100644 --- a/discord.go +++ b/discord.go @@ -232,19 +232,49 @@ func (d *DiscordDaemon) commandPIN(s *dg.Session, m *dg.MessageCreate, sects []s } func (d *DiscordDaemon) Send(message *Message, channelID ...string) error { + msg := "" + var embeds []*dg.MessageEmbed + if message.Markdown != "" { + var links []Link + msg, links = StripAltText(message.Markdown, true) + embeds = make([]*dg.MessageEmbed, len(links)) + for i := range links { + embeds[i] = &dg.MessageEmbed{ + URL: links[i].URL, + Title: links[i].Alt, + Type: dg.EmbedTypeLink, + } + } + } else { + msg = message.Text + } for _, id := range channelID { - msg := "" - if message.Markdown == "" { - msg = message.Text + var err error + if len(embeds) != 0 { + _, err = d.bot.ChannelMessageSendComplex( + id, + &dg.MessageSend{ + Content: msg, + Embed: embeds[0], + }, + ) + if err != nil { + return err + } + for i := 1; i < len(embeds); i++ { + _, err := d.bot.ChannelMessageSendEmbed(id, embeds[i]) + if err != nil { + return err + } + } } else { - msg = message.Markdown - } - _, err := d.bot.ChannelMessageSend( - id, - msg, - ) - if err != nil { - return err + _, err := d.bot.ChannelMessageSend( + id, + msg, + ) + if err != nil { + return err + } } } return nil diff --git a/stripmd.go b/stripmd.go index 0568067..2a5ea4d 100644 --- a/stripmd.go +++ b/stripmd.go @@ -6,18 +6,32 @@ import ( stripmd "github.com/writeas/go-strip-markdown" ) +type Link struct { + Alt, URL string +} + // StripAltText removes Markdown alt text from links and images and replaces them with just the URL. // Currently uses the deepest alt text when links/images are nested. -func StripAltText(md string) string { +// If links = true, links are completely removed, and a list of URLs and their alt text is also returned. +func StripAltText(md string, links bool) (string, []Link) { altTextStart := -1 // Start of alt text (between '[' & ']') URLStart := -1 // Start of url (between '(' & ')') URLEnd := -1 previousURLEnd := -2 out := "" + embeds := []Link{} for i := range md { if altTextStart != -1 && URLStart != -1 && md[i] == ')' { URLEnd = i - 1 - out += md[previousURLEnd+2:altTextStart-1] + md[URLStart:URLEnd+1] + out += md[previousURLEnd+2 : altTextStart-1] + if links { + embeds = append(embeds, Link{ + URL: md[URLStart : URLEnd+1], + Alt: md[altTextStart : URLStart-2], + }) + } else { + out += md[URLStart : URLEnd+1] + } previousURLEnd = URLEnd altTextStart, URLStart, URLEnd = -1, -1, -1 continue @@ -36,11 +50,12 @@ func StripAltText(md string) string { out += md[previousURLEnd+2:] } if out == "" { - return md + return md, embeds } - return out + return out, embeds } func stripMarkdown(md string) string { - return strings.TrimPrefix(strings.TrimSuffix(stripmd.Strip(StripAltText(md)), "

"), "

") + stripped, _ := StripAltText(md, false) + return strings.TrimPrefix(strings.TrimSuffix(stripmd.Strip(stripped), "

"), "

") }