this repo has no description
1package main
2
3import (
4 "context"
5 "encoding/json"
6 "io"
7 "log"
8 "net/http"
9 "strings"
10 "time"
11
12 "github.com/bluesky-social/indigo/atproto/syntax"
13 "github.com/redis/go-redis/v9"
14)
15
16const PlcExportUrl = `https://plc.directory/export`
17const PlcOpsCountKey = `dev.edavis.muninsky.plc_ops`
18
19func main() {
20 ctx := context.Background()
21 client := http.DefaultClient
22
23 rdb := redis.NewClient(&redis.Options{
24 Addr: "localhost:6379",
25 Password: "",
26 DB: 0,
27 })
28
29 req, err := http.NewRequestWithContext(ctx, "GET", PlcExportUrl, nil)
30 if err != nil {
31 panic(err)
32 }
33
34 var lastCursor string
35 var cursor string
36 cursor = syntax.DatetimeNow().String()
37
38 q := req.URL.Query()
39 q.Add("count", "1000")
40 req.URL.RawQuery = q.Encode()
41
42 for {
43 q := req.URL.Query()
44 if cursor != "" {
45 q.Set("after", cursor)
46 }
47 req.URL.RawQuery = q.Encode()
48
49 log.Printf("requesting %s\n", req.URL.String())
50 resp, err := client.Do(req)
51 if err != nil {
52 log.Printf("error doing PLC request: %v\n", err)
53 }
54 if resp.StatusCode != http.StatusOK {
55 log.Printf("PLC request failed status=%d\n", resp.StatusCode)
56 }
57
58 respBytes, err := io.ReadAll(resp.Body)
59 if err != nil {
60 log.Printf("error reading response body: %v\n", err)
61 }
62
63 lines := strings.Split(string(respBytes), "\n")
64 if len(lines) == 0 || (len(lines) == 1 && len(lines[0]) == 0) {
65 time.Sleep(5 * time.Second)
66 continue
67 }
68
69 var opCount int64
70 for _, l := range lines {
71 if len(l) < 2 {
72 break
73 }
74
75 var op map[string]interface{}
76 err = json.Unmarshal([]byte(l), &op)
77 if err != nil {
78 log.Printf("error decoding JSON: %v\n", err)
79 }
80
81 var ok bool
82 cursor, ok = op["createdAt"].(string)
83 if !ok {
84 log.Printf("missing createdAt")
85 }
86
87 if cursor == lastCursor {
88 continue
89 }
90
91 opCount += 1
92 lastCursor = cursor
93 }
94
95 log.Printf("fetched %d operations", opCount)
96 if _, err := rdb.IncrBy(ctx, PlcOpsCountKey, opCount).Result(); err != nil {
97 log.Printf("error incrementing op count in redis: %v\n", err)
98 }
99
100 time.Sleep(5 * time.Second)
101 }
102}