Compare commits

...

2 commits

Author SHA1 Message Date
3e47dea9ba
add support for showing statuses from an account 2024-07-10 13:52:11 +01:00
c468d1fb62
refactor: create constant values for base paths
Created constant values for the Accounts and Follow Requests base API
paths.
2024-07-10 12:06:36 +01:00
5 changed files with 111 additions and 23 deletions

View file

@ -13,9 +13,13 @@ import (
"codeflow.dananglin.me.uk/apollo/enbas/internal/model"
)
const (
baseAccountsPath = "/api/v1/accounts"
baseFollowRequestsPath = "/api/v1/follow_requests"
)
func (g *Client) VerifyCredentials() (model.Account, error) {
path := "/api/v1/accounts/verify_credentials"
url := g.Authentication.Instance + path
url := g.Authentication.Instance + baseAccountsPath + "/verify_credentials"
var account model.Account
@ -27,8 +31,7 @@ func (g *Client) VerifyCredentials() (model.Account, error) {
}
func (g *Client) GetAccount(accountURI string) (model.Account, error) {
path := "/api/v1/accounts/lookup?acct=" + accountURI
url := g.Authentication.Instance + path
url := g.Authentication.Instance + baseAccountsPath + "/lookup?acct=" + accountURI
var account model.Account
@ -40,8 +43,7 @@ func (g *Client) GetAccount(accountURI string) (model.Account, error) {
}
func (g *Client) GetAccountRelationship(accountID string) (*model.AccountRelationship, error) {
path := "/api/v1/accounts/relationships?id=" + accountID
url := g.Authentication.Instance + path
url := g.Authentication.Instance + baseAccountsPath + "/relationships?id=" + accountID
var relationships []model.AccountRelationship
@ -75,7 +77,7 @@ func (g *Client) FollowAccount(form FollowAccountForm) error {
}
requestBody := bytes.NewBuffer(data)
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/follow", form.AccountID)
url := g.Authentication.Instance + baseAccountsPath + "/" + form.AccountID + "/follow"
if err := g.sendRequest(http.MethodPost, url, requestBody, nil); err != nil {
return fmt.Errorf("received an error after sending the follow request: %w", err)
@ -85,7 +87,7 @@ func (g *Client) FollowAccount(form FollowAccountForm) error {
}
func (g *Client) UnfollowAccount(accountID string) error {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/unfollow", accountID)
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/unfollow"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to unfollow the account: %w", err)
@ -95,7 +97,7 @@ func (g *Client) UnfollowAccount(accountID string) error {
}
func (g *Client) GetFollowers(accountID string, limit int) (model.AccountList, error) {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/followers?limit=%d", accountID, limit)
url := g.Authentication.Instance + fmt.Sprintf("%s/%s/followers?limit=%d", baseAccountsPath, accountID, limit)
accounts := make([]model.Account, limit)
@ -112,7 +114,7 @@ func (g *Client) GetFollowers(accountID string, limit int) (model.AccountList, e
}
func (g *Client) GetFollowing(accountID string, limit int) (model.AccountList, error) {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/following?limit=%d", accountID, limit)
url := g.Authentication.Instance + fmt.Sprintf("%s/%s/following?limit=%d", baseAccountsPath, accountID, limit)
accounts := make([]model.Account, limit)
@ -129,7 +131,7 @@ func (g *Client) GetFollowing(accountID string, limit int) (model.AccountList, e
}
func (g *Client) BlockAccount(accountID string) error {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/block", accountID)
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/block"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to block the account: %w", err)
@ -139,7 +141,7 @@ func (g *Client) BlockAccount(accountID string) error {
}
func (g *Client) UnblockAccount(accountID string) error {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/unblock", accountID)
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/unblock"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to unblock the account: %w", err)
@ -178,7 +180,7 @@ func (g *Client) SetPrivateNote(accountID, note string) error {
}
requestBody := bytes.NewBuffer(data)
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/accounts/%s/note", accountID)
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/note"
if err := g.sendRequest(http.MethodPost, url, requestBody, nil); err != nil {
return fmt.Errorf("received an error after sending the request to set the private note: %w", err)
@ -188,7 +190,7 @@ func (g *Client) SetPrivateNote(accountID, note string) error {
}
func (g *Client) GetFollowRequests(limit int) (model.AccountList, error) {
url := g.Authentication.Instance + fmt.Sprintf("/api/v1/follow_requests?limit=%d", limit)
url := g.Authentication.Instance + fmt.Sprintf("%s?limit=%d", baseFollowRequestsPath, limit)
var accounts []model.Account
@ -205,7 +207,7 @@ func (g *Client) GetFollowRequests(limit int) (model.AccountList, error) {
}
func (g *Client) AcceptFollowRequest(accountID string) error {
url := g.Authentication.Instance + "/api/v1/follow_requests/" + accountID + "/authorize"
url := g.Authentication.Instance + baseFollowRequestsPath + "/" + accountID + "/authorize"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to accept the follow request: %w", err)
@ -215,7 +217,7 @@ func (g *Client) AcceptFollowRequest(accountID string) error {
}
func (g *Client) RejectFollowRequest(accountID string) error {
url := g.Authentication.Instance + "/api/v1/follow_requests/" + accountID + "/reject"
url := g.Authentication.Instance + baseFollowRequestsPath + "/" + accountID + "/reject"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to reject the follow request: %w", err)
@ -253,7 +255,7 @@ func (g *Client) MuteAccount(accountID string, form MuteAccountForm) error {
}
requestBody := bytes.NewBuffer(data)
url := g.Authentication.Instance + "/api/v1/accounts/" + accountID + "/mute"
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/mute"
if err := g.sendRequest(http.MethodPost, url, requestBody, nil); err != nil {
return fmt.Errorf("received an error after sending the request to mute the account: %w", err)
@ -263,7 +265,7 @@ func (g *Client) MuteAccount(accountID string, form MuteAccountForm) error {
}
func (g *Client) UnmuteAccount(accountID string) error {
url := g.Authentication.Instance + "/api/v1/accounts/" + accountID + "/unmute"
url := g.Authentication.Instance + baseAccountsPath + "/" + accountID + "/unmute"
if err := g.sendRequest(http.MethodPost, url, nil, nil); err != nil {
return fmt.Errorf("received an error after sending the request to unmute the account: %w", err)
@ -271,3 +273,40 @@ func (g *Client) UnmuteAccount(accountID string) error {
return nil
}
type GetAccountStatusesForm struct {
AccountID string
Limit int
ExcludeReplies bool
ExcludeReblogs bool
Pinned bool
OnlyMedia bool
OnlyPublic bool
}
func (g *Client) GetAccountStatuses(form GetAccountStatusesForm) (*model.StatusList, error) {
path := baseAccountsPath + "/" + form.AccountID + "/statuses"
query := fmt.Sprintf(
"?limit=%d&exclude_replies=%t&exclude_reblogs=%t&pinned=%t&only_media=%t&only_public=%t",
form.Limit,
form.ExcludeReplies,
form.ExcludeReblogs,
form.Pinned,
form.OnlyMedia,
form.OnlyPublic,
)
url := g.Authentication.Instance + path + query
var statuses []model.Status
if err := g.sendRequest(http.MethodGet, url, nil, &statuses); err != nil {
return nil, fmt.Errorf("received an error after sending the request to get the account's statuses: %w", err)
}
statusList := model.StatusList{
Name: "STATUSES:",
Statuses: statuses,
}
return &statusList, nil
}

View file

@ -22,6 +22,8 @@ const (
flagEnableLikes = "enable-likes"
flagEnableReplies = "enable-replies"
flagEnableReposts = "enable-reposts"
flagExcludeBoosts = "exclude-boosts"
flagExcludeReplies = "exclude-replies"
flagFrom = "from"
flagFromFile = "from-file"
flagFull = "full"
@ -36,6 +38,9 @@ const (
flagMuteDuration = "mute-duration"
flagMuteNotifications = "mute-notifications"
flagNotify = "notify"
flagOnlyMedia = "only-media"
flagOnlyPinned = "only-pinned"
flagOnlyPublic = "only-public"
flagPollAllowsMultipleChoices = "poll-allows-multiple-choices"
flagPollExpiresIn = "poll-expires-in"
flagPollHidesVoteCounts = "poll-hides-vote-counts"
@ -45,6 +50,7 @@ const (
flagSkipRelationship = "skip-relationship"
flagShowPreferences = "show-preferences"
flagShowReposts = "show-reposts"
flagShowStatuses = "show-statuses"
flagSpoilerText = "spoiler-text"
flagStatusID = "status-id"
flagTag = "tag"

View file

@ -23,9 +23,15 @@ type ShowExecutor struct {
printer *printer.Printer
config *config.Config
myAccount bool
skipAccountRelationship bool
showUserPreferences bool
excludeBoosts bool
excludeReplies bool
onlyMedia bool
onlyPinned bool
onlyPublic bool
showInBrowser bool
showUserPreferences bool
showStatuses bool
skipAccountRelationship bool
resourceType string
accountName string
statusID string
@ -50,6 +56,12 @@ func NewShowExecutor(printer *printer.Printer, config *config.Config, name, summ
showExe.BoolVar(&showExe.skipAccountRelationship, flagSkipRelationship, false, "Set to true to skip showing your relationship to the specified account")
showExe.BoolVar(&showExe.showUserPreferences, flagShowPreferences, false, "Show your preferences")
showExe.BoolVar(&showExe.showInBrowser, flagBrowser, false, "Set to true to view in the browser")
showExe.BoolVar(&showExe.showStatuses, flagShowStatuses, false, "Set to true to view the statuses created from the specified account")
showExe.BoolVar(&showExe.excludeReplies, flagExcludeReplies, false, "Set to true to exclude statuses that are a reply to another status")
showExe.BoolVar(&showExe.excludeBoosts, flagExcludeBoosts, false, "Set to true to exclude statuses that are boosts of another status")
showExe.BoolVar(&showExe.onlyPinned, flagOnlyPinned, false, "Set to true to show only the account's pinned statuses")
showExe.BoolVar(&showExe.onlyMedia, flagOnlyMedia, false, "Set to true to show only the statuses with media attachments")
showExe.BoolVar(&showExe.onlyPublic, flagOnlyPublic, false, "Set to true to show only the account's public posts")
showExe.StringVar(&showExe.resourceType, flagType, "", "Specify the type of resource to display")
showExe.StringVar(&showExe.accountName, flagAccountName, "", "Specify the account name in full (username@domain)")
showExe.StringVar(&showExe.statusID, flagStatusID, "", "Specify the ID of the status to display")
@ -147,6 +159,7 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error {
var (
relationship *model.AccountRelationship
preferences *model.Preferences
statuses *model.StatusList
)
if !s.myAccount && !s.skipAccountRelationship {
@ -163,7 +176,24 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error {
}
}
s.printer.PrintAccount(account, relationship, preferences)
if s.showStatuses {
form := client.GetAccountStatusesForm{
AccountID: account.ID,
Limit: s.limit,
ExcludeReplies: s.excludeReplies,
ExcludeReblogs: s.excludeBoosts,
Pinned: s.onlyPinned,
OnlyMedia: s.onlyMedia,
OnlyPublic: s.onlyPublic,
}
statuses, err = gtsClient.GetAccountStatuses(form)
if err != nil {
return fmt.Errorf("unable to retrieve the account's statuses: %w", err)
}
}
s.printer.PrintAccount(account, relationship, preferences, statuses)
return nil
}

View file

@ -11,7 +11,12 @@ import (
"codeflow.dananglin.me.uk/apollo/enbas/internal/model"
)
func (p Printer) PrintAccount(account model.Account, relationship *model.AccountRelationship, preferences *model.Preferences) {
func (p Printer) PrintAccount(
account model.Account,
relationship *model.AccountRelationship,
preferences *model.Preferences,
statuses *model.StatusList,
) {
var builder strings.Builder
builder.WriteString("\n" + p.fullDisplayNameFormat(account.DisplayName, account.Acct))
@ -45,6 +50,10 @@ func (p Printer) PrintAccount(account model.Account, relationship *model.Account
builder.WriteString(p.userPreferences(preferences))
}
if statuses != nil {
builder.WriteString("\n\n" + p.statusList(*statuses))
}
builder.WriteString("\n\n")
p.print(builder.String())

View file

@ -77,6 +77,10 @@ func (p Printer) PrintStatus(status model.Status) {
}
func (p Printer) PrintStatusList(list model.StatusList) {
p.print(p.statusList(list))
}
func (p Printer) statusList(list model.StatusList) string {
var builder strings.Builder
builder.WriteString(p.headerFormat(list.Name) + "\n")
@ -170,5 +174,5 @@ func (p Printer) PrintStatusList(list model.StatusList) {
builder.WriteString("\n" + p.statusSeparator + "\n")
}
p.print(builder.String())
return builder.String()
}