Dan Anglin
6bc00138ab
When viewing an account's information the user can now optionally view the statuses that the account has created.
178 lines
5.6 KiB
Go
178 lines
5.6 KiB
Go
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
|
|
//
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package printer
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"codeflow.dananglin.me.uk/apollo/enbas/internal/model"
|
|
)
|
|
|
|
func (p Printer) PrintStatus(status model.Status) {
|
|
var builder strings.Builder
|
|
|
|
// The account information
|
|
builder.WriteString("\n" + p.fullDisplayNameFormat(status.Account.DisplayName, status.Account.Acct))
|
|
|
|
// The ID of the status
|
|
builder.WriteString("\n\n" + p.headerFormat("STATUS ID:"))
|
|
builder.WriteString("\n" + status.ID)
|
|
|
|
// The content of the status.
|
|
builder.WriteString("\n\n" + p.headerFormat("CONTENT:"))
|
|
builder.WriteString(p.convertHTMLToText(status.Content, true))
|
|
|
|
// Details of media attachments (if any).
|
|
if len(status.MediaAttachments) > 0 {
|
|
builder.WriteString("\n\n" + p.headerFormat("MEDIA ATTACHMENTS:"))
|
|
|
|
for ind, media := range status.MediaAttachments {
|
|
builder.WriteString("\n\n[" + strconv.Itoa(ind) + "] " + p.fieldFormat("ID:") + " " + media.ID)
|
|
builder.WriteString("\n " + p.fieldFormat("Type:") + " " + media.Type)
|
|
|
|
description := media.Description
|
|
if description == "" {
|
|
description = noMediaDescription
|
|
}
|
|
|
|
builder.WriteString("\n " + p.fieldFormat("Description:") + " " + description)
|
|
builder.WriteString("\n " + p.fieldFormat("Media URL:") + " " + media.URL)
|
|
}
|
|
}
|
|
|
|
// If a poll exists in a status, write the contents to the builder.
|
|
if status.Poll != nil {
|
|
builder.WriteString(p.pollOptions(*status.Poll))
|
|
}
|
|
|
|
// Status creation time
|
|
builder.WriteString("\n\n" + p.headerFormat("CREATED AT:"))
|
|
builder.WriteString("\n" + p.formatDateTime(status.CreatedAt))
|
|
|
|
// Status stats
|
|
builder.WriteString("\n\n" + p.headerFormat("STATS:"))
|
|
builder.WriteString("\n" + p.fieldFormat("Boosts: ") + strconv.Itoa(status.ReblogsCount))
|
|
builder.WriteString("\n" + p.fieldFormat("Likes: ") + strconv.Itoa(status.FavouritesCount))
|
|
builder.WriteString("\n" + p.fieldFormat("Replies: ") + strconv.Itoa(status.RepliesCount))
|
|
|
|
// The user's actions on the status
|
|
builder.WriteString("\n\n" + p.headerFormat("YOUR ACTIONS:"))
|
|
builder.WriteString("\n" + p.fieldFormat("Boosted: ") + strconv.FormatBool(status.Reblogged))
|
|
builder.WriteString("\n" + p.fieldFormat("Liked: ") + strconv.FormatBool(status.Favourited))
|
|
builder.WriteString("\n" + p.fieldFormat("Bookmarked: ") + strconv.FormatBool(status.Bookmarked))
|
|
|
|
// Status visibility
|
|
builder.WriteString("\n\n" + p.headerFormat("VISIBILITY:"))
|
|
builder.WriteString("\n" + status.Visibility.String())
|
|
|
|
// Status URL
|
|
builder.WriteString("\n\n" + p.headerFormat("URL:"))
|
|
builder.WriteString("\n" + status.URL)
|
|
builder.WriteString("\n\n")
|
|
|
|
p.print(builder.String())
|
|
}
|
|
|
|
func (p Printer) PrintStatusList(list model.StatusList) {
|
|
p.print(p.statusList(list))
|
|
}
|
|
|
|
func (p Printer) statusList(list model.StatusList) string {
|
|
var builder strings.Builder
|
|
|
|
builder.WriteString(p.headerFormat(list.Name) + "\n")
|
|
|
|
for _, status := range list.Statuses {
|
|
statusID := status.ID
|
|
createdAt := p.formatDateTime(status.CreatedAt)
|
|
boostedAt := ""
|
|
content := status.Content
|
|
poll := status.Poll
|
|
mediaAttachments := status.MediaAttachments
|
|
|
|
switch {
|
|
case status.Reblog != nil:
|
|
builder.WriteString("\n" + p.wrapLines(
|
|
p.fullDisplayNameFormat(status.Account.DisplayName, status.Account.Acct)+
|
|
" boosted this status from "+
|
|
p.fullDisplayNameFormat(status.Reblog.Account.DisplayName, status.Reblog.Account.Acct)+
|
|
":",
|
|
0,
|
|
))
|
|
|
|
statusID = status.Reblog.ID
|
|
createdAt = p.formatDateTime(status.Reblog.CreatedAt)
|
|
boostedAt = p.formatDateTime(status.CreatedAt)
|
|
content = status.Reblog.Content
|
|
poll = status.Reblog.Poll
|
|
mediaAttachments = status.Reblog.MediaAttachments
|
|
case status.InReplyToID != "":
|
|
builder.WriteString("\n" + p.wrapLines(
|
|
p.fullDisplayNameFormat(status.Account.DisplayName, status.Account.Acct)+
|
|
" posted in reply to "+
|
|
status.InReplyToID+
|
|
":",
|
|
0,
|
|
))
|
|
default:
|
|
builder.WriteString("\n" + p.fullDisplayNameFormat(status.Account.DisplayName, status.Account.Acct) + " posted:")
|
|
}
|
|
|
|
builder.WriteString("\n" + p.convertHTMLToText(content, true))
|
|
|
|
if poll != nil {
|
|
builder.WriteString(p.pollOptions(*poll))
|
|
}
|
|
|
|
for _, media := range mediaAttachments {
|
|
builder.WriteString("\n\n" + symbolImage + " " + p.fieldFormat("Media attachment: ") + media.ID)
|
|
builder.WriteString("\n " + p.fieldFormat("Media type: ") + media.Type + "\n")
|
|
|
|
description := " " + p.fieldFormat("Description: ")
|
|
|
|
if media.Description == "" {
|
|
description += noMediaDescription
|
|
} else {
|
|
description += media.Description
|
|
}
|
|
|
|
builder.WriteString(p.wrapLines(description, 2))
|
|
}
|
|
|
|
boosted := symbolBoosted
|
|
if status.Reblogged {
|
|
boosted = p.theme.boldyellow + symbolBoosted + p.theme.reset
|
|
}
|
|
|
|
liked := symbolNotLiked
|
|
if status.Favourited {
|
|
liked = p.theme.boldyellow + symbolLiked + p.theme.reset
|
|
}
|
|
|
|
bookmarked := symbolNotBookmarked
|
|
if status.Bookmarked {
|
|
bookmarked = p.theme.boldyellow + symbolBookmarked + p.theme.reset
|
|
}
|
|
|
|
builder.WriteString("\n\n" + boosted + " " + p.fieldFormat("boosted: ") + strconv.FormatBool(status.Reblogged))
|
|
builder.WriteString("\n" + liked + " " + p.fieldFormat("liked: ") + strconv.FormatBool(status.Favourited))
|
|
builder.WriteString("\n" + bookmarked + " " + p.fieldFormat("bookmarked: ") + strconv.FormatBool(status.Bookmarked))
|
|
|
|
builder.WriteString(
|
|
"\n\n" +
|
|
p.fieldFormat("Status ID: ") + statusID +
|
|
"\n" + p.fieldFormat("Created at: ") + createdAt,
|
|
)
|
|
|
|
if boostedAt != "" {
|
|
builder.WriteString("\n" + p.fieldFormat("Boosted at: ") + boostedAt)
|
|
}
|
|
|
|
builder.WriteString("\n" + p.statusSeparator + "\n")
|
|
}
|
|
|
|
return builder.String()
|
|
}
|