Procházet zdrojové kódy

Some instance timeline work.

default před 3 roky
rodič
revize
ede4d6f2dc
3 změnil soubory, kde provedl 38 přidání a 35 odebrání
  1. 11 2
      data.c
  2. 23 29
      mastoapi.c
  3. 4 4
      snac.h

+ 11 - 2
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) */
 /* returns a timeline (with all entries) */
 {
 {
     int c_max;
     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) */
 /* returns a timeline (only top level entries) */
 {
 {
     xs *list = timeline_simple_list(snac, idx_name, skip, show);
     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 **/
 /** following **/
 
 
 /* this needs special treatment and cannot use the object db as is,
 /* this needs special treatment and cannot use the object db as is,

+ 23 - 29
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) {
     if (strcmp(cmd, "/v1/timelines/public") == 0) {
         /* the public timeline (public timelines for all users) */
         /* 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 limit = 0;
         int cnt   = 0;
         int cnt   = 0;
 
 
@@ -1050,44 +1048,40 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
         if (limit == 0)
         if (limit == 0)
             limit = 20;
             limit = 20;
 
 
-        xs *out    = xs_list_new();
-        xs *users  = user_list();
-        xs_list *p = users;
-        xs_str *uid;
-
-        while (xs_list_iter(&p, &uid) && cnt < limit) {
-            snac user;
+        xs *timeline = timeline_instance_list(0, limit);
+        xs *out      = xs_list_new();
+        xs_list *p   = timeline;
+        xs_str *md5;
 
 
-            if (user_open(&user, uid)) {
-                xs *timeline = timeline_simple_list(&user, "public", 0, 4);
-                xs_list *p2  = timeline;
-                xs_str *v;
+        while (xs_list_iter(&p, &md5) && cnt < limit) {
+            xs *msg = NULL;
 
 
-                while (xs_list_iter(&p2, &v) && cnt < limit) {
-                    xs *msg = NULL;
+            /* get the entry */
+            if (!valid_status(object_get_by_md5(md5, &msg)))
+                continue;
 
 
-                    /* get the entry */
-                    if (!valid_status(timeline_get_by_md5(&user, v, &msg)))
-                        continue;
+            /* discard non-Notes */
+            if (strcmp(xs_dict_get(msg, "type"), "Note") != 0)
+                continue;
 
 
-                    /* discard non-Notes */
-                    if (strcmp(xs_dict_get(msg, "type"), "Note") != 0)
-                        continue;
+            /* get the uid */
+            xs *l = xs_split(xs_dict_get(msg, "attributedTo"), "/");
+            const char *uid = xs_list_get(l, -1);
 
 
-                    /* 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 */
                     /* convert the Note into a Mastodon status */
                     xs *st = mastoapi_status(&user, msg);
                     xs *st = mastoapi_status(&user, msg);
 
 
-                    if (st != NULL) {
+                    if (st != NULL)
                         out = xs_list_append(out, st);
                         out = xs_list_append(out, st);
-                        cnt++;
-                    }
+
+                    user_free(&user);
                 }
                 }
 
 
-                user_free(&user);
+                cnt++;
             }
             }
         }
         }
 
 

+ 4 - 4
snac.h

@@ -105,14 +105,14 @@ int timeline_touch(snac *snac);
 int timeline_here(snac *snac, const char *md5);
 int timeline_here(snac *snac, const char *md5);
 int timeline_get_by_md5(snac *snac, const char *md5, xs_dict **msg);
 int timeline_get_by_md5(snac *snac, const char *md5, xs_dict **msg);
 int timeline_del(snac *snac, char *id);
 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);
 int timeline_add(snac *snac, char *id, char *o_msg);
 void timeline_admire(snac *snac, char *id, char *admirer, int like);
 void timeline_admire(snac *snac, char *id, char *admirer, int like);
 
 
 xs_list *timeline_top_level(snac *snac, xs_list *list);
 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_add(snac *snac, const char *actor, const xs_dict *msg);
 int following_del(snac *snac, const char *actor);
 int following_del(snac *snac, const char *actor);