the printer is complete

This commit is contained in:
Dan Anglin 2024-06-17 02:34:35 +01:00
parent 1180de5114
commit a7ad37c559
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
9 changed files with 87 additions and 190 deletions

View file

@ -39,21 +39,27 @@ func (g *Client) GetAccount(accountURI string) (model.Account, error) {
return account, nil return account, nil
} }
func (g *Client) GetAccountRelationship(accountID string) (model.AccountRelationship, error) { func (g *Client) GetAccountRelationship(accountID string) (*model.AccountRelationship, error) {
path := "/api/v1/accounts/relationships?id=" + accountID path := "/api/v1/accounts/relationships?id=" + accountID
url := g.Authentication.Instance + path url := g.Authentication.Instance + path
var relationships []model.AccountRelationship var relationships []model.AccountRelationship
if err := g.sendRequest(http.MethodGet, url, nil, &relationships); err != nil { if err := g.sendRequest(http.MethodGet, url, nil, &relationships); err != nil {
return model.AccountRelationship{}, fmt.Errorf("received an error after sending the request to get the account relationship: %w", err) return nil, fmt.Errorf(
"received an error after sending the request to get the account relationship: %w",
err,
)
} }
if len(relationships) != 1 { if len(relationships) != 1 {
return model.AccountRelationship{}, fmt.Errorf("unexpected number of account relationships returned: want 1, got %d", len(relationships)) return nil, fmt.Errorf(
"unexpected number of account relationships returned: want 1, got %d",
len(relationships),
)
} }
return relationships[0], nil return &relationships[0], nil
} }
type FollowAccountForm struct { type FollowAccountForm struct {

View file

@ -11,14 +11,14 @@ import (
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
) )
func (g *Client) GetUserPreferences() (model.Preferences, error) { func (g *Client) GetUserPreferences() (*model.Preferences, error) {
url := g.Authentication.Instance + "/api/v1/preferences" url := g.Authentication.Instance + "/api/v1/preferences"
var preferences model.Preferences var preferences model.Preferences
if err := g.sendRequest(http.MethodGet, url, nil, &preferences); err != nil { if err := g.sendRequest(http.MethodGet, url, nil, &preferences); err != nil {
return model.Preferences{}, fmt.Errorf("received an error after sending the request to get the user preferences: %w", err) return nil, fmt.Errorf("received an error after sending the request to get the user preferences: %w", err)
} }
return preferences, nil return &preferences, nil
} }

View file

@ -132,26 +132,27 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error {
return nil return nil
} }
s.printer.PrintAccount(account) var (
relationship *model.AccountRelationship = nil
preferences *model.Preferences = nil
)
if !s.myAccount && !s.skipAccountRelationship { if !s.myAccount && !s.skipAccountRelationship {
relationship, err := gtsClient.GetAccountRelationship(account.ID) relationship, err = gtsClient.GetAccountRelationship(account.ID)
if err != nil { if err != nil {
return fmt.Errorf("unable to retrieve the relationship to this account: %w", err) return fmt.Errorf("unable to retrieve the relationship to this account: %w", err)
} }
s.printer.PrintAccountRelationship(relationship)
} }
if s.myAccount && s.showUserPreferences { if s.myAccount && s.showUserPreferences {
preferences, err := gtsClient.GetUserPreferences() preferences, err = gtsClient.GetUserPreferences()
if err != nil { if err != nil {
return fmt.Errorf("unable to retrieve the user preferences: %w", err) return fmt.Errorf("unable to retrieve the user preferences: %w", err)
} }
utilities.Display(preferences, false, "")
} }
s.printer.PrintAccount(account, relationship, preferences)
return nil return nil
} }

View file

