checkpoint: show poll in timelines
This commit is contained in:
parent
8e59ecf697
commit
b0ffd4fcec
1 changed files with 49 additions and 18 deletions
|
@ -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))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue