Some instance timeline work.

This commit is contained in:
default 2023-04-30 06:39:55 +02:00
parent 6b632e1ee9
commit ede4d6f2dc
3 changed files with 38 additions and 35 deletions

13
data.c
View file

@ -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,

View file

@ -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++;
}
}

8
snac.h
View file

@ -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);