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}