feat: add support for showing statuses from an account #37
6 changed files with 120 additions and 29 deletions
|
@ -17,8 +17,7 @@ SPDX-License-Identifier: CC-BY-4.0
|
|||
- [Switch between accounts](#switch-between-accounts)
|
||||
- [See the account that you are currently logged in as](#see-the-account-that-you-are-currently-logged-in-as)
|
||||
- [Accounts](#accounts)
|
||||
- [View your own account](#view-your-own-account)
|
||||
- [View an account](#view-an-account)
|
||||
- [View account information](#view-account-information)
|
||||
- [Follow an account](#follow-an-account)
|
||||
- [Unfollow an account](#unfollow-an-account)
|
||||
- [Show an account's followers](#show-an-accounts-followers)
|
||||
|
@ -135,35 +134,41 @@ enbas whoami
|
|||
|
||||
## Accounts
|
||||
|
||||
### View your own account
|
||||
|
||||
Prints the information from your own account.
|
||||
### View account information
|
||||
|
||||
- View information from your own account
|
||||
```
|
||||
enbas show --type account --my-account
|
||||
```
|
||||
|
||||
| flag | type | required | description | default |
|
||||
|------|------|----------|-------------|---------|
|
||||
| `type` | string | true | The resource you want to view. Here this should be `account`. | |
|
||||
| `my-account` | boolean | true | Use this flag to view your own account. | |
|
||||
| `show-preferences` | boolean | false | Show your posting preferences. | false |
|
||||
|
||||
### View an account
|
||||
|
||||
Prints the information of a local or a remote account.
|
||||
If the account is unknown by your instance a `404` message will be shown instead.
|
||||
|
||||
- View information from a local or remote account.
|
||||
```
|
||||
enbas show --type account --account-name @name@example.social
|
||||
```
|
||||
- View an account and show the public statuses that it has created.
|
||||
```
|
||||
enbas show --type account --account-name @name@example.social --show-statuses --only-public
|
||||
```
|
||||
|
||||
| flag | type | required | description | default |
|
||||
|------|------|----------|-------------|---------|
|
||||
| `type` | string | true | The resource you want to view. Here this should be `account`. | |
|
||||
| `account-name` | string | true | The name of the account to view. | |
|
||||
| `my-account` | boolean | true | Set to `true` to view your own account. | |
|
||||
| `show-preferences` | boolean | false | Show your posting preferences. Only applicable with the `my-account` flag. | false |
|
||||
| `account-name` | string | false | The name of the account to view. This is not required with the `my-account` flag. | |
|
||||
| `skip-relationship` | boolean | false | Set to `true` to skip viewing your relationship to the account you are viewing (including the private note if you've created one). | false |
|
||||
|
||||
Additional flags for viewing an account's statuses.
|
||||
|
||||
| flag | type | required | description | default |
|
||||
|------|------|----------|-------------|---------|
|
||||
| `show-statuses` | bool | false | Set to `true` to view the statuses created from this account. | false |
|
||||
| `limit` | integer | false | The maximum amount of statuses to show from this account. | 20 |
|
||||
| `exclude-replies` | bool | false | Set to `true` to exclude replies. | false |
|
||||
| `exclude-boosts` | bool | false | Set to `true` to exclude boosts. | false |
|
||||
| `only-pinned` | bool | false | Set to `true` to view only pinned statuses. | false |
|
||||
| `only-media` | bool | false | Set to `true` to view only statuses with media attachments. | false |
|
||||
| `only-public` | bool | false | Set to `true` to view only public statuses. | false |
|
||||
|
||||
### Follow an account
|
||||
|
||||
Sends a follow request to the account you want to follow.
|
||||
|
|
|
@ -273,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
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue