this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 0f1d5f21b548d9861ddcf52eaa25404f6149f501 95 lines 2.3 kB view raw
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}