add support for links as posts

This commit is contained in:
Astra 2025-07-01 07:08:46 +01:00
parent 2bb3946237
commit bfa829d8c7
4 changed files with 240 additions and 33 deletions

73
main.go
View file

@ -3,6 +3,8 @@ package main
import (
"bytes"
"context"
"encoding/json"
"flag"
"fmt"
"image/jpeg"
"io"
@ -11,6 +13,7 @@ import (
"net/http"
"net/url"
"os"
"regexp"
"strconv"
"strings"
"time"
@ -19,6 +22,7 @@ import (
tgbotapi "github.com/OvyFlash/telegram-bot-api"
// apibsky "github.com/bluesky-social/indigo/api/bsky"
"github.com/bluesky-social/jetstream/pkg/client"
"github.com/bluesky-social/jetstream/pkg/client/schedulers/sequential"
"github.com/bluesky-social/jetstream/pkg/models"
@ -39,7 +43,13 @@ type handler struct {
bsky *bsky.BSky
}
var (
post = flag.String("post", "", "URL to a BlueSky post")
)
func main() {
flag.Parse()
var handle = os.Getenv("BSKY_HANDLE")
var password = os.Getenv("BSKY_PASSWORD")
bskyClient := bsky.NewBSky()
@ -48,30 +58,11 @@ func main() {
log.Fatal(err, ". please set BSKY_HANDLE and BSKY_PASSWORD env variables")
}
ctx := context.Background()
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug.Level(),
})))
logger := slog.Default()
config := client.DefaultClientConfig()
config.WebsocketURL = serverAddr
config.WantedCollections = []string{"app.bsky.feed.post"}
config.WantedDids = []string{bskyClient.Bluesky.Cfg.DID}
config.Compress = true
h := &handler{
seenSeqs: make(map[int64]struct{}),
bsky: bskyClient,
}
scheduler := sequential.NewScheduler("jetstream_localdev", logger, h.HandleEvent)
c, err := client.NewClient(config, logger, scheduler)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
endpoint := "https://api.telegram.org/bot%s/%s"
if os.Getenv("TG_API_ENDPOINT") != "" {
endpoint = os.Getenv("TG_API_ENDPOINT")
@ -86,6 +77,50 @@ func main() {
log.Fatal("TG_CHANNEL_ID is not set")
}
if *post != "" {
r := regexp.MustCompile(`^https:\/\/.*?\/profile\/(.*?)\/post\/(.*?)$`)
s := r.FindStringSubmatch(*post)
handle := s[1]
if s[1][0:4] != "did:" {
handle, _ = bskyClient.ResolveHandle(s[1])
}
postJSON := bskyClient.Bluesky.FetchPost(handle, s[2])
p, _ := json.Marshal(postJSON.Record)
h.ProcessPost(&models.Event{
Did: postJSON.Author.Did,
TimeUS: postJSON.Record.CreatedAt.Unix(),
Kind: "",
Commit: &models.Commit{
CID: postJSON.Cid,
Operation: "create",
RKey: strings.Split(postJSON.URI, "/")[4],
Collection: "app.bsky.feed.post",
Record: p,
},
})
return
}
ctx := context.Background()
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug.Level(),
})))
logger := slog.Default()
config := client.DefaultClientConfig()
config.WebsocketURL = serverAddr
config.WantedCollections = []string{"app.bsky.feed.post"}
config.WantedDids = []string{bskyClient.Bluesky.Cfg.DID}
config.Compress = true
scheduler := sequential.NewScheduler("jetstream_localdev", logger, h.HandleEvent)
c, err := client.NewClient(config, logger, scheduler)
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
// ------------------------------------------------------------------------------
// file, err := os.Open("posts.json")
// if err != nil {