snac2

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

commit 5de52cb753abaab03e9405441542e73803c3fe08
parent 3099d179be9ffb38753e412480e23e5391913751
Author: default <nobody@localhost>
Date:   Fri,  7 Feb 2025 09:26:54 +0100

Added support for multiple attachments in the same post.

Diffstat:
Mhtml.c | 168+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 109 insertions(+), 59 deletions(-)

diff --git a/html.c b/html.c @@ -327,7 +327,7 @@ xs_html *html_note(snac *user, const char *summary, const xs_val *cw_yn, const char *cw_text, const xs_val *mnt_only, const char *redir, const char *in_reply_to, int poll, - const char *att_file, const char *att_alt_text, + const xs_list *att_files, const xs_list *att_alt_texts, int is_draft) /* Yes, this is a FUCKTON of arguments and I'm a bit embarrased */ { @@ -432,30 +432,71 @@ xs_html *html_note(snac *user, const char *summary, xs_html_tag("p", NULL), att = xs_html_tag("details", xs_html_tag("summary", - xs_html_text(L("Attachment..."))), + xs_html_text(L("Attachments..."))), xs_html_tag("p", NULL))); - if (att_file && *att_file) + int max_attachments = xs_number_get(xs_dict_get_def(srv_config, "max_attachments", "4")); + int att_n = 0; + + /* fields for the currently existing attachments */ + if (xs_is_list(att_files) && xs_is_list(att_alt_texts)) { + while (att_n < max_attachments) { + const char *att_file = xs_list_get(att_files, att_n); + const char *att_alt_text = xs_list_get(att_alt_texts, att_n); + + if (!xs_is_string(att_file) || !xs_is_string(att_alt_text)) + break; + + xs *att_lbl = xs_fmt("attach_url_%d", att_n); + xs *alt_lbl = xs_fmt("alt_text_%d", att_n); + + if (att_n) + xs_html_add(att, + xs_html_sctag("br", NULL)); + + xs_html_add(att, + xs_html_text(L("File:")), + xs_html_sctag("input", + xs_html_attr("type", "text"), + xs_html_attr("name", att_lbl), + xs_html_attr("title", L("Clear this field to delete the attachment")), + xs_html_attr("value", att_file))); + + xs_html_add(att, + xs_html_text(" "), + xs_html_sctag("input", + xs_html_attr("type", "text"), + xs_html_attr("name", alt_lbl), + xs_html_attr("value", att_alt_text), + xs_html_attr("placeholder", L("Attachment description")))); + + att_n++; + } + } + + /* the rest of possible attachments */ + while (att_n < max_attachments) { + xs *att_lbl = xs_fmt("attach_%d", att_n); + xs *alt_lbl = xs_fmt("alt_text_%d", att_n); + + if (att_n) + xs_html_add(att, + xs_html_sctag("br", NULL)); + xs_html_add(att, - xs_html_text(L("File:")), xs_html_sctag("input", - xs_html_attr("type", "text"), - xs_html_attr("name", "attach_url"), - xs_html_attr("title", L("Clear this field to delete the attachment")), - xs_html_attr("value", att_file))); - else + xs_html_attr("type", "file"), + xs_html_attr("name", att_lbl))); + xs_html_add(att, + xs_html_text(" "), xs_html_sctag("input", - xs_html_attr("type", "file"), - xs_html_attr("name", "attach"))); + xs_html_attr("type", "text"), + xs_html_attr("name", alt_lbl), + xs_html_attr("placeholder", L("Attachment description")))); - xs_html_add(att, - xs_html_text(" "), - xs_html_sctag("input", - xs_html_attr("type", "text"), - xs_html_attr("name", "alt_text"), - xs_html_attr("value", att_alt_text), - xs_html_attr("placeholder", L("Attachment description")))); + att_n++; + } /* add poll controls */ if (poll) { @@ -1059,7 +1100,7 @@ xs_html *html_top_controls(snac *snac) NULL, NULL, xs_stock(XSTYPE_FALSE), "", xs_stock(XSTYPE_FALSE), NULL, - NULL, 1, "", "", 0), + NULL, 1, NULL, NULL, 0), /** operations **/ xs_html_tag("details", @@ -1631,17 +1672,22 @@ xs_html *html_entry_controls(snac *snac, const char *actor, xs *form_id = xs_fmt("%s_edit_form", md5); xs *redir = xs_fmt("%s_entry", md5); - const char *att_file = ""; - const char *att_alt_text = ""; + xs *att_files = xs_list_new(); + xs *att_alt_texts = xs_list_new(); + const xs_list *att_list = xs_dict_get(msg, "attachment"); - /* does it have an attachment? */ - if (xs_type(att_list) == XSTYPE_LIST && xs_list_len(att_list)) { - const xs_dict *d = xs_list_get(att_list, 0); + if (xs_is_list(att_list)) { + const xs_dict *d; - if (xs_type(d) == XSTYPE_DICT) { - att_file = xs_dict_get_def(d, "url", ""); - att_alt_text = xs_dict_get_def(d, "name", ""); + xs_list_foreach(att_list, d) { + const char *att_file = xs_dict_get(d, "url"); + const char *att_alt_text = xs_dict_get(d, "name"); + + if (xs_is_string(att_file) && xs_is_string(att_alt_text)) { + att_files = xs_list_append(att_files, att_file); + att_alt_texts = xs_list_append(att_alt_texts, att_alt_text); + } } } @@ -1653,7 +1699,7 @@ xs_html *html_entry_controls(snac *snac, 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_file, att_alt_text, is_draft(snac, id))), + NULL, 0, att_files, att_alt_texts, is_draft(snac, id))), xs_html_tag("p", NULL)); } @@ -1672,7 +1718,7 @@ xs_html *html_entry_controls(snac *snac, 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, "", "", 0)), + id, 0, NULL, NULL, 0)), xs_html_tag("p", NULL)); } @@ -2938,7 +2984,7 @@ xs_html *html_people_list(snac *snac, xs_list *list, char *header, char *t, cons NULL, actor_id, xs_stock(XSTYPE_FALSE), "", xs_stock(XSTYPE_FALSE), NULL, - NULL, 0, "", "", 0), + NULL, 0, NULL, NULL, 0), xs_html_tag("p", NULL)); xs_html_add(snac_post, snac_controls); @@ -3966,52 +4012,56 @@ int html_post_handler(const xs_dict *req, const char *q_path, /* post note */ const xs_str *content = xs_dict_get(p_vars, "content"); const xs_str *in_reply_to = xs_dict_get(p_vars, "in_reply_to"); - const xs_str *attach_url = xs_dict_get(p_vars, "attach_url"); - const xs_list *attach_file = xs_dict_get(p_vars, "attach"); const xs_str *to = xs_dict_get(p_vars, "to"); const xs_str *sensitive = xs_dict_get(p_vars, "sensitive"); const xs_str *summary = xs_dict_get(p_vars, "summary"); const xs_str *edit_id = xs_dict_get(p_vars, "edit_id"); - const xs_str *alt_text = xs_dict_get(p_vars, "alt_text"); int priv = !xs_is_null(xs_dict_get(p_vars, "mentioned_only")); int store_as_draft = !xs_is_null(xs_dict_get(p_vars, "is_draft")); xs *attach_list = xs_list_new(); - /* default alt text */ - if (xs_is_null(alt_text)) - alt_text = ""; + /* iterate the attachments */ + int max_attachments = xs_number_get(xs_dict_get_def(srv_config, "max_attachments", "4")); - /* is attach_url set? */ - if (!xs_is_null(attach_url) && *attach_url != '\0') { - xs *l = xs_list_new(); + for (int att_n = 0; att_n < max_attachments; att_n++) { + xs *url_lbl = xs_fmt("attach_url_%d", att_n); + xs *att_lbl = xs_fmt("attach_%d", att_n); + xs *alt_lbl = xs_fmt("alt_text_%d", att_n); - l = xs_list_append(l, attach_url); - l = xs_list_append(l, alt_text); + const char *attach_url = xs_dict_get(p_vars, url_lbl); + const xs_list *attach_file = xs_dict_get(p_vars, att_lbl); + const char *alt_text = xs_dict_get_def(p_vars, alt_lbl, ""); - attach_list = xs_list_append(attach_list, l); - } + if (xs_is_string(attach_url) && *attach_url != '\0') { + xs *l = xs_list_new(); - /* is attach_file set? */ - if (!xs_is_null(attach_file) && xs_type(attach_file) == XSTYPE_LIST) { - const char *fn = xs_list_get(attach_file, 0); + l = xs_list_append(l, attach_url); + l = xs_list_append(l, alt_text); - if (*fn != '\0') { - char *ext = strrchr(fn, '.'); - xs *hash = xs_md5_hex(fn, strlen(fn)); - xs *id = xs_fmt("%s%s", hash, ext); - xs *url = xs_fmt("%s/s/%s", snac.actor, id); - int fo = xs_number_get(xs_list_get(attach_file, 1)); - int fs = xs_number_get(xs_list_get(attach_file, 2)); + attach_list = xs_list_append(attach_list, l); + } + else + if (xs_is_list(attach_file)) { + const char *fn = xs_list_get(attach_file, 0); - /* store */ - static_put(&snac, id, payload + fo, fs); + if (xs_is_string(fn) && *fn != '\0') { + char *ext = strrchr(fn, '.'); + xs *hash = xs_md5_hex(fn, strlen(fn)); + xs *id = xs_fmt("%s%s", hash, ext); + xs *url = xs_fmt("%s/s/%s", snac.actor, id); + int fo = xs_number_get(xs_list_get(attach_file, 1)); + int fs = xs_number_get(xs_list_get(attach_file, 2)); - xs *l = xs_list_new(); + /* store */ + static_put(&snac, id, payload + fo, fs); - l = xs_list_append(l, url); - l = xs_list_append(l, alt_text); + xs *l = xs_list_new(); - attach_list = xs_list_append(attach_list, l); + l = xs_list_append(l, url); + l = xs_list_append(l, alt_text); + + attach_list = xs_list_append(attach_list, l); + } } }