the printer is complete
This commit is contained in:
parent
1180de5114
commit
a7ad37c559
9 changed files with 87 additions and 190 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
|
@ -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())
|
|
||||||
}
|
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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")
|
|
||||||
}
|
|
|
@ -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)")
|
|
||||||
}
|
|
Loading…
Reference in a new issue