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}