default 1 год назад
Родитель
Сommit
5090e4e774
3 измененных файлов с 84 добавлено и 2 удалено
  1. 37 0
      data.c
  2. 42 2
      html.c
  3. 5 0
      snac.h

+ 37 - 0
data.c

@@ -1929,6 +1929,43 @@ xs_list *draft_list(snac *user)
 }
 
 
+/** scheduled posts **/
+
+int is_scheduled(snac *user, const char *id)
+/* returns true if this note is scheduled for future sending */
+{
+    return object_user_cache_in(user, id, "sched");
+}
+
+
+void schedule_del(snac *user, const char *id)
+/* deletes an scheduled post */
+{
+    object_user_cache_del(user, id, "sched");
+}
+
+
+void schedule_add(snac *user, const char *id, const xs_dict *msg)
+/* schedules this post for later */
+{
+    /* delete from the index, in case it was already there */
+    schedule_del(user, id);
+
+    /* overwrite object */
+    object_add_ow(id, msg);
+
+    /* [re]add to the index */
+    object_user_cache_add(user, id, "sched");
+}
+
+
+xs_list *scheduled_list(snac *user)
+/* return the list of scheduled posts */
+{
+    return object_user_cache_list(user, "sched", XS_ALL, 1);
+}
+
+
 /** hiding **/
 
 xs_str *_hidden_fn(snac *snac, const char *id)

+ 42 - 2
html.c

@@ -2870,6 +2870,18 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
                         xs_html_text(L("drafts")))));
         }
 
+        {
+            /* show the list of scheduled posts */
+            xs *url = xs_fmt("%s/sched", user->actor);
+            xs_html_add(lol,
+                xs_html_tag("li",
+                    xs_html_tag("a",
+                        xs_html_attr("href", url),
+                        xs_html_attr("class", "snac-list-link"),
+                        xs_html_attr("title", L("Scheduled posts")),
+                        xs_html_text(L("scheduled posts")))));
+        }
+
         /* the list of followed hashtags */
         const char *followed_hashtags = xs_dict_get(user->config, "followed_hashtags");
 
@@ -3919,6 +3931,21 @@ int html_get_handler(const xs_dict *req, const char *q_path,
         }
     }
     else
+    if (strcmp(p_path, "sched") == 0) { /** list of scheduled posts **/
+        if (!login(&snac, req)) {
+            *body  = xs_dup(uid);
+            status = HTTP_STATUS_UNAUTHORIZED;
+        }
+        else {
+            xs *list = scheduled_list(&snac);
+
+            *body = html_timeline(&snac, list, 0, skip, show,
+                0, L("Scheduled posts"), "", 0, error);
+            *b_size = strlen(*body);
+            status  = HTTP_STATUS_OK;
+        }
+    }
+    else
     if (xs_startswith(p_path, "list/")) { /** list timelines **/
         if (!login(&snac, req)) {
             *body  = xs_dup(uid);
@@ -4342,7 +4369,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
                 }
                 else
                 if (future_post) {
-                    snac_log(&snac, xs_fmt("DUMMY scheduled post 1 %s", id));
+                    schedule_add(&snac, id, msg);
                 }
                 else {
                     c_msg = msg_create(&snac, msg);
@@ -4381,7 +4408,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
                         object_add_ow(edit_id, msg);
 
                         if (future_post) {
-                            snac_log(&snac, xs_fmt("DUMMY scheduled post 2 %s", edit_id));
+                            schedule_add(&snac, edit_id, msg);
                         }
                         else {
                             c_msg = msg_create(&snac, msg);
@@ -4390,7 +4417,15 @@ int html_post_handler(const xs_dict *req, const char *q_path,
 
                         draft_del(&snac, edit_id);
                     }
+                    else
+                    if (is_scheduled(&snac, edit_id)) {
+                        /* editing an scheduled post; just update it */
+                        schedule_add(&snac, edit_id, msg);
+                    }
                     else {
+                        /* ignore the (possibly changed) published date */
+                        msg = xs_dict_set(msg, "published", xs_dict_get(p_msg, "published"));
+
                         /* set the updated field */
                         xs *updated = xs_str_utctime(0, ISO_DATE_SPEC);
                         msg = xs_dict_set(msg, "updated", updated);
@@ -4474,6 +4509,9 @@ int html_post_handler(const xs_dict *req, const char *q_path,
         if (strcmp(action, L("Hide")) == 0) { /** **/
             if (is_draft(&snac, id))
                 draft_del(&snac, id);
+            else
+            if (is_scheduled(&snac, id))
+                schedule_del(&snac, id);
             else
                 hide(&snac, id);
         }
@@ -4570,6 +4608,8 @@ int html_post_handler(const xs_dict *req, const char *q_path,
 
                 draft_del(&snac, id);
 
+                schedule_del(&snac, id);
+
                 snac_log(&snac, xs_fmt("deleted entry %s", id));
             }
         }

+ 5 - 0
snac.h

@@ -205,6 +205,11 @@ void draft_del(snac *user, const char *id);
 void draft_add(snac *user, const char *id, const xs_dict *msg);
 xs_list *draft_list(snac *user);
 
+int is_scheduled(snac *user, const char *id);
+void schedule_del(snac *user, const char *id);
+void schedule_add(snac *user, const char *id, const xs_dict *msg);
+xs_list *scheduled_list(snac *user);
+
 int limited(snac *user, const char *id, int cmd);
 #define is_limited(user, id) limited((user), (id), 0)
 #define limit(user, id) limited((user), (id), 1)