From ede4d6f2dc8f862337724054dcfeb31cbaa89bcc Mon Sep 17 00:00:00 2001 From: default Date: Sun, 30 Apr 2023 06:39:55 +0200 Subject: [PATCH] Some instance timeline work. --- data.c | 13 +++++++++++-- mastoapi.c | 52 +++++++++++++++++++++++----------------------------- snac.h | 8 ++++---- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/data.c b/data.c index db42ece..60c4b26 100644 --- a/data.c +++ b/data.c @@ -1046,7 +1046,7 @@ xs_list *timeline_top_level(snac *snac, xs_list *list) } -d_char *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show) +xs_list *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show) /* returns a timeline (with all entries) */ { int c_max; @@ -1064,7 +1064,7 @@ d_char *timeline_simple_list(snac *snac, const char *idx_name, int skip, int sho } -d_char *timeline_list(snac *snac, const char *idx_name, int skip, int show) +xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show) /* returns a timeline (only top level entries) */ { xs *list = timeline_simple_list(snac, idx_name, skip, show); @@ -1073,6 +1073,15 @@ d_char *timeline_list(snac *snac, const char *idx_name, int skip, int show) } +xs_list *timeline_instance_list(int skip, int show) +/* returns the timeline for the full instance */ +{ + xs *idx = xs_fmt("%s/public.idx", srv_basedir); + + return index_list_desc(idx, skip, show); +} + + /** following **/ /* this needs special treatment and cannot use the object db as is, diff --git a/mastoapi.c b/mastoapi.c index 001c0bc..92acd41 100644 --- a/mastoapi.c +++ b/mastoapi.c @@ -1038,9 +1038,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path, if (strcmp(cmd, "/v1/timelines/public") == 0) { /* the public timeline (public timelines for all users) */ - /* this is an ugly kludge: first users in the list get all the fame */ - - const char *limit_s = xs_dict_get(args, "limit"); + const char *limit_s = xs_dict_get(args, "limit"); int limit = 0; int cnt = 0; @@ -1050,44 +1048,40 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path, if (limit == 0) limit = 20; - xs *out = xs_list_new(); - xs *users = user_list(); - xs_list *p = users; - xs_str *uid; + xs *timeline = timeline_instance_list(0, limit); + xs *out = xs_list_new(); + xs_list *p = timeline; + xs_str *md5; - while (xs_list_iter(&p, &uid) && cnt < limit) { - snac user; + while (xs_list_iter(&p, &md5) && cnt < limit) { + xs *msg = NULL; - if (user_open(&user, uid)) { - xs *timeline = timeline_simple_list(&user, "public", 0, 4); - xs_list *p2 = timeline; - xs_str *v; + /* get the entry */ + if (!valid_status(object_get_by_md5(md5, &msg))) + continue; - while (xs_list_iter(&p2, &v) && cnt < limit) { - xs *msg = NULL; + /* discard non-Notes */ + if (strcmp(xs_dict_get(msg, "type"), "Note") != 0) + continue; - /* get the entry */ - if (!valid_status(timeline_get_by_md5(&user, v, &msg))) - continue; + /* get the uid */ + xs *l = xs_split(xs_dict_get(msg, "attributedTo"), "/"); + const char *uid = xs_list_get(l, -1); - /* discard non-Notes */ - if (strcmp(xs_dict_get(msg, "type"), "Note") != 0) - continue; - - /* discard entries not by this user */ - if (!xs_startswith(xs_dict_get(msg, "id"), user.actor)) - continue; + if (!xs_is_null(uid)) { + snac user; + if (user_open(&user, uid)) { /* convert the Note into a Mastodon status */ xs *st = mastoapi_status(&user, msg); - if (st != NULL) { + if (st != NULL) out = xs_list_append(out, st); - cnt++; - } + + user_free(&user); } - user_free(&user); + cnt++; } } diff --git a/snac.h b/snac.h index a17d33f..5478933 100644 --- a/snac.h +++ b/snac.h @@ -105,14 +105,14 @@ int timeline_touch(snac *snac); int timeline_here(snac *snac, const char *md5); int timeline_get_by_md5(snac *snac, const char *md5, xs_dict **msg); int timeline_del(snac *snac, char *id); -d_char *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show); -d_char *timeline_list(snac *snac, const char *idx_name, int skip, int show); +xs_list *timeline_simple_list(snac *snac, const char *idx_name, int skip, int show); +xs_list *timeline_list(snac *snac, const char *idx_name, int skip, int show); int timeline_add(snac *snac, char *id, char *o_msg); void timeline_admire(snac *snac, char *id, char *admirer, int like); xs_list *timeline_top_level(snac *snac, xs_list *list); - -d_char *local_list(snac *snac, int max); +xs_list *local_list(snac *snac, int max); +xs_list *timeline_instance_list(int skip, int show); int following_add(snac *snac, const char *actor, const xs_dict *msg); int following_del(snac *snac, const char *actor);