this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

bsky-modactions: track with redis

+41 -5
+41 -5
cmd/bsky-modactions/main.go
··· 3 3 import ( 4 4 "bytes" 5 5 "context" 6 + "fmt" 6 7 "log/slog" 7 8 "net/http" 8 9 "os" ··· 11 12 comatproto "github.com/bluesky-social/indigo/api/atproto" 12 13 "github.com/fxamacker/cbor/v2" 13 14 "github.com/gorilla/websocket" 15 + "github.com/redis/go-redis/v9" 14 16 "github.com/urfave/cli/v2" 15 17 ) 16 18 17 - const BskyModAuthority = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels` 19 + const ( 20 + BskyModDid = `did:plc:ar7c4by46qjdydhdevvrndac` // @moderation.bsky.app 21 + BskyModLabelEndpoint = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels` 22 + 23 + ActionsConfig = `bskymodactions:config` 24 + ActionsLabels = `bskymodactions:labels` 25 + ) 18 26 19 27 func main() { 20 28 app := cli.App{ ··· 25 33 ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) 26 34 defer stop() 27 35 28 - // TODO track seq 29 - slog.Info("connecting to websocket", "url", BskyModAuthority) 30 - wsconn, _, err := websocket.DefaultDialer.DialContext(ctx, BskyModAuthority, http.Header{ 31 - "User-Agent": []string{"bsky-modactions/0.1 (@edavis.dev)"}, 36 + rdb := redis.NewClient(&redis.Options{ 37 + Addr: "localhost:6379", 38 + Password: "", 39 + DB: 0, 40 + }) 41 + 42 + url := BskyModLabelEndpoint 43 + seq, err := rdb.HGet(ctx, ActionsConfig, "seq").Result() 44 + if err == nil && seq != "" { // err check reversed 45 + url += fmt.Sprintf("?cursor=%s", seq) 46 + } 47 + slog.Info("connecting to websocket", "url", url) 48 + 49 + wsconn, _, err := websocket.DefaultDialer.DialContext(ctx, url, http.Header{ 50 + "User-Agent": []string{"bsky-modactions/0.1 (@bskycharts.edavis.dev)"}, 32 51 }) 33 52 if err != nil { 34 53 return err ··· 62 81 continue 63 82 } 64 83 for _, label := range labels.Labels { 84 + if label.Src != BskyModDid { 85 + continue 86 + } 65 87 slog.Info("parsed label", "neg", label.Neg, "uri", label.Uri, "val", label.Val) 88 + 89 + var neg bool 90 + if label.Neg != nil { 91 + neg = *label.Neg 92 + } 93 + key := fmt.Sprintf("%s:%t", label.Val, neg) 94 + 95 + if err := rdb.HIncrBy(ctx, ActionsLabels, key, 1).Err(); err != nil { 96 + slog.Error("error incrementing key", "key", key) 97 + } 98 + } 99 + 100 + if err := rdb.HSet(ctx, ActionsConfig, "seq", labels.Seq).Err(); err != nil { 101 + slog.Error("error updating seq", "err", err) 66 102 } 67 103 } 68 104 }()