diff --git a/cmd/bsky-modactions/main.go b/cmd/bsky-modactions/main.go index a46c5c5..c78473d 100644 --- a/cmd/bsky-modactions/main.go +++ b/cmd/bsky-modactions/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + "fmt" "log/slog" "net/http" "os" @@ -11,10 +12,17 @@ import ( comatproto "github.com/bluesky-social/indigo/api/atproto" "github.com/fxamacker/cbor/v2" "github.com/gorilla/websocket" + "github.com/redis/go-redis/v9" "github.com/urfave/cli/v2" ) -const BskyModAuthority = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels` +const ( + BskyModDid = `did:plc:ar7c4by46qjdydhdevvrndac` // @moderation.bsky.app + BskyModLabelEndpoint = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels` + + ActionsConfig = `bskymodactions:config` + ActionsLabels = `bskymodactions:labels` +) func main() { app := cli.App{ @@ -25,10 +33,21 @@ func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() - // TODO track seq - slog.Info("connecting to websocket", "url", BskyModAuthority) - wsconn, _, err := websocket.DefaultDialer.DialContext(ctx, BskyModAuthority, http.Header{ - "User-Agent": []string{"bsky-modactions/0.1 (@edavis.dev)"}, + rdb := redis.NewClient(&redis.Options{ + Addr: "localhost:6379", + Password: "", + DB: 0, + }) + + url := BskyModLabelEndpoint + seq, err := rdb.HGet(ctx, ActionsConfig, "seq").Result() + if err == nil && seq != "" { // err check reversed + url += fmt.Sprintf("?cursor=%s", seq) + } + slog.Info("connecting to websocket", "url", url) + + wsconn, _, err := websocket.DefaultDialer.DialContext(ctx, url, http.Header{ + "User-Agent": []string{"bsky-modactions/0.1 (@bskycharts.edavis.dev)"}, }) if err != nil { return err @@ -62,7 +81,24 @@ func main() { continue } for _, label := range labels.Labels { + if label.Src != BskyModDid { + continue + } slog.Info("parsed label", "neg", label.Neg, "uri", label.Uri, "val", label.Val) + + var neg bool + if label.Neg != nil { + neg = *label.Neg + } + key := fmt.Sprintf("%s:%t", label.Val, neg) + + if err := rdb.HIncrBy(ctx, ActionsLabels, key, 1).Err(); err != nil { + slog.Error("error incrementing key", "key", key) + } + } + + if err := rdb.HSet(ctx, ActionsConfig, "seq", labels.Seq).Err(); err != nil { + slog.Error("error updating seq", "err", err) } } }()