import (
"fmt"
+ "os"
+ "strings"
+ "text/tabwriter"
"git.vexingworkshop.com/signal9/dead-tooter/pkg/mastodon"
"github.com/spf13/cobra"
Run: func(cmd *cobra.Command, args []string) {
err := account.VerifyCredentials(host, token)
if err != nil {
- panic(err.Error())
+ fmt.Printf("Error verifying credentials: %s", err.Error())
+ return
}
if len(args) < 1 {
if err != nil {
panic(err.Error())
}
+
+ w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0)
for _, value := range followers {
- fmt.Printf("%s\t%s\n", value.ID, value.Acct)
+ fmt.Fprintln(w, strings.Join([]string{value.ID, value.Acct}, "\t"))
}
+ w.Flush()
},
}
if err != nil {
panic(err.Error())
}
+
+ w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0)
for _, value := range following {
- fmt.Printf("%s\t%s\n", value.ID, value.Acct)
+ fmt.Fprintln(w, strings.Join([]string{value.ID, value.Acct}, "\t"))
}
+ w.Flush()
},
}
// Authorize opens the default browser to initiate the authorization flow
// for the current user.
-func (a *Account) Authorize(host string, app Application) (code string) {
+func (a *Account) Authorize(host string, app Application) (code string, err error) {
v := url.Values{}
v.Set("client_id", app.ClientID)
v.Set("response_type", "code")
}
u.Scheme = "https"
- err := exec.Command("xdg-open", u.String()).Start()
+ err = exec.Command("xdg-open", u.String()).Start()
if err != nil {
- return
+ return code, err
}
fmt.Print("Enter returned code: ")
_, err = fmt.Scanln(&code)
if err != nil {
- return
+ return code, err
}
- return
+ return code, err
}
// RequestToken takes the provided authorization code and returns a structure
resp, err := http.PostForm(u.String(), v)
if err != nil {
- return
+ return token, err
}
if resp.StatusCode != 200 {
err = errors.New(resp.Status)
- return
+ return token, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
- return
+ return token, err
}
err = json.Unmarshal(body, &token)
if err != nil {
- return
+ return token, err
}
- return
+ return token, err
}
// VerifyCredentials hydrates the account object by validating the bearer token
// against the Mastodon API
func (a *Account) VerifyCredentials(host string, token Token) (err error) {
- client := &http.Client{}
-
u := url.URL{
Host: host,
Path: "api/v1/accounts/verify_credentials",
}
u.Scheme = "https"
- req, err := http.NewRequest("GET", u.String(), nil)
- if err != nil {
- return
- }
- req.Header.Add("Authorization", "Bearer "+token.AccessToken)
-
- resp, err := client.Do(req)
- if err != nil {
- return
- }
- if resp.StatusCode != 200 {
- err = errors.New(resp.Status)
- return
- }
- defer resp.Body.Close()
-
- body, err := io.ReadAll(resp.Body)
+ body, err := Get(u, host, token)
if err != nil {
- return
+ return err
}
err = json.Unmarshal(body, a)
if err != nil {
- return
+ return err
}
- return
+ return err
}
// Get returns the details of account specified by ID.
func (a *Account) Get(
ID string, host string, token Token) (account Account, err error) {
- client := &http.Client{}
-
id := url.PathEscape(ID)
path, err := url.JoinPath("api/v1/accounts", id)
if err != nil {
- return
+ return account, err
}
u := url.URL{
}
u.Scheme = "https"
- req, err := http.NewRequest("GET", u.String(), nil)
- if err != nil {
- return
- }
- req.Header.Add("Authorization", "Bearer "+token.AccessToken)
-
- resp, err := client.Do(req)
- if err != nil {
- return
- }
- if resp.StatusCode != 200 {
- err = errors.New(resp.Status)
- return
- }
- defer resp.Body.Close()
-
- body, err := io.ReadAll(resp.Body)
+ body, err := Get(u, host, token)
if err != nil {
- return
+ return account, err
}
err = json.Unmarshal(body, &account)
if err != nil {
- return
+ return account, err
}
- return
+ return account, err
}
// GetFollowers returns a list of all accounts following the logged in user
func (a *Account) GetFollowers(
host string, token Token) (followers []Account, err error) {
- client := &http.Client{}
-
id := url.PathEscape(a.ID)
path, err := url.JoinPath("api/v1/accounts", id, "followers")
if err != nil {
- return
+ return followers, err
}
u := url.URL{
}
u.Scheme = "https"
- req, err := http.NewRequest("GET", u.String(), nil)
- if err != nil {
- return
- }
- req.Header.Add("Authorization", "Bearer "+token.AccessToken)
-
- resp, err := client.Do(req)
- if err != nil {
- return
- }
- if resp.StatusCode != 200 {
- err = errors.New(resp.Status)
- return
- }
- defer resp.Body.Close()
-
- body, err := io.ReadAll(resp.Body)
+ body, err := Get(u, host, token)
if err != nil {
- return
+ return followers, err
}
err = json.Unmarshal(body, &followers)
if err != nil {
- return
+ return followers, err
}
- return
+ return followers, err
}
// GetFollowing returns a list of all accounts followed by the logged in user
id := url.PathEscape(a.ID)
path, err := url.JoinPath("api/v1/accounts", id, "following")
if err != nil {
- return
+ return following, err
}
u := url.URL{
req, err := http.NewRequest("GET", u.String(), nil)
if err != nil {
- return
+ return following, err
}
req.Header.Add("Authorization", "Bearer "+token.AccessToken)
resp, err := client.Do(req)
if err != nil {
- return
+ return following, err
}
if resp.StatusCode != 200 {
err = errors.New(resp.Status)
- return
+ return following, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
- return
+ return following, err
}
err = json.Unmarshal(body, &following)
if err != nil {
- return
+ return following, err
}
- return
+ return following, err
}