+80
cmd/bsky-modactions/main.go
+80
cmd/bsky-modactions/main.go
···
1
+
package main
2
+
3
+
import (
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
+
17
+
const BskyModAuthority = `wss://mod.bsky.app/xrpc/com.atproto.label.subscribeLabels`
18
+
19
+
func 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
+
}
+11
-3
go.mod
+11
-3
go.mod
···
1
1
module github.com/edavis/bsky-tools
2
2
3
-
go 1.23.0
3
+
go 1.24
4
+
5
+
toolchain go1.24.7
4
6
5
7
require (
6
-
github.com/bluesky-social/indigo v0.0.0-20240905024844-a4f38639767f
8
+
github.com/bluesky-social/indigo v0.0.0-20250909204019-c5eaa30f683f
7
9
github.com/bluesky-social/jetstream v0.0.0-20241020000921-dcd43344c716
10
+
github.com/fxamacker/cbor/v2 v2.9.0
8
11
github.com/gorilla/websocket v1.5.1
9
12
github.com/mattn/go-sqlite3 v1.14.22
10
13
github.com/pemistahl/lingua-go v1.4.0
11
14
github.com/redis/go-redis/v9 v9.3.0
15
+
github.com/urfave/cli/v2 v2.26.0
12
16
)
13
17
14
18
require (
15
19
github.com/carlmjohnson/versioninfo v0.22.5 // indirect
16
20
github.com/cespare/xxhash/v2 v2.3.0 // indirect
21
+
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
17
22
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
18
23
github.com/felixge/httpsnoop v1.0.4 // indirect
19
24
github.com/go-logr/logr v1.4.1 // indirect
···
48
53
github.com/multiformats/go-varint v0.0.7 // indirect
49
54
github.com/opentracing/opentracing-go v1.2.0 // indirect
50
55
github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect
56
+
github.com/russross/blackfriday/v2 v2.1.0 // indirect
51
57
github.com/shopspring/decimal v1.3.1 // indirect
52
58
github.com/spaolacci/murmur3 v1.1.0 // indirect
53
-
github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c // indirect
59
+
github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e // indirect
60
+
github.com/x448/float16 v0.8.4 // indirect
61
+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
54
62
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
55
63
go.opentelemetry.io/otel v1.21.0 // indirect
56
64
go.opentelemetry.io/otel/metric v1.21.0 // indirect
+16
-4
go.sum
+16
-4
go.sum
···
1
1
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
2
2
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
3
-
github.com/bluesky-social/indigo v0.0.0-20240905024844-a4f38639767f h1:Q9cfCAlYWIWPsSDhg5w6qcutQ7YaJtfTjiRLP/mw+pc=
4
-
github.com/bluesky-social/indigo v0.0.0-20240905024844-a4f38639767f/go.mod h1:Zx9nSWgd/FxMenkJW07VKnzspxpHBdPrPmS+Fspl2I0=
3
+
github.com/bluesky-social/indigo v0.0.0-20250909204019-c5eaa30f683f h1:FugOoTzh0nCMTWGqNGsjttFWVPcwxaaGD3p/nE9V8qY=
4
+
github.com/bluesky-social/indigo v0.0.0-20250909204019-c5eaa30f683f/go.mod h1:n6QE1NDPFoi7PRbMUZmc2y7FibCqiVU4ePpsvhHUBR8=
5
5
github.com/bluesky-social/jetstream v0.0.0-20241020000921-dcd43344c716 h1:I8+VaZKaNIGCPGXE2/VXzJGlPFEZgiFLjnge+OWFl5w=
6
6
github.com/bluesky-social/jetstream v0.0.0-20241020000921-dcd43344c716/go.mod h1:/dE2dmFell/m4zxgIbH3fkiqZ1obzr/ETj4RpgomgMs=
7
7
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
···
13
13
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
14
14
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
15
15
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
16
+
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
17
+
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
16
18
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
17
19
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
18
20
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
···
20
22
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
21
23
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
22
24
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
25
+
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
26
+
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
23
27
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
24
28
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
25
29
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
···
124
128
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
125
129
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
126
130
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
131
+
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
132
+
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
127
133
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
128
134
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
129
135
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
···
141
147
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
142
148
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
143
149
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
150
+
github.com/urfave/cli/v2 v2.26.0 h1:3f3AMg3HpThFNT4I++TKOejZO8yU55t3JnnSr4S4QEI=
151
+
github.com/urfave/cli/v2 v2.26.0/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
144
152
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ=
145
153
github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw=
146
-
github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c h1:UsxJNcLPfyLyVaA4iusIrsLAqJn/xh36Qgb8emqtXzk=
147
-
github.com/whyrusleeping/cbor-gen v0.1.3-0.20240904181319-8dc02b38228c/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
154
+
github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e h1:28X54ciEwwUxyHn9yrZfl5ojgF4CBNLWX7LR0rvBkf4=
155
+
github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so=
156
+
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
157
+
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
158
+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
159
+
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
148
160
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
149
161
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
150
162
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=