diff --git a/internal/model/status.go b/internal/model/status.go index 7fa3597..f8e116a 100644 --- a/internal/model/status.go +++ b/internal/model/status.go @@ -5,6 +5,8 @@ package model import ( + "io" + "math" "strconv" "strings" "time" @@ -158,6 +160,8 @@ type MediaDimensions struct { } func (s Status) Display(noColor bool) string { + indent := " " + var builder strings.Builder // 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 s.Poll != nil { - for ind, option := range s.Poll.Options { - builder.WriteString( - "\n\n " + strconv.Itoa(ind) + ". " + option.Title + - "\n " + strings.Repeat("\u2580", 80) + - "\n " + strconv.Itoa(option.VotesCount) + " votes", - ) - } - builder.WriteString("\n") + displayPollContent(&builder, *s.Poll, noColor, indent) } // 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 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 - 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 builder.WriteString( "\n\n" + utilities.HeaderFormat(noColor, "STATS:") + - "\n " + utilities.FieldFormat(noColor, "Boosts: ") + strconv.Itoa(s.ReblogsCount) + - "\n " + utilities.FieldFormat(noColor, "Likes: ") + strconv.Itoa(s.FavouritesCount) + - "\n " + utilities.FieldFormat(noColor, "Replies: ") + strconv.Itoa(s.RepliesCount), + "\n" + indent + utilities.FieldFormat(noColor, "Boosts: ") + strconv.Itoa(s.ReblogsCount) + + "\n" + indent + utilities.FieldFormat(noColor, "Likes: ") + strconv.Itoa(s.FavouritesCount) + + "\n" + indent + utilities.FieldFormat(noColor, "Replies: ") + strconv.Itoa(s.RepliesCount), ) // 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 - 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() } @@ -232,10 +229,44 @@ func (s StatusList) Display(noColor bool) string { createdAt = status.Reblog.CreatedAt } - builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", 80) + "\n\n") - builder.WriteString(utilities.FieldFormat(noColor, "ID:") + " " + statusID + "\t" + utilities.FieldFormat(noColor, "Created at:") + " " + utilities.FormatTime(createdAt) + "\n") + builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", 80)) + + 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") } 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)) +}