- use language.ParseAcceptLanguage to get user prefs for langs - use Accept-Language rather than the bind stuff - langs are now typed - move mostliked/view.go to mostliked/generator.go
···11+package mostliked
22+33+import (
44+ "context"
55+ "database/sql"
66+ "log"
77+ "strconv"
88+99+ appbsky "github.com/bluesky-social/indigo/api/bsky"
1010+ "github.com/edavis/bsky-feeds/pkg/feeds"
1111+ _ "github.com/mattn/go-sqlite3"
1212+ "github.com/sanggonlee/gosq"
1313+)
1414+1515+type PostRow struct {
1616+ Uri string
1717+ Likes int
1818+}
1919+2020+func getPosts(ctx context.Context, dbCnx *sql.DB, params feeds.FeedgenParams) ([]PostRow, error) {
2121+ q, err := gosq.Execute(`
2222+ SELECT posts.uri, likes
2323+ FROM posts LEFT JOIN langs ON posts.uri = langs.uri
2424+ WHERE 1=1
2525+ {{if .Langs}}
2626+ AND (
2727+ {{- range $index, $lang := .Langs }}
2828+ {{- if $index }} OR {{ end }} lang = ?
2929+ {{- end }}
3030+ )
3131+ {{end}}
3232+ {{if .Offset}}
3333+ AND likes < ?
3434+ {{end}}
3535+ ORDER BY likes DESC, create_ts DESC
3636+ LIMIT ?
3737+ `, params)
3838+ if err != nil {
3939+ log.Println("error in sql template:", err)
4040+ }
4141+4242+ log.Println(q)
4343+4444+ var queryParams []any
4545+ for _, lang := range params.Langs {
4646+ queryParams = append(queryParams, lang.String())
4747+ }
4848+4949+ if params.Offset != "" {
5050+ queryParams = append(queryParams, params.Offset)
5151+ }
5252+5353+ queryParams = append(queryParams, params.Limit)
5454+5555+ log.Println(queryParams)
5656+5757+ rows, err := dbCnx.QueryContext(ctx, q, queryParams...)
5858+ if err != nil {
5959+ return nil, err
6060+ }
6161+ defer rows.Close()
6262+6363+ var posts []PostRow
6464+ for rows.Next() {
6565+ var post PostRow
6666+ if err := rows.Scan(&post.Uri, &post.Likes); err != nil {
6767+ return nil, err
6868+ }
6969+ posts = append(posts, post)
7070+ }
7171+ if err := rows.Close(); err != nil {
7272+ return nil, err
7373+ }
7474+ if err := rows.Err(); err != nil {
7575+ return nil, err
7676+ }
7777+7878+ return posts, nil
7979+}
8080+8181+func Feed(params feeds.FeedgenParams) appbsky.FeedGetFeedSkeleton_Output {
8282+ ctx := context.Background()
8383+ dbCnx, err := sql.Open("sqlite3", "data/mostliked.db?_journal=WAL&_fk=on&mode=ro")
8484+ if err != nil {
8585+ log.Fatal("error opening db")
8686+ }
8787+ defer dbCnx.Close()
8888+8989+ rows, err := getPosts(ctx, dbCnx, params)
9090+ if err != nil {
9191+ log.Println("error fetching rows:", err)
9292+ }
9393+9494+ var cursor string
9595+ posts := make([]*appbsky.FeedDefs_SkeletonFeedPost, 0, params.Limit)
9696+9797+ for _, row := range rows {
9898+ posts = append(posts, &appbsky.FeedDefs_SkeletonFeedPost{Post: row.Uri})
9999+ cursor = strconv.Itoa(row.Likes)
100100+ }
101101+102102+ skeleton := appbsky.FeedGetFeedSkeleton_Output{
103103+ Feed: posts,
104104+ }
105105+106106+ if len(rows) == int(params.Limit) {
107107+ skeleton.Cursor = &cursor
108108+ }
109109+110110+ return skeleton
111111+}
+1
pkg/mostliked/handler.go
···4848func findDetectableText(post appbsky.FeedPost) string {
4949 // if we have text, detect against that
5050 // no text but we do have images, detect against first alt text
5151+ // log.Printf("%+v\n", post)
51525253 if post.Text != "" {
5354 return post.Text