forked from alphaticks/go-farcaster
-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.go
121 lines (112 loc) · 2.76 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package farcaster
import (
"crypto/ecdsa"
"errors"
"fmt"
"github.com/alphaticks/go-farcaster/api"
"github.com/alphaticks/go-farcaster/utils"
"net/http"
"time"
)
type Token struct {
Secret string
ExpiresAt time.Time
}
type Client struct {
*http.Client
pk *ecdsa.PrivateKey
token Token
}
func NewClient(privateKey *ecdsa.PrivateKey, token string) (*Client, error) {
return &Client{
Client: http.DefaultClient,
pk: privateKey,
token: Token{
Secret: token,
ExpiresAt: time.Now().Add(24 * time.Hour),
},
}, nil
}
func (c *Client) Auth() error {
if c.pk == nil {
return errors.New("no private key provided, cannot authenticate")
}
req, err := api.Auth(c.pk, nil)
if err != nil {
return err
}
var res api.AuthResponse
err = utils.PerformJSONRequest(c.Client, req, &res)
if err != nil {
return err
}
if len(res.Errors) > 0 {
return errors.New(res.Errors[0].Message)
}
c.token.Secret = res.Result.Token.Secret
c.token.ExpiresAt = time.UnixMilli(res.Result.Token.ExpiresAt)
return nil
}
func (c *Client) Authed() bool {
return c.token.Secret != "" && time.Now().Before(c.token.ExpiresAt)
}
func (c *Client) GetCasts(fid int) ([]api.Cast, error) {
if !c.Authed() {
if err := c.Auth(); err != nil {
return nil, fmt.Errorf("error authenticating: %w", err)
}
}
req, err := api.GetCasts(c.token.Secret, fid, nil, nil)
if err != nil {
return nil, fmt.Errorf("error creating get casts request: %w", err)
}
res := api.GetCastsResponse{}
err = utils.PerformJSONRequest(c.Client, req, &res)
if err != nil {
return nil, fmt.Errorf("error performing follow request: %w", err)
}
if len(res.Errors) > 0 {
return nil, errors.New(res.Errors[0].Message)
}
return res.Result.Casts, nil
}
func (c *Client) Cast(text string) error {
if !c.Authed() {
if err := c.Auth(); err != nil {
return fmt.Errorf("error authenticating: %w", err)
}
}
req, err := api.PostCast(c.token.Secret, text)
if err != nil {
return fmt.Errorf("error creating cast request: %w", err)
}
res := api.PostCastResponse{}
err = utils.PerformJSONRequest(c.Client, req, &res)
if err != nil {
return fmt.Errorf("error performing cast request: %w", err)
}
if len(res.Errors) > 0 {
return errors.New(res.Errors[0].Message)
}
return nil
}
func (c *Client) Follow(fid int) error {
if !c.Authed() {
if err := c.Auth(); err != nil {
return fmt.Errorf("error authenticating: %w", err)
}
}
req, err := api.Follow(c.token.Secret, fid)
if err != nil {
return fmt.Errorf("error creating follow request: %w", err)
}
res := api.SuccessResponse{}
err = utils.PerformJSONRequest(c.Client, req, &res)
if err != nil {
return fmt.Errorf("error performing follow request: %w", err)
}
if len(res.Errors) > 0 {
return errors.New(res.Errors[0].Message)
}
return nil
}