checkpoint: show poll in timelines

This commit is contained in:
Dan Anglin 2024-06-11 14:17:47 +01:00
parent 8e59ecf697
commit b0ffd4fcec
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638

View file

@ -5,6 +5,8 @@
package model package model
import ( import (
"io"
"math"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -158,6 +160,8 @@ type MediaDimensions struct {
} }
func (s Status) Display(noColor bool) string { func (s Status) Display(noColor bool) string {
indent := " "
var builder strings.Builder var builder strings.Builder
// The account information // The account information
@ -169,41 +173,34 @@ func (s Status) Display(noColor bool) string {
// If a poll exists in a status, write the contents to the builder. // If a poll exists in a status, write the contents to the builder.
if s.Poll != nil { if s.Poll != nil {
for ind, option := range s.Poll.Options { displayPollContent(&builder, *s.Poll, noColor, indent)
builder.WriteString(
"\n\n " + strconv.Itoa(ind) + ". " + option.Title +
"\n " + strings.Repeat("\u2580", 80) +
"\n " + strconv.Itoa(option.VotesCount) + " votes",
)
}
builder.WriteString("\n")
} }
// The ID of the status // The ID of the status
builder.WriteString("\n" + utilities.HeaderFormat(noColor, "STATUS ID:") + "\n " + s.ID) builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "STATUS ID:") + "\n" + indent + s.ID)
// The ID of the poll if it exists // The ID of the poll if it exists
if s.Poll != nil { if s.Poll != nil {
builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "POLL ID:") + "\n " + s.Poll.ID) builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "POLL ID:") + "\n" + indent + s.Poll.ID)
} }
// Status creation time // Status creation time
builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "CREATED AT:") + "\n " + utilities.FormatTime(s.CreatedAt)) builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "CREATED AT:") + "\n" + indent + utilities.FormatTime(s.CreatedAt))
// Status stats // Status stats
builder.WriteString( builder.WriteString(
"\n\n" + "\n\n" +
utilities.HeaderFormat(noColor, "STATS:") + utilities.HeaderFormat(noColor, "STATS:") +
"\n " + utilities.FieldFormat(noColor, "Boosts: ") + strconv.Itoa(s.ReblogsCount) + "\n" + indent + utilities.FieldFormat(noColor, "Boosts: ") + strconv.Itoa(s.ReblogsCount) +
"\n " + utilities.FieldFormat(noColor, "Likes: ") + strconv.Itoa(s.FavouritesCount) + "\n" + indent + utilities.FieldFormat(noColor, "Likes: ") + strconv.Itoa(s.FavouritesCount) +
"\n " + utilities.FieldFormat(noColor, "Replies: ") + strconv.Itoa(s.RepliesCount), "\n" + indent + utilities.FieldFormat(noColor, "Replies: ") + strconv.Itoa(s.RepliesCount),
) )
// Status visibility // Status visibility
builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "VISIBILITY:") + "\n " + s.Visibility.String()) builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "VISIBILITY:") + "\n" + indent + s.Visibility.String())
// Status URL // Status URL
builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "URL:") + "\n " + s.URL) builder.WriteString("\n\n" + utilities.HeaderFormat(noColor, "URL:") + "\n" + indent + s.URL)
return builder.String() return builder.String()
} }
@ -232,10 +229,44 @@ func (s StatusList) Display(noColor bool) string {
createdAt = status.Reblog.CreatedAt createdAt = status.Reblog.CreatedAt
} }
builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", 80) + "\n\n") builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", 80))
builder.WriteString(utilities.FieldFormat(noColor, "ID:") + " " + statusID + "\t" + utilities.FieldFormat(noColor, "Created at:") + " " + utilities.FormatTime(createdAt) + "\n")
if status.Poll != nil {
displayPollContent(&builder, *status.Poll, noColor, "")
}
builder.WriteString(
"\n\n" +
utilities.FieldFormat(noColor, "ID:") + " " + statusID + "\t" +
utilities.FieldFormat(noColor, "Created at:") + " " + utilities.FormatTime(createdAt) +
"\n",
)
builder.WriteString(separator + "\n") builder.WriteString(separator + "\n")
} }
return builder.String() return builder.String()
} }
func displayPollContent(writer io.StringWriter, poll Poll, noColor bool, indent string) {
for ind, option := range poll.Options {
var percentage int
if poll.VotesCount == 0 {
percentage = 0
} else {
calculate := math.Floor(100 * (float64(option.VotesCount) / float64(poll.VotesCount)))
percentage = int(calculate)
}
writer.WriteString(
"\n\n" + indent + "[" + strconv.Itoa(ind) + "] " + option.Title +
"\n" + indent + strings.Repeat("\u2584", 80) +
"\n" + indent + strconv.Itoa(option.VotesCount) + " votes " +
"(" + strconv.Itoa(percentage) + "%)",
)
}
writer.WriteString("\n\n" + indent + utilities.FieldFormat(noColor, "Total votes:") + " " + strconv.Itoa(poll.VotesCount))
writer.WriteString("\n" + indent + utilities.FieldFormat(noColor, "Poll open until:") + " " + utilities.FormatTime(poll.ExpiredAt))
}