commit 5090e4e

default  ·  2025-04-01 04:14:46 +0000 UTC
parent 1e21c22
Added more scheduling code.
3 files changed,  +84, -2
M data.c
M html.c
M snac.h
M data.c
+37, -0
 1@@ -1929,6 +1929,43 @@ xs_list *draft_list(snac *user)
 2 }
 3 
 4 
 5+/** scheduled posts **/
 6+
 7+int is_scheduled(snac *user, const char *id)
 8+/* returns true if this note is scheduled for future sending */
 9+{
10+    return object_user_cache_in(user, id, "sched");
11+}
12+
13+
14+void schedule_del(snac *user, const char *id)
15+/* deletes an scheduled post */
16+{
17+    object_user_cache_del(user, id, "sched");
18+}
19+
20+
21+void schedule_add(snac *user, const char *id, const xs_dict *msg)
22+/* schedules this post for later */
23+{
24+    /* delete from the index, in case it was already there */
25+    schedule_del(user, id);
26+
27+    /* overwrite object */
28+    object_add_ow(id, msg);
29+
30+    /* [re]add to the index */
31+    object_user_cache_add(user, id, "sched");
32+}
33+
34+
35+xs_list *scheduled_list(snac *user)
36+/* return the list of scheduled posts */
37+{
38+    return object_user_cache_list(user, "sched", XS_ALL, 1);
39+}
40+
41+
42 /** hiding **/
43 
44 xs_str *_hidden_fn(snac *snac, const char *id)
M html.c
+42, -2
 1@@ -2870,6 +2870,18 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
 2                         xs_html_text(L("drafts")))));
 3         }
 4 
 5+        {
 6+            /* show the list of scheduled posts */
 7+            xs *url = xs_fmt("%s/sched", user->actor);
 8+            xs_html_add(lol,
 9+                xs_html_tag("li",
10+                    xs_html_tag("a",
11+                        xs_html_attr("href", url),
12+                        xs_html_attr("class", "snac-list-link"),
13+                        xs_html_attr("title", L("Scheduled posts")),
14+                        xs_html_text(L("scheduled posts")))));
15+        }
16+
17         /* the list of followed hashtags */
18         const char *followed_hashtags = xs_dict_get(user->config, "followed_hashtags");
19 
20@@ -3919,6 +3931,21 @@ int html_get_handler(const xs_dict *req, const char *q_path,
21         }
22     }
23     else
24+    if (strcmp(p_path, "sched") == 0) { /** list of scheduled posts **/
25+        if (!login(&snac, req)) {
26+            *body  = xs_dup(uid);
27+            status = HTTP_STATUS_UNAUTHORIZED;
28+        }
29+        else {
30+            xs *list = scheduled_list(&snac);
31+
32+            *body = html_timeline(&snac, list, 0, skip, show,
33+                0, L("Scheduled posts"), "", 0, error);
34+            *b_size = strlen(*body);
35+            status  = HTTP_STATUS_OK;
36+        }
37+    }
38+    else
39     if (xs_startswith(p_path, "list/")) { /** list timelines **/
40         if (!login(&snac, req)) {
41             *body  = xs_dup(uid);
42@@ -4342,7 +4369,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
43                 }
44                 else
45                 if (future_post) {
46-                    snac_log(&snac, xs_fmt("DUMMY scheduled post 1 %s", id));
47+                    schedule_add(&snac, id, msg);
48                 }
49                 else {
50                     c_msg = msg_create(&snac, msg);
51@@ -4381,7 +4408,7 @@ int html_post_handler(const xs_dict *req, const char *q_path,
52                         object_add_ow(edit_id, msg);
53 
54                         if (future_post) {
55-                            snac_log(&snac, xs_fmt("DUMMY scheduled post 2 %s", edit_id));
56+                            schedule_add(&snac, edit_id, msg);
57                         }
58                         else {
59                             c_msg = msg_create(&snac, msg);
60@@ -4390,7 +4417,15 @@ int html_post_handler(const xs_dict *req, const char *q_path,
61 
62                         draft_del(&snac, edit_id);
63                     }
64+                    else
65+                    if (is_scheduled(&snac, edit_id)) {
66+                        /* editing an scheduled post; just update it */
67+                        schedule_add(&snac, edit_id, msg);
68+                    }
69                     else {
70+                        /* ignore the (possibly changed) published date */
71+                        msg = xs_dict_set(msg, "published", xs_dict_get(p_msg, "published"));
72+
73                         /* set the updated field */
74                         xs *updated = xs_str_utctime(0, ISO_DATE_SPEC);
75                         msg = xs_dict_set(msg, "updated", updated);
76@@ -4474,6 +4509,9 @@ int html_post_handler(const xs_dict *req, const char *q_path,
77         if (strcmp(action, L("Hide")) == 0) { /** **/
78             if (is_draft(&snac, id))
79                 draft_del(&snac, id);
80+            else
81+            if (is_scheduled(&snac, id))
82+                schedule_del(&snac, id);
83             else
84                 hide(&snac, id);
85         }
86@@ -4570,6 +4608,8 @@ int html_post_handler(const xs_dict *req, const char *q_path,
87 
88                 draft_del(&snac, id);
89 
90+                schedule_del(&snac, id);
91+
92                 snac_log(&snac, xs_fmt("deleted entry %s", id));
93             }
94         }
M snac.h
+5, -0
 1@@ -205,6 +205,11 @@ void draft_del(snac *user, const char *id);
 2 void draft_add(snac *user, const char *id, const xs_dict *msg);
 3 xs_list *draft_list(snac *user);
 4 
 5+int is_scheduled(snac *user, const char *id);
 6+void schedule_del(snac *user, const char *id);
 7+void schedule_add(snac *user, const char *id, const xs_dict *msg);
 8+xs_list *scheduled_list(snac *user);
 9+
10 int limited(snac *user, const char *id, int cmd);
11 #define is_limited(user, id) limited((user), (id), 0)
12 #define limit(user, id) limited((user), (id), 1)