|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"log"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/rivo/tview"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func NewStatusText(app *App, view *tview.TextView, controls *Controls, lo *LinkOverlay) *StatusText {
|
|
|
|
|
return &StatusText{
|
|
|
|
|
app: app,
|
|
|
|
|
Index: 0,
|
|
|
|
|
View: view,
|
|
|
|
|
Controls: controls,
|
|
|
|
|
LinkOverlay: lo,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type StatusText struct {
|
|
|
|
|
app *App
|
|
|
|
|
Index int
|
|
|
|
|
View *tview.TextView
|
|
|
|
|
Controls *Controls
|
|
|
|
|
LinkOverlay *LinkOverlay
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *StatusText) ShowToot(index int) {
|
|
|
|
|
s.ShowTootOptions(index, false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *StatusText) ShowTootOptions(index int, showSensitive bool) {
|
|
|
|
|
status, err := s.app.UI.TootList.GetStatus(index)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatalln(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var line string
|
|
|
|
|
_, _, width, _ := s.View.GetInnerRect()
|
|
|
|
|
for i := 0; i < width; i++ {
|
|
|
|
|
line += "-"
|
|
|
|
|
}
|
|
|
|
|
line += "\n"
|
|
|
|
|
|
|
|
|
|
shouldDisplay := !status.Sensitive || showSensitive
|
|
|
|
|
|
|
|
|
|
var stripped string
|
|
|
|
|
var urls []URL
|
|
|
|
|
var u []URL
|
|
|
|
|
if status.Sensitive && !showSensitive {
|
|
|
|
|
stripped, u = cleanTootHTML(status.SpoilerText)
|
|
|
|
|
urls = append(urls, u...)
|
|
|
|
|
stripped += "\n" + line
|
|
|
|
|
stripped += "Press [s] to show hidden text"
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
stripped, u = cleanTootHTML(status.Content)
|
|
|
|
|
urls = append(urls, u...)
|
|
|
|
|
|
|
|
|
|
if status.Sensitive {
|
|
|
|
|
sens, u := cleanTootHTML(status.SpoilerText)
|
|
|
|
|
urls = append(urls, u...)
|
|
|
|
|
stripped = sens + "\n\n" + stripped
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
s.LinkOverlay.SetURLs(urls)
|
|
|
|
|
|
|
|
|
|
subtleColor := fmt.Sprintf("[#%x]", s.app.Config.Style.Subtle.Hex())
|
|
|
|
|
special1 := fmt.Sprintf("[#%x]", s.app.Config.Style.TextSpecial1.Hex())
|
|
|
|
|
special2 := fmt.Sprintf("[#%x]", s.app.Config.Style.TextSpecial2.Hex())
|
|
|
|
|
var head string
|
|
|
|
|
if status.Reblog != nil {
|
|
|
|
|
if status.Account.DisplayName != "" {
|
|
|
|
|
head += fmt.Sprintf(subtleColor+"%s (%s)\n", status.Account.DisplayName, status.Account.Acct)
|
|
|
|
|
} else {
|
|
|
|
|
head += fmt.Sprintf(subtleColor+"%s\n", status.Account.Acct)
|
|
|
|
|
}
|
|
|
|
|
head += subtleColor + "Boosted\n"
|
|
|
|
|
head += subtleColor + line
|
|
|
|
|
status = status.Reblog
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if status.Account.DisplayName != "" {
|
|
|
|
|
head += fmt.Sprintf(special2+"%s\n", status.Account.DisplayName)
|
|
|
|
|
}
|
|
|
|
|
head += fmt.Sprintf(special1+"%s\n\n", status.Account.Acct)
|
|
|
|
|
output := head
|
|
|
|
|
content := tview.Escape(stripped)
|
|
|
|
|
if content != "" {
|
|
|
|
|
output += content + "\n\n"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var poll string
|
|
|
|
|
if status.Poll != nil {
|
|
|
|
|
poll += subtleColor + "Poll\n"
|
|
|
|
|
poll += subtleColor + line
|
|
|
|
|
poll += fmt.Sprintf("Number of votes: %d\n\n", status.Poll.VotesCount)
|
|
|
|
|
votes := float64(status.Poll.VotesCount)
|
|
|
|
|
for _, o := range status.Poll.Options {
|
|
|
|
|
res := 0.0
|
|
|
|
|
if votes != 0 {
|
|
|
|
|
res = float64(o.VotesCount) / votes * 100
|
|
|
|
|
}
|
|
|
|
|
poll += fmt.Sprintf("%s - %.2f%% (%d)\n", tview.Escape(o.Title), res, o.VotesCount)
|
|
|
|
|
}
|
|
|
|
|
poll += "\n"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var media string
|
|
|
|
|
for _, att := range status.MediaAttachments {
|
|
|
|
|
media += subtleColor + line
|
|
|
|
|
media += fmt.Sprintf(subtleColor+"Attached %s\n", att.Type)
|
|
|
|
|
media += fmt.Sprintf("%s\n", att.URL)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var card string
|
|
|
|
|
if status.Card != nil {
|
|
|
|
|
card += subtleColor + "Card type: " + status.Card.Type + "\n"
|
|
|
|
|
card += subtleColor + line
|
|
|
|
|
if status.Card.Title != "" {
|
|
|
|
|
card += status.Card.Title + "\n\n"
|
|
|
|
|
}
|
|
|
|
|
desc := strings.TrimSpace(status.Card.Description)
|
|
|
|
|
if desc != "" {
|
|
|
|
|
card += desc + "\n\n"
|
|
|
|
|
}
|
|
|
|
|
card += status.Card.URL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if shouldDisplay {
|
|
|
|
|
output += poll + media + card
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.View.SetText(output)
|
|
|
|
|
s.View.ScrollToBeginning()
|
|
|
|
|
var info []string
|
|
|
|
|
if status.Favourited == true {
|
|
|
|
|
info = append(info, "Un[F]avorite")
|
|
|
|
|
} else {
|
|
|
|
|
info = append(info, "[F]avorite")
|
|
|
|
|
}
|
|
|
|
|
if status.Reblogged == true {
|
|
|
|
|
info = append(info, "Un[B]oost")
|
|
|
|
|
} else {
|
|
|
|
|
info = append(info, "[B]oost")
|
|
|
|
|
}
|
|
|
|
|
info = append(info, "[T]hread", "[R]eply", "[V]iew")
|
|
|
|
|
if len(status.MediaAttachments) > 0 {
|
|
|
|
|
info = append(info, "[M]edia")
|
|
|
|
|
}
|
|
|
|
|
if len(urls) > 0 {
|
|
|
|
|
info = append(info, "[O]pen")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if status.Account.ID == s.app.Me.ID {
|
|
|
|
|
info = append(info, "[D]elete")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.Controls.View.SetText(tview.Escape(strings.Join(info, " ")))
|
|
|
|
|
}
|