snac2

Fork of https://codeberg.org/grunfink/snac2
git clone https://git.inz.fi/snac2
Log | Files | Refs | README | LICENSE

commit 1e21c2271e0ae55dbe69ce9ff033589a239a3f95
parent e8b00b31906e316598e26e92a9b156a42ff5a860
Author: default <nobody@localhost>
Date:   Tue,  1 Apr 2025 05:47:08 +0200

Some more work for future posts.

Diffstat:
Mhtml.c | 111++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 67 insertions(+), 44 deletions(-)

diff --git a/html.c b/html.c @@ -350,7 +350,7 @@ xs_html *html_note(snac *user, const char *summary, const xs_val *mnt_only, const char *redir, const char *in_reply_to, int poll, const xs_list *att_files, const xs_list *att_alt_texts, - int is_draft) + int is_draft, const char *published) /* Yes, this is a FUCKTON of arguments and I'm a bit embarrased */ { xs *action = xs_fmt("%s/admin/note", user->actor); @@ -440,6 +440,34 @@ xs_html *html_note(snac *user, const char *summary, xs_html_attr("name", "is_draft"), xs_html_attr(is_draft ? "checked" : "", NULL)))); + /* post date and time */ + xs *post_date = NULL; + xs *post_time = NULL; + + if (xs_is_string(published)) { + time_t t = xs_parse_iso_date(published, 0); + + if (t > 0) { + post_date = xs_str_time(t, "%Y-%m-%d", 1); + post_time = xs_str_time(t, "%H:%M:%S", 1); + } + } + + xs_html_add(form, + xs_html_tag("p", + xs_html_text(L("Post date and time (empty, right now; in the future, schedule for later):")), + xs_html_sctag("br", NULL), + xs_html_sctag("input", + xs_html_attr("type", "date"), + xs_html_attr("value", post_date ? post_date : ""), + xs_html_attr("name", "post_date")), + xs_html_text(" "), + xs_html_sctag("input", + xs_html_attr("type", "time"), + xs_html_attr("value", post_time ? post_time : ""), + xs_html_attr("step", "1"), + xs_html_attr("name", "post_time")))); + if (edit_id) xs_html_add(form, xs_html_sctag("input", @@ -559,30 +587,6 @@ xs_html *html_note(snac *user, const char *summary, xs_html_text(L("End in 1 day")))))); } -#if 0 - /* scheduled post data */ - xs *sched_date = xs_dup(""); - xs *sched_time = xs_dup(""); - - xs_html_add(form, - xs_html_tag("p", NULL), - xs_html_tag("details", - xs_html_tag("summary", - xs_html_text(L("Scheduled post..."))), - xs_html_tag("p", - xs_html_text(L("Post date: ")), - xs_html_sctag("input", - xs_html_attr("type", "date"), - xs_html_attr("value", sched_date), - xs_html_attr("name", "post_date")), - xs_html_text(" "), - xs_html_text(L("Post time: ")), - xs_html_sctag("input", - xs_html_attr("type", "time"), - xs_html_attr("value", sched_time), - xs_html_attr("name", "post_time"))))); -#endif - xs_html_add(form, xs_html_tag("p", NULL), xs_html_sctag("input", @@ -1151,7 +1155,7 @@ xs_html *html_top_controls(snac *user) NULL, NULL, xs_stock(XSTYPE_FALSE), "", xs_stock(XSTYPE_FALSE), NULL, - NULL, 1, NULL, NULL, 0), + NULL, 1, NULL, NULL, 0, NULL), /** operations **/ xs_html_tag("details", @@ -1809,7 +1813,8 @@ xs_html *html_entry_controls(snac *user, const char *actor, id, NULL, xs_dict_get(msg, "sensitive"), xs_dict_get(msg, "summary"), xs_stock(is_msg_public(msg) ? XSTYPE_FALSE : XSTYPE_TRUE), redir, - NULL, 0, att_files, att_alt_texts, is_draft(user, id))), + NULL, 0, att_files, att_alt_texts, is_draft(user, id), + xs_dict_get(msg, "published"))), xs_html_tag("p", NULL)); } @@ -1828,7 +1833,7 @@ xs_html *html_entry_controls(snac *user, const char *actor, NULL, NULL, xs_dict_get(msg, "sensitive"), xs_dict_get(msg, "summary"), xs_stock(is_msg_public(msg) ? XSTYPE_FALSE : XSTYPE_TRUE), redir, - id, 0, NULL, NULL, 0)), + id, 0, NULL, NULL, 0, NULL)), xs_html_tag("p", NULL)); } @@ -3165,7 +3170,7 @@ xs_html *html_people_list(snac *user, xs_list *list, const char *header, const c NULL, actor_id, xs_stock(XSTYPE_FALSE), "", xs_stock(XSTYPE_FALSE), NULL, - NULL, 0, NULL, NULL, 0), + NULL, 0, NULL, NULL, 0, NULL), xs_html_tag("p", NULL)); xs_html_add(snac_post, snac_controls); @@ -4305,23 +4310,29 @@ int html_post_handler(const xs_dict *req, const char *q_path, msg = xs_dict_set(msg, "summary", xs_is_null(summary) ? "..." : summary); } - if (*post_date) { - /* scheduled post */ - xs *sched_date = xs_fmt("%sT%s:00", post_date, *post_time ? post_time : "12:00"); - time_t t = xs_parse_localtime(sched_date, "%Y-%m-%dT%H:%M:%S"); + if (xs_is_string(post_date) && *post_date) { + xs *local_pubdate = xs_fmt("%sT%s", post_date, + xs_is_string(post_time) && *post_time ? post_time : "00:00:00"); + + time_t t = xs_parse_iso_date(local_pubdate, 1); if (t != 0) { xs *iso_date = xs_str_iso_date(t); msg = xs_dict_set(msg, "published", iso_date); - snac_debug(&snac, 1, xs_fmt("Scheduled date: [%s]", iso_date)); - } - else { - snac_log(&snac, xs_fmt("Invalid scheduled date: [%s]", sched_date)); - post_date = ""; + snac_debug(&snac, 1, xs_fmt("Published date: [%s]", iso_date)); } + else + snac_log(&snac, xs_fmt("Invalid post date: [%s]", local_pubdate)); } + /* is the published date from the future? */ + int future_post = 0; + xs *right_now = xs_str_utctime(0, ISO_DATE_SPEC); + + if (strcmp(xs_dict_get(msg, "published"), right_now) > 0) + future_post = 1; + if (xs_is_null(edit_id)) { /* new message */ const char *id = xs_dict_get(msg, "id"); @@ -4329,6 +4340,10 @@ int html_post_handler(const xs_dict *req, const char *q_path, if (store_as_draft) { draft_add(&snac, id, msg); } + else + if (future_post) { + snac_log(&snac, xs_fmt("DUMMY scheduled post 1 %s", id)); + } else { c_msg = msg_create(&snac, msg); timeline_add(&snac, id, msg); @@ -4340,7 +4355,7 @@ int html_post_handler(const xs_dict *req, const char *q_path, if (valid_status(object_get(edit_id, &p_msg))) { /* copy relevant fields from previous version */ - char *fields[] = { "id", "context", "url", "published", + char *fields[] = { "id", "context", "url", "to", "inReplyTo", NULL }; int n; @@ -4356,15 +4371,23 @@ int html_post_handler(const xs_dict *req, const char *q_path, if (is_draft(&snac, edit_id)) { /* message was previously a draft; it's a create activity */ - /* set the published field to now */ - xs *published = xs_str_utctime(0, ISO_DATE_SPEC); - msg = xs_dict_set(msg, "published", published); + /* if the date is from the past, overwrite it with right_now */ + if (strcmp(xs_dict_get(msg, "published"), right_now) < 0) { + snac_debug(&snac, 1, xs_fmt("setting draft ancient date to %s", right_now)); + msg = xs_dict_set(msg, "published", right_now); + } /* overwrite object */ object_add_ow(edit_id, msg); - c_msg = msg_create(&snac, msg); - timeline_add(&snac, edit_id, msg); + if (future_post) { + snac_log(&snac, xs_fmt("DUMMY scheduled post 2 %s", edit_id)); + } + else { + c_msg = msg_create(&snac, msg); + timeline_add(&snac, edit_id, msg); + } + draft_del(&snac, edit_id); } else {