package discord import ( "strings" "plumber/internal/events" ) const ( embedTitleLimit = 256 embedDescriptionLimit = 4096 threadNameLimit = 100 embedColor = 0xe96a26 ) // Message is a Discord-ready snapshot of a site post event. type Message struct { Title string URL string Description string City string Author string ImageURLs []string ThreadName string } func formatMessage(ev events.PostEvent) Message { title := strings.TrimSpace(ev.Title) if title == "" { title = "Reply" } author := strings.TrimSpace(ev.AuthorName) if author == "" { author = "Someone" } msg := Message{ Title: truncateRunes(title, embedTitleLimit), URL: strings.TrimSpace(ev.Permalink), Description: truncateRunes(strings.TrimSpace(ev.Body), embedDescriptionLimit), City: strings.TrimSpace(ev.City), Author: author, ThreadName: threadName(author, ev.Title), } for _, img := range ev.Images { url := strings.TrimSpace(img.URL) if url == "" { continue } msg.ImageURLs = append(msg.ImageURLs, url) } return msg } func threadName(author, title string) string { author = strings.TrimSpace(author) if author == "" { author = "Someone" } title = strings.TrimSpace(title) if title == "" { title = "Question" } return truncateRunes(author+" asks: "+title, threadNameLimit) } func truncateRunes(s string, max int) string { if max <= 0 { return "" } runes := []rune(s) if len(runes) <= max { return s } return string(runes[:max]) } func isRoot(ev events.PostEvent) bool { return strings.TrimSpace(ev.ParentID) == "" } func messageContent(msg Message) string { var parts []string if body := strings.TrimSpace(msg.Description); body != "" { parts = append(parts, body) } var meta []string if msg.City != "" { meta = append(meta, msg.City) } if msg.Author != "" { meta = append(meta, msg.Author) } if len(meta) > 0 { parts = append(parts, strings.Join(meta, " ยท ")) } if u := publicURL(msg.URL); u != "" { parts = append(parts, u) } return truncateRunes(strings.Join(parts, "\n"), 2000) } func publicURL(raw string) string { raw = strings.TrimSpace(raw) if !strings.HasPrefix(raw, "https://") { return "" } if strings.Contains(raw, "localhost") || strings.Contains(raw, "127.0.0.1") { return "" } return raw }