this repo has no description

bsky-modactions: track with redis

Changed files
+41 -5
cmd
bsky-modactions
+41 -5
cmd/bsky-modactions/main.go
···
import (
"bytes"
"context"
+
"fmt"
"log/slog"
"net/http"
"os"
···
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{
···
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
···
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)
}
}
}()