@ -4,12 +4,6 @@
package model package model
import (
"fmt"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
)
type Preferences struct { type Preferences struct {
PostingDefaultVisibility string `json:"posting:default:visibility"` PostingDefaultVisibility string `json:"posting:default:visibility"`
PostingDefaultSensitive bool `json:"posting:default:sensitive"` PostingDefaultSensitive bool `json:"posting:default:sensitive"`
@ -18,19 +12,3 @@ type Preferences struct {
ReadingExpandSpoilers bool `json:"reading:expand:spoilers"` ReadingExpandSpoilers bool `json:"reading:expand:spoilers"`
ReadingAutoplayGifs bool `json:"reading:autoplay:gifs"` ReadingAutoplayGifs bool `json:"reading:autoplay:gifs"`
} }
func (p Preferences) Display(noColor bool) string {
format := `
%s
%s: %s
%s: %s
%s: %t`
return fmt.Sprintf(
format,
utilities.HeaderFormat(noColor, "YOUR PREFERENCES:"),
utilities.FieldFormat(noColor, "Default post language"), p.PostingDefaultLanguage,
utilities.FieldFormat(noColor, "Default post visibility"), p.PostingDefaultVisibility,
utilities.FieldFormat(noColor, "Mark posts as sensitive by default"), p.PostingDefaultSensitive,
)
}

View file

@ -8,7 +8,7 @@ import (
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities" "codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (p Printer) PrintAccount(account model.Account) { func (p Printer) PrintAccount(account model.Account, relationship *model.AccountRelationship, preferences *model.Preferences) {
var builder strings.Builder var builder strings.Builder
builder.WriteString("\n" + p.fullDisplayNameFormat(account.DisplayName, account.Acct)) builder.WriteString("\n" + p.fullDisplayNameFormat(account.DisplayName, account.Acct))
@ -32,11 +32,73 @@ func (p Printer) PrintAccount(account model.Account) {
} }
builder.WriteString("\n\n" + p.headerFormat("ACCOUNT URL:")) builder.WriteString("\n\n" + p.headerFormat("ACCOUNT URL:"))
builder.WriteString("\n" + account.URL + "\n") builder.WriteString("\n" + account.URL)
if relationship != nil {
builder.WriteString(p.accountRelationship(relationship))
}
if preferences != nil {
builder.WriteString(p.userPreferences(preferences))
}
builder.WriteString("\n\n")
printToStdout(builder.String()) printToStdout(builder.String())
} }
func (p Printer) accountRelationship(relationship *model.AccountRelationship) string {
var builder strings.Builder
builder.WriteString("\n\n" + p.headerFormat("YOUR RELATIONSHIP WITH THIS ACCOUNT:"))
builder.WriteString("\n" + p.fieldFormat("Following:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Following))
builder.WriteString("\n" + p.fieldFormat("Is following you:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowedBy))
builder.WriteString("\n" + p.fieldFormat("A follow request was sent and is pending:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowRequested))
builder.WriteString("\n" + p.fieldFormat("Received a pending follow request:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowRequestedBy))
builder.WriteString("\n" + p.fieldFormat("Endorsed:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Endorsed))
builder.WriteString("\n" + p.fieldFormat("Showing Reposts (boosts):"))
builder.WriteString(" " + strconv.FormatBool(relationship.ShowingReblogs))
builder.WriteString("\n" + p.fieldFormat("Muted:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Muting))
builder.WriteString("\n" + p.fieldFormat("Notifications muted:"))
builder.WriteString(" " + strconv.FormatBool(relationship.MutingNotifications))
builder.WriteString("\n" + p.fieldFormat("Blocking:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Blocking))
builder.WriteString("\n" + p.fieldFormat("Is blocking you:"))
builder.WriteString(" " + strconv.FormatBool(relationship.BlockedBy))
builder.WriteString("\n" + p.fieldFormat("Blocking account's domain:"))
builder.WriteString(" " + strconv.FormatBool(relationship.DomainBlocking))
if relationship.PrivateNote != "" {
builder.WriteString("\n\n" + p.headerFormat("YOUR PRIVATE NOTE ABOUT THIS ACCOUNT:"))
builder.WriteString("\n" + utilities.WrapLines(relationship.PrivateNote, "\n", p.maxTerminalWidth))
}
return builder.String()
}
func (p Printer) userPreferences(preferences *model.Preferences) string {
var builder strings.Builder
builder.WriteString("\n\n" + p.headerFormat("YOUR PREFERENCES:"))
builder.WriteString("\n" + p.fieldFormat("Default post language:"))
builder.WriteString(" " + preferences.PostingDefaultLanguage)
builder.WriteString("\n" + p.fieldFormat("Default post visibility:"))
builder.WriteString(" " + preferences.PostingDefaultVisibility)
builder.WriteString("\n" + p.fieldFormat("Mark posts as sensitive by default:"))
builder.WriteString(" " + strconv.FormatBool(preferences.PostingDefaultSensitive))
return builder.String()
}
func (p Printer) PrintAccountList(list model.AccountList) { func (p Printer) PrintAccountList(list model.AccountList) {
var builder strings.Builder var builder strings.Builder
@ -69,40 +131,3 @@ func (p Printer) PrintAccountList(list model.AccountList) {
printToStdout(builder.String()) printToStdout(builder.String())
} }
func (p Printer) PrintAccountRelationship(relationship model.AccountRelationship) {
var builder strings.Builder
builder.WriteString("\n" + p.headerFormat("YOUR RELATIONSHIP WITH THIS ACCOUNT:"))
builder.WriteString("\n" + p.fieldFormat("Following:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Following))
builder.WriteString("\n" + p.fieldFormat("Is following you:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowedBy))
builder.WriteString("\n" + p.fieldFormat("A follow request was sent and is pending:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowRequested))
builder.WriteString("\n" + p.fieldFormat("Received a pending follow request:"))
builder.WriteString(" " + strconv.FormatBool(relationship.FollowRequestedBy))
builder.WriteString("\n" + p.fieldFormat("Endorsed:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Endorsed))
builder.WriteString("\n" + p.fieldFormat("Showing Reposts (boosts):"))
builder.WriteString(" " + strconv.FormatBool(relationship.ShowingReblogs))
builder.WriteString("\n" + p.fieldFormat("Muted:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Muting))
builder.WriteString("\n" + p.fieldFormat("Notifications muted:"))
builder.WriteString(" " + strconv.FormatBool(relationship.MutingNotifications))
builder.WriteString("\n" + p.fieldFormat("Blocking:"))
builder.WriteString(" " + strconv.FormatBool(relationship.Blocking))
builder.WriteString("\n" + p.fieldFormat("Is blocking you:"))
builder.WriteString(" " + strconv.FormatBool(relationship.BlockedBy))
builder.WriteString("\n" + p.fieldFormat("Blocking account's domain:"))
builder.WriteString(" " + strconv.FormatBool(relationship.DomainBlocking))
if relationship.PrivateNote != "" {
builder.WriteString("\n\n" + p.headerFormat("YOUR PRIVATE NOTE ABOUT THIS ACCOUNT:"))
builder.WriteString("\n" + utilities.WrapLines(relationship.PrivateNote, "\n", p.maxTerminalWidth))
}
builder.WriteString("\n\n")
printToStdout(builder.String())
}

View file

@ -6,7 +6,6 @@ import (
"strings" "strings"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (p Printer) PrintPoll(poll model.Poll) { func (p Printer) PrintPoll(poll model.Poll) {
@ -62,7 +61,7 @@ func (p Printer) pollOptions(poll model.Poll) string {
builder.WriteString("\n\n" + p.fieldFormat("Total votes:") + " " + strconv.Itoa(poll.VotesCount)) builder.WriteString("\n\n" + p.fieldFormat("Total votes:") + " " + strconv.Itoa(poll.VotesCount))
builder.WriteString("\n" + p.fieldFormat("Poll ID:") + " " + poll.ID) builder.WriteString("\n" + p.fieldFormat("Poll ID:") + " " + poll.ID)
builder.WriteString("\n" + p.fieldFormat("Poll is open until:") + " " + utilities.FormatTime(poll.ExpiredAt)) builder.WriteString("\n" + p.fieldFormat("Poll is open until:") + " " + p.formatDateTime(poll.ExpiredAt))
return builder.String() return builder.String()
} }

View file

@ -82,7 +82,7 @@ func (p Printer) PrintStatusList(list model.StatusList) {
builder.WriteString( builder.WriteString(
"\n\n" + "\n\n" +
p.fieldFormat("Status ID:") + " " + statusID + "\t" + p.fieldFormat("Status ID:") + " " + statusID + "\t" +
p.fieldFormat("Created at:") + " " + utilities.FormatTime(createdAt) + p.fieldFormat("Created at:") + " " + p.formatDateTime(createdAt) +
"\n", "\n",
) )

View file

@ -1,53 +0,0 @@
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later
package utilities
import (
"fmt"
"os"
"os/exec"
"strings"
)
type Displayer interface {
Display(noColor bool) string
}
func Display(displayer Displayer, noColor bool, pagerCommand string) {
if pagerCommand == "" {
os.Stdout.WriteString(displayer.Display(noColor) + "\n")
return
}
split := strings.Split(pagerCommand, " ")
pager := new(exec.Cmd)
if len(split) == 1 {
pager = exec.Command(split[0]) //nolint:gosec
} else {
pager = exec.Command(split[0], split[1:]...) //nolint:gosec
}
pipe, err := pager.StdinPipe()
if err != nil {
os.Stdout.WriteString(displayer.Display(noColor) + "\n")
return
}
pager.Stdout = os.Stdout
pager.Stderr = os.Stderr
_ = pager.Start()
defer func() {
_ = pipe.Close()
_ = pager.Wait()
}()
fmt.Fprintln(pipe, displayer.Display(noColor)+"\n")
}

View file

@ -1,59 +0,0 @@
// SPDX-FileCopyrightText: 2024 Dan Anglin <d.n.i.anglin@gmail.com>
//
// SPDX-License-Identifier: GPL-3.0-or-later
package utilities
import (
"regexp"
"strings"
"time"
)
const (
reset = "\033[0m"
boldblue = "\033[34;1m"
boldmagenta = "\033[35;1m"
green = "\033[32m"
)
func HeaderFormat(noColor bool, text string) string {
if noColor {
return text
}
return boldblue + text + reset
}
func FieldFormat(noColor bool, text string) string {
if noColor {
return text
}
return green + text + reset
}
func FullDisplayNameFormat(noColor bool, displayName, acct string) string {
// use this pattern to remove all emoji strings
pattern := regexp.MustCompile(`\s:[A-Za-z0-9_]*:`)
var builder strings.Builder
if noColor {
builder.WriteString(pattern.ReplaceAllString(displayName, ""))
} else {
builder.WriteString(boldmagenta + pattern.ReplaceAllString(displayName, "") + reset)
}
builder.WriteString(" (@" + acct + ")")
return builder.String()
}
func FormatDate(date time.Time) string {
return date.Local().Format("02 Jan 2006")
}
func FormatTime(date time.Time) string {
return date.Local().Format("02 Jan 2006, 15:04 (MST)")
}