diff options
| author | 2025-04-01 06:14:46 +0200 | |
|---|---|---|
| committer | 2025-04-01 06:14:46 +0200 | |
| commit | 5090e4e77489d7e4e2d358c417c83be8f76307cb (patch) | |
| tree | 99ac992b7388e4562e44661e4d9f8cc2e84e1613 | |
| parent | Some more work for future posts. (diff) | |
| download | snac2-5090e4e77489d7e4e2d358c417c83be8f76307cb.tar.gz snac2-5090e4e77489d7e4e2d358c417c83be8f76307cb.tar.xz snac2-5090e4e77489d7e4e2d358c417c83be8f76307cb.zip | |
Added more scheduling code.
| -rw-r--r-- | data.c | 37 | ||||
| -rw-r--r-- | html.c | 44 | ||||
| -rw-r--r-- | snac.h | 5 |
3 files changed, 84 insertions, 2 deletions
| @@ -1929,6 +1929,43 @@ xs_list *draft_list(snac *user) | |||
| 1929 | } | 1929 | } |
| 1930 | 1930 | ||
| 1931 | 1931 | ||
| 1932 | /** scheduled posts **/ | ||
| 1933 | |||
| 1934 | int is_scheduled(snac *user, const char *id) | ||
| 1935 | /* returns true if this note is scheduled for future sending */ | ||
| 1936 | { | ||
| 1937 | return object_user_cache_in(user, id, "sched"); | ||
| 1938 | } | ||
| 1939 | |||
| 1940 | |||
| 1941 | void schedule_del(snac *user, const char *id) | ||
| 1942 | /* deletes an scheduled post */ | ||
| 1943 | { | ||
| 1944 | object_user_cache_del(user, id, "sched"); | ||
| 1945 | } | ||
| 1946 | |||
| 1947 | |||
| 1948 | void schedule_add(snac *user, const char *id, const xs_dict *msg) | ||
| 1949 | /* schedules this post for later */ | ||
| 1950 | { | ||
| 1951 | /* delete from the index, in case it was already there */ | ||
| 1952 | schedule_del(user, id); | ||
| 1953 | |||
| 1954 | /* overwrite object */ | ||
| 1955 | object_add_ow(id, msg); | ||
| 1956 | |||
| 1957 | /* [re]add to the index */ | ||
| 1958 | object_user_cache_add(user, id, "sched"); | ||
| 1959 | } | ||
| 1960 | |||
| 1961 | |||
| 1962 | xs_list *scheduled_list(snac *user) | ||
| 1963 | /* return the list of scheduled posts */ | ||
| 1964 | { | ||
| 1965 | return object_user_cache_list(user, "sched", XS_ALL, 1); | ||
| 1966 | } | ||
| 1967 | |||
| 1968 | |||
| 1932 | /** hiding **/ | 1969 | /** hiding **/ |
| 1933 | 1970 | ||
| 1934 | xs_str *_hidden_fn(snac *snac, const char *id) | 1971 | xs_str *_hidden_fn(snac *snac, const char *id) |
| @@ -2870,6 +2870,18 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only, | |||
| 2870 | xs_html_text(L("drafts"))))); | 2870 | xs_html_text(L("drafts"))))); |
| 2871 | } | 2871 | } |
| 2872 | 2872 | ||
| 2873 | { | ||
| 2874 | /* show the list of scheduled posts */ | ||
| 2875 | xs *url = xs_fmt("%s/sched", user->actor); | ||
| 2876 | xs_html_add(lol, | ||
| 2877 | xs_html_tag("li", | ||
| 2878 | xs_html_tag("a", | ||
| 2879 | xs_html_attr("href", url), | ||
| 2880 | xs_html_attr("class", "snac-list-link"), | ||
| 2881 | xs_html_attr("title", L("Scheduled posts")), | ||
| 2882 | xs_html_text(L("scheduled posts"))))); | ||
| 2883 | } | ||
| 2884 | |||
| 2873 | /* the list of followed hashtags */ | 2885 | /* the list of followed hashtags */ |
| 2874 | const char *followed_hashtags = xs_dict_get(user->config, "followed_hashtags"); | 2886 | const char *followed_hashtags = xs_dict_get(user->config, "followed_hashtags"); |
| 2875 | 2887 | ||
| @@ -3919,6 +3931,21 @@ int html_get_handler(const xs_dict *req, const char *q_path, | |||
| 3919 | } | 3931 | } |
| 3920 | } | 3932 | } |
| 3921 | else | 3933 | else |
| 3934 | if (strcmp(p_path, "sched") == 0) { /** list of scheduled posts **/ | ||
| 3935 | if (!login(&snac, req)) { | ||
| 3936 | *body = xs_dup(uid); | ||
| 3937 | status = HTTP_STATUS_UNAUTHORIZED; | ||
| 3938 | } | ||
| 3939 | else { | ||
| 3940 | xs *list = scheduled_list(&snac); | ||
| 3941 | |||
| 3942 | *body = html_timeline(&snac, list, 0, skip, show, | ||
| 3943 | 0, L("Scheduled posts"), "", 0, error); | ||
| 3944 | *b_size = strlen(*body); | ||
| 3945 | status = HTTP_STATUS_OK; | ||
| 3946 | } | ||
| 3947 | } | ||
| 3948 | else | ||
| 3922 | if (xs_startswith(p_path, "list/")) { /** list timelines **/ | 3949 | if (xs_startswith(p_path, "list/")) { /** list timelines **/ |
| 3923 | if (!login(&snac, req)) { | 3950 | if (!login(&snac, req)) { |
| 3924 | *body = xs_dup(uid); | 3951 | *body = xs_dup(uid); |
| @@ -4342,7 +4369,7 @@ int html_post_handler(const xs_dict *req, const char *q_path, | |||
| 4342 | } | 4369 | } |
| 4343 | else | 4370 | else |
| 4344 | if (future_post) { | 4371 | if (future_post) { |
| 4345 | snac_log(&snac, xs_fmt("DUMMY scheduled post 1 %s", id)); | 4372 | schedule_add(&snac, id, msg); |
| 4346 | } | 4373 | } |
| 4347 | else { | 4374 | else { |
| 4348 | c_msg = msg_create(&snac, msg); | 4375 | c_msg = msg_create(&snac, msg); |
| @@ -4381,7 +4408,7 @@ int html_post_handler(const xs_dict *req, const char *q_path, | |||
| 4381 | object_add_ow(edit_id, msg); | 4408 | object_add_ow(edit_id, msg); |
| 4382 | 4409 | ||
| 4383 | if (future_post) { | 4410 | if (future_post) { |
| 4384 | snac_log(&snac, xs_fmt("DUMMY scheduled post 2 %s", edit_id)); | 4411 | schedule_add(&snac, edit_id, msg); |
| 4385 | } | 4412 | } |
| 4386 | else { | 4413 | else { |
| 4387 | c_msg = msg_create(&snac, msg); | 4414 | c_msg = msg_create(&snac, msg); |
| @@ -4390,7 +4417,15 @@ int html_post_handler(const xs_dict *req, const char *q_path, | |||
| 4390 | 4417 | ||
| 4391 | draft_del(&snac, edit_id); | 4418 | draft_del(&snac, edit_id); |
| 4392 | } | 4419 | } |
| 4420 | else | ||
| 4421 | if (is_scheduled(&snac, edit_id)) { | ||
| 4422 | /* editing an scheduled post; just update it */ | ||
| 4423 | schedule_add(&snac, edit_id, msg); | ||
| 4424 | } | ||
| 4393 | else { | 4425 | else { |
| 4426 | /* ignore the (possibly changed) published date */ | ||
| 4427 | msg = xs_dict_set(msg, "published", xs_dict_get(p_msg, "published")); | ||
| 4428 | |||
| 4394 | /* set the updated field */ | 4429 | /* set the updated field */ |
| 4395 | xs *updated = xs_str_utctime(0, ISO_DATE_SPEC); | 4430 | xs *updated = xs_str_utctime(0, ISO_DATE_SPEC); |
| 4396 | msg = xs_dict_set(msg, "updated", updated); | 4431 | msg = xs_dict_set(msg, "updated", updated); |
| @@ -4475,6 +4510,9 @@ int html_post_handler(const xs_dict *req, const char *q_path, | |||
| 4475 | if (is_draft(&snac, id)) | 4510 | if (is_draft(&snac, id)) |
| 4476 | draft_del(&snac, id); | 4511 | draft_del(&snac, id); |
| 4477 | else | 4512 | else |
| 4513 | if (is_scheduled(&snac, id)) | ||
| 4514 | schedule_del(&snac, id); | ||
| 4515 | else | ||
| 4478 | hide(&snac, id); | 4516 | hide(&snac, id); |
| 4479 | } | 4517 | } |
| 4480 | else | 4518 | else |
| @@ -4570,6 +4608,8 @@ int html_post_handler(const xs_dict *req, const char *q_path, | |||
| 4570 | 4608 | ||
| 4571 | draft_del(&snac, id); | 4609 | draft_del(&snac, id); |
| 4572 | 4610 | ||
| 4611 | schedule_del(&snac, id); | ||
| 4612 | |||
| 4573 | snac_log(&snac, xs_fmt("deleted entry %s", id)); | 4613 | snac_log(&snac, xs_fmt("deleted entry %s", id)); |
| 4574 | } | 4614 | } |
| 4575 | } | 4615 | } |
| @@ -205,6 +205,11 @@ void draft_del(snac *user, const char *id); | |||
| 205 | void draft_add(snac *user, const char *id, const xs_dict *msg); | 205 | void draft_add(snac *user, const char *id, const xs_dict *msg); |
| 206 | xs_list *draft_list(snac *user); | 206 | xs_list *draft_list(snac *user); |
| 207 | 207 | ||
| 208 | int is_scheduled(snac *user, const char *id); | ||
| 209 | void schedule_del(snac *user, const char *id); | ||
| 210 | void schedule_add(snac *user, const char *id, const xs_dict *msg); | ||
| 211 | xs_list *scheduled_list(snac *user); | ||
| 212 | |||
| 208 | int limited(snac *user, const char *id, int cmd); | 213 | int limited(snac *user, const char *id, int cmd); |
| 209 | #define is_limited(user, id) limited((user), (id), 0) | 214 | #define is_limited(user, id) limited((user), (id), 0) |
| 210 | #define limit(user, id) limited((user), (id), 1) | 215 | #define limit(user, id) limited((user), (id), 1) |