浏览代码

Add boosts, likes and reacts to actor's people page

Show in an actor's page anything that the user could have seen from
actor in timeline or notifications, namely:

- posts by actor (use get_atto to identify the actor)
- boosts by actor
- user's posts with likes or emojireacts by actor

That said, in this view, only the latest boost is shown for a post, so
it might not seem like the boost is by actor.  Likes and emojireacts
aren't even shown, so the reason why a post appears might be puzzling.

Use timeline_simple_list, since we don't show entire conversations,
and we want to identify all posts with actor's interactions.

Saturate show at max_timeline_entries, so that we don't silently skip
entries.
Alexandre Oliva 7 月之前
父节点
当前提交
20eba6f519
共有 1 个文件被更改,包括 24 次插入4 次删除
  1. 24 4
      html.c

+ 24 - 4
html.c

@@ -3889,8 +3889,22 @@ xs_str *html_people_one(snac *user, const char *actor, const xs_list *list,
         if (!valid_status(status))
         if (!valid_status(status))
             continue;
             continue;
 
 
-        const char *by = xs_dict_get(msg, "attributedTo");
-        if (!by || strcmp(actor, by) != 0)
+        const char *id = xs_dict_get(msg, "id");
+        const char *by = get_atto(msg);
+        xs *actor_md5 = NULL;
+        xs_list *boosts = NULL;
+        xs_list *likes = NULL;
+        xs_list *reacts = NULL;
+        /* Besides actor's posts, also show actor's boosts, and also
+           posts by user with likes or reacts by actor.  I.e., any
+           actor's actions that user could have seen in the timeline
+           or in notifications.  */
+        if (!(by && strcmp(actor, by) == 0) &&
+            xs_list_in((boosts = object_announces(id)),
+                       (actor_md5 = xs_md5_hex(actor, strlen(actor)))) == -1 &&
+            (!(by && strcmp(user->actor, by) == 0) ||
+             (xs_list_in((likes = object_likes(id)), actor_md5) == -1 &&
+              xs_list_in((reacts = object_get_emoji_reacts(id)), actor_md5) == -1)))
             continue;
             continue;
 
 
         xs_html *entry = html_entry(user, msg, 0, 0, v, 1);
         xs_html *entry = html_entry(user, msg, 0, 0, v, 1);
@@ -4359,8 +4373,12 @@ int html_get_handler(const xs_dict *req, const char *q_path,
         cache = 0;
         cache = 0;
 
 
     int skip = 0;
     int skip = 0;
+    const char *max_show_default = "50";
+    int max_show = xs_number_get(xs_dict_get_def(srv_config, "max_timeline_entries",
+                                 max_show_default));
     int def_show = xs_number_get(xs_dict_get_def(srv_config, "def_timeline_entries",
     int def_show = xs_number_get(xs_dict_get_def(srv_config, "def_timeline_entries",
-                                 xs_dict_get_def(srv_config, "max_timeline_entries", "50")));
+                                 xs_dict_get_def(srv_config, "max_timeline_entries",
+                                 max_show_default)));
     int show = def_show;
     int show = def_show;
 
 
     if ((v = xs_dict_get(q_vars, "skip")) != NULL)
     if ((v = xs_dict_get(q_vars, "skip")) != NULL)
@@ -4386,6 +4404,8 @@ int html_get_handler(const xs_dict *req, const char *q_path,
     /* a show of 0 has no sense */
     /* a show of 0 has no sense */
     if (show == 0)
     if (show == 0)
         show = def_show;
         show = def_show;
+    if (show > max_show)
+        show = max_show;
 
 
     if (p_path == NULL) { /** public timeline **/
     if (p_path == NULL) { /** public timeline **/
         xs *h = xs_str_localtime(0, "%Y-%m.html");
         xs *h = xs_str_localtime(0, "%Y-%m.html");
@@ -4661,7 +4681,7 @@ int html_get_handler(const xs_dict *req, const char *q_path,
                (actor_id = xs_dict_get(actor_dict, "id")) != NULL &&
                (actor_id = xs_dict_get(actor_dict, "id")) != NULL &&
                valid_status(actor_get(actor_id, &actor))) {
                valid_status(actor_get(actor_id, &actor))) {
                 int more = 0;
                 int more = 0;
-                xs *list = timeline_list(&snac, "private", skip, show, &more);
+                xs *list = timeline_simple_list(&snac, "private", skip, show, &more);
 
 
                 *body   = html_people_one(&snac, actor_id, list, skip, show, more, page);
                 *body   = html_people_one(&snac, actor_id, list, skip, show, more, page);
                 *b_size = strlen(*body);
                 *b_size = strlen(*body);