this repo has no description
1package main
2
3import (
4 "bytes"
5 "context"
6 "log/slog"
7 "net/http"
8 "os"
9 "os/signal"
10
11 comatproto "github.com/bluesky-social/indigo/api/atproto"
12 "github.com/fxamacker/cbor/v2"
13 "github.com/gorilla/websocket"
14 "github.com/urfave/cli/v2"
15)
16
17const BskyModAuthority = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels`
18
19func main() {
20 app := cli.App{
21 Name: "bsky-modactions",
22 }
23
24 app.Action = func(cctx *cli.Context) error {
25 ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
26 defer stop()
27
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)"},
32 })
33 if err != nil {
34 return err
35 }
36
37 go func() {
38 for {
39 select {
40 case <-ctx.Done():
41 return
42 default:
43 }
44
45 _, p, err := wsconn.ReadMessage()
46 if err != nil {
47 slog.Error("error reading message from websocket", "err", err)
48 continue
49 }
50
51 var info comatproto.LabelSubscribeLabels_Info
52 rest, err := cbor.UnmarshalFirst(p, &info)
53 if err != nil {
54 slog.Error("error unmarshalling info", "err", err)
55 continue
56 }
57
58 var labels comatproto.LabelSubscribeLabels_Labels
59 err = labels.UnmarshalCBOR(bytes.NewReader(rest))
60 if err != nil {
61 slog.Error("error unmarshalling label", "err", err)
62 continue
63 }
64 for _, label := range labels.Labels {
65 slog.Info("parsed label", "neg", label.Neg, "uri", label.Uri, "val", label.Val)
66 }
67 }
68 }()
69
70 <-ctx.Done()
71 stop()
72 slog.Info("shutting down")
73
74 return nil
75 }
76
77 if err := app.Run(os.Args); err != nil {
78 slog.Error("error running app", "err", err)
79 }
80}