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), "
"), "")
}