From 3bf722c5fe27d624313af15aa82c1ef0f1c13f06 Mon Sep 17 00:00:00 2001 From: Harvey Tindall Date: Fri, 21 May 2021 21:59:50 +0100 Subject: [PATCH] Discord: send links as embeds Kind of janky but works. This kind of messes up the layout if you write links in-line. --- discord.go | 54 ++++++++++++++++++++++++++++++++++++++++++------------ stripmd.go | 25 ++++++++++++++++++++----- 2 files changed, 62 insertions(+), 17 deletions(-) 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 { - for _, id := range channelID { - msg := "" - if message.Markdown == "" { - msg = message.Text - } else { - msg = message.Markdown + 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, + } } - _, err := d.bot.ChannelMessageSend( - id, - msg, - ) - if err != nil { - return err + } else { + msg = message.Text + } + for _, id := range channelID { + 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 { + _, 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), "

"), "

") }