demo CLI tool for grain.social
1package main
2
3import (
4 "context"
5 "encoding/json"
6 "errors"
7 "fmt"
8 "io/ioutil"
9 "log/slog"
10 "os"
11
12 "github.com/adrg/xdg"
13 "github.com/bluesky-social/indigo/atproto/client"
14)
15
16var ErrNoAuthSession = errors.New("no auth session found")
17
18var SESSION_DATA_PATH = "halide/auth.json"
19
20func persistAuthSession(d client.PasswordSessionData) error {
21
22 fPath, err := xdg.StateFile(SESSION_DATA_PATH)
23 if err != nil {
24 return err
25 }
26
27 f, err := os.OpenFile(fPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
28 if err != nil {
29 return err
30 }
31 defer f.Close()
32
33 authBytes, err := json.MarshalIndent(d, "", " ")
34 if err != nil {
35 return err
36 }
37 _, err = f.Write(authBytes)
38 return err
39}
40
41func wipeAuthSession() error {
42
43 fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH)
44 if err != nil {
45 fmt.Printf("no auth session found (already logged out)")
46 return nil
47 }
48 return os.Remove(fPath)
49}
50
51func loadAuthSession() (*client.PasswordSessionData, error) {
52
53 fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH)
54 if err != nil {
55 return nil, ErrNoAuthSession
56 }
57
58 fBytes, err := ioutil.ReadFile(fPath)
59 if err != nil {
60 return nil, err
61 }
62
63 var sess client.PasswordSessionData
64 err = json.Unmarshal(fBytes, &sess)
65 if err != nil {
66 return nil, err
67 }
68 return &sess, nil
69}
70
71func loadClient() (*client.APIClient, error) {
72 d, err := loadAuthSession()
73 if err != nil {
74 return nil, err
75 }
76
77 c := client.ResumePasswordSession(*d, func(ctx context.Context, data client.PasswordSessionData) {
78 if err := persistAuthSession(data); err != nil {
79 slog.Error("saving refreshed auth session", "err", err)
80 }
81 })
82 return c, nil
83}