A feed generator that allows Bluesky bookmarks via DMs
1package main
2
3import (
4 "context"
5
6 "fmt"
7 "log/slog"
8 "time"
9
10 "github.com/bluesky-social/jetstream/pkg/client"
11 "github.com/bluesky-social/jetstream/pkg/client/schedulers/sequential"
12)
13
14type consumer struct {
15 cfg *client.ClientConfig
16 handler *handler
17 logger *slog.Logger
18}
19
20func NewConsumer(jsAddr string, logger *slog.Logger, handler *handler) *consumer {
21 cfg := client.DefaultClientConfig()
22 if jsAddr != "" {
23 cfg.WebsocketURL = jsAddr
24 }
25 cfg.WantedCollections = []string{
26 "app.bsky.feed.post",
27 }
28 cfg.WantedDids = []string{}
29
30 return &consumer{
31 cfg: cfg,
32 logger: logger,
33 handler: handler,
34 }
35}
36
37func (c *consumer) Consume(ctx context.Context) error {
38 scheduler := sequential.NewScheduler("jetstream_localdev", c.logger, c.handler.HandleEvent)
39 defer scheduler.Shutdown()
40
41 client, err := client.NewClient(c.cfg, c.logger, scheduler)
42 if err != nil {
43 return fmt.Errorf("failed to create client: %w", err)
44 }
45
46 cursor := time.Now().Add(1 * -time.Minute).UnixMicro()
47
48 if err := client.ConnectAndRead(ctx, &cursor); err != nil {
49 return fmt.Errorf("connect and read: %w", err)
50 }
51
52 slog.Info("stopping consume")
53 return nil
54}