Initial commit
[bloat] / mastodon / lists.go
1 package mastodon
2
3 import (
4         "context"
5         "fmt"
6         "net/http"
7         "net/url"
8 )
9
10 // List is metadata for a list of users.
11 type List struct {
12         ID    string `json:"id"`
13         Title string `json:"title"`
14 }
15
16 // GetLists returns all the lists on the current account.
17 func (c *Client) GetLists(ctx context.Context) ([]*List, error) {
18         var lists []*List
19         err := c.doAPI(ctx, http.MethodGet, "/api/v1/lists", nil, &lists, nil)
20         if err != nil {
21                 return nil, err
22         }
23         return lists, nil
24 }
25
26 // GetAccountLists returns the lists containing a given account.
27 func (c *Client) GetAccountLists(ctx context.Context, id string) ([]*List, error) {
28         var lists []*List
29         err := c.doAPI(ctx, http.MethodGet, fmt.Sprintf("/api/v1/accounts/%s/lists", url.PathEscape(string(id))), nil, &lists, nil)
30         if err != nil {
31                 return nil, err
32         }
33         return lists, nil
34 }
35
36 // GetListAccounts returns the accounts in a given list.
37 func (c *Client) GetListAccounts(ctx context.Context, id string) ([]*Account, error) {
38         var accounts []*Account
39         err := c.doAPI(ctx, http.MethodGet, fmt.Sprintf("/api/v1/lists/%s/accounts", url.PathEscape(string(id))), url.Values{"limit": {"0"}}, &accounts, nil)
40         if err != nil {
41                 return nil, err
42         }
43         return accounts, nil
44 }
45
46 // GetList retrieves a list by string.
47 func (c *Client) GetList(ctx context.Context, id string) (*List, error) {
48         var list List
49         err := c.doAPI(ctx, http.MethodGet, fmt.Sprintf("/api/v1/lists/%s", url.PathEscape(string(id))), nil, &list, nil)
50         if err != nil {
51                 return nil, err
52         }
53         return &list, nil
54 }
55
56 // CreateList creates a new list with a given title.
57 func (c *Client) CreateList(ctx context.Context, title string) (*List, error) {
58         params := url.Values{}
59         params.Set("title", title)
60
61         var list List
62         err := c.doAPI(ctx, http.MethodPost, "/api/v1/lists", params, &list, nil)
63         if err != nil {
64                 return nil, err
65         }
66         return &list, nil
67 }
68
69 // RenameList assigns a new title to a list.
70 func (c *Client) RenameList(ctx context.Context, id string, title string) (*List, error) {
71         params := url.Values{}
72         params.Set("title", title)
73
74         var list List
75         err := c.doAPI(ctx, http.MethodPut, fmt.Sprintf("/api/v1/lists/%s", url.PathEscape(string(id))), params, &list, nil)
76         if err != nil {
77                 return nil, err
78         }
79         return &list, nil
80 }
81
82 // DeleteList removes a list.
83 func (c *Client) DeleteList(ctx context.Context, id string) error {
84         return c.doAPI(ctx, http.MethodDelete, fmt.Sprintf("/api/v1/lists/%s", url.PathEscape(string(id))), nil, nil, nil)
85 }
86
87 // AddToList adds accounts to a list.
88 //
89 // Only accounts already followed by the user can be added to a list.
90 func (c *Client) AddToList(ctx context.Context, list string, accounts ...string) error {
91         params := url.Values{}
92         for _, acct := range accounts {
93                 params.Add("account_ids", string(acct))
94         }
95
96         return c.doAPI(ctx, http.MethodPost, fmt.Sprintf("/api/v1/lists/%s/accounts", url.PathEscape(string(list))), params, nil, nil)
97 }
98
99 // RemoveFromList removes accounts from a list.
100 func (c *Client) RemoveFromList(ctx context.Context, list string, accounts ...string) error {
101         params := url.Values{}
102         for _, acct := range accounts {
103                 params.Add("account_ids", string(acct))
104         }
105
106         return c.doAPI(ctx, http.MethodDelete, fmt.Sprintf("/api/v1/lists/%s/accounts", url.PathEscape(string(list))), params, nil, nil)
107 }