package tickets import ( "fmt" "strings" "velox-bot/internal/db/repos/ticketrepo" "github.com/bwmarrin/discordgo" ) // maxTranscriptMessages bounds how far back a transcript reads: 50 pages of // 100, far beyond any normal ticket. const maxTranscriptMessages = 5000 // Transcript renders the whole thread as plain text, oldest first, and // reports how many messages it holds. Attachments and embeds are listed so // the log keeps their links and titles. func Transcript(d Discord, t *ticketrepo.Ticket) ([]byte, int, error) { var msgs []*discordgo.Message before := "" var fetchErr error for len(msgs) < maxTranscriptMessages { page, err := d.ChannelMessages(id(t.ThreadID), 100, before, "", "") if err != nil { fetchErr = err break } msgs = append(msgs, page...) if len(page) < 100 { break } before = page[len(page)-1].ID } var b strings.Builder fmt.Fprintf(&b, "Ticket #%04d ยท %s\n", t.Number, t.CategoryName) fmt.Fprintf(&b, "Subject: %s\n", t.Subject) fmt.Fprintf(&b, "Opened by user %d on %s\n", t.OpenerID, t.CreatedAt.UTC().Format("2006-01-02 15:04 MST")) if fetchErr != nil { fmt.Fprintf(&b, "Note: only part of the thread could be read (%v)\n", fetchErr) } b.WriteString(strings.Repeat("-", 60) + "\n\n") // Discord returns newest first. for i := len(msgs) - 1; i >= 0; i-- { writeMessage(&b, msgs[i]) } return []byte(b.String()), len(msgs), fetchErr } func writeMessage(b *strings.Builder, m *discordgo.Message) { name := "unknown" if m.Author != nil { name = m.Author.Username if m.Author.GlobalName != "" { name = m.Author.GlobalName + " (" + m.Author.Username + ")" } if m.Author.Bot { name += " [bot]" } } fmt.Fprintf(b, "[%s] %s\n", m.Timestamp.UTC().Format("2006-01-02 15:04"), name) if content := strings.TrimSpace(m.Content); content != "" { for _, line := range strings.Split(content, "\n") { b.WriteString(" " + line + "\n") } } for _, e := range m.Embeds { if e == nil { continue } title := e.Title if title == "" { title = clip(e.Description, 120) } if title != "" { b.WriteString(" [embed] " + strings.ReplaceAll(title, "\n", " ") + "\n") } } for _, a := range m.Attachments { if a != nil { b.WriteString(" [file] " + a.Filename + " " + a.URL + "\n") } } b.WriteString("\n") }