this repo has no description
1package main
2
3import (
4 "golang.org/x/text/language"
5 "net/http"
6 "strconv"
7
8 appbsky "github.com/bluesky-social/indigo/api/bsky"
9 "github.com/bluesky-social/indigo/atproto/syntax"
10 "github.com/edavis/bsky-feeds/pkg/feeds"
11 "github.com/edavis/bsky-feeds/pkg/mostliked"
12 "github.com/labstack/echo/v4"
13 "github.com/labstack/echo/v4/middleware"
14)
15
16type SkeletonRequest struct {
17 Feed string `query:"feed"`
18 Limit string `query:"limit"`
19 Cursor string `query:"cursor"`
20}
21
22type FeedLookup map[string]func(feeds.FeedgenParams) appbsky.FeedGetFeedSkeleton_Output
23
24func parseLangs(userPrefs string) []language.Tag {
25 t, _, _ := language.ParseAcceptLanguage(userPrefs)
26 return t
27}
28
29var generators = FeedLookup{
30 "at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/most-liked": mostliked.Feed,
31 "at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/most-liked-dev": mostliked.Feed,
32}
33
34func getFeedSkeleton(c echo.Context) error {
35 var req SkeletonRequest
36 if err := c.Bind(&req); err != nil {
37 return c.String(http.StatusBadRequest, "bad request")
38 }
39
40 var limit int = 30
41 if req.Limit != "" {
42 if l, err := strconv.Atoi(req.Limit); err == nil {
43 limit = l
44 }
45 }
46
47 params := feeds.FeedgenParams{
48 Feed: req.Feed,
49 Limit: limit,
50 Cursor: req.Cursor,
51 Langs: parseLangs(c.Request().Header.Get("Accept-Language")),
52 }
53
54 feedFunc, ok := generators[req.Feed]
55 if !ok {
56 return c.String(http.StatusNotFound, "feed not found")
57 }
58 feed := feedFunc(params)
59 return c.JSON(http.StatusOK, feed)
60}
61
62func describeFeedGenerator(c echo.Context) error {
63 type feed struct {
64 URI syntax.ATURI `json:"uri"`
65 }
66
67 type gen struct {
68 DID string `json:"did"`
69 Feeds []feed `json:"feeds"`
70 }
71
72 out := gen{
73 DID: `https://` + NgrokHostname,
74 }
75
76 for feedUri, _ := range generators {
77 aturi, err := syntax.ParseATURI(feedUri)
78 if err != nil {
79 continue
80 }
81 out.Feeds = append(out.Feeds, feed{URI: aturi})
82 }
83
84 return c.JSON(http.StatusOK, out)
85}
86
87func main() {
88 e := echo.New()
89 e.Use(middleware.Logger())
90 e.Use(middleware.Recover())
91 e.GET("/.well-known/did.json", didDoc)
92 e.GET("/xrpc/app.bsky.feed.getFeedSkeleton", getFeedSkeleton)
93 e.GET("/xrpc/app.bsky.feed.describeFeedGenerator", describeFeedGenerator)
94 e.Logger.Fatal(e.Start(":5000"))
95}