Merge branch 'master' into style-tweaks-on-2.52

This commit is contained in:
Kelson Vibber 2024-05-09 04:42:35 +00:00
commit c17a225ce2
5 changed files with 89 additions and 38 deletions

37
data.c
View file

@ -1829,6 +1829,19 @@ xs_val *list_maint(snac *user, const char *list, int op)
} }
} }
break;
case 3: /** get list name **/
if (xs_is_hex(list)) {
FILE *f;
xs *fn = xs_fmt("%s/list/%s.id", user->basedir, list);
if ((f = fopen(fn, "r")) != NULL) {
l = xs_strip_i(xs_readline(f));
fclose(f);
}
}
break; break;
} }
@ -1836,6 +1849,23 @@ xs_val *list_maint(snac *user, const char *list, int op)
} }
xs_list *list_timeline(snac *user, const char *list, int skip, int show)
/* returns the timeline of a list */
{
xs_list *l = NULL;
if (!xs_is_hex(list))
return NULL;
xs *fn = xs_fmt("%s/list/%s.idx", user->basedir, list);
if (mtime(fn) > 0.0)
l = index_list_desc(fn, skip, show);
return l;
}
xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op) xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op)
/* list content management */ /* list content management */
{ {
@ -1869,11 +1899,8 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op
break; break;
case 3: /** list timeline **/ default:
fn = xs_replace_i(fn, ".lst", ".idx"); srv_log(xs_fmt("ERROR: list_content: bad op %d", op));
l = index_list_desc(fn, 0, 2048);
break; break;
} }

75
html.c
View file

@ -509,7 +509,7 @@ xs_html *html_instance_head(void)
} }
static xs_html *html_instance_body(char *tag) static xs_html *html_instance_body(void)
{ {
char *host = xs_dict_get(srv_config, "host"); char *host = xs_dict_get(srv_config, "host");
char *sdesc = xs_dict_get(srv_config, "short_description"); char *sdesc = xs_dict_get(srv_config, "short_description");
@ -560,16 +560,6 @@ static xs_html *html_instance_body(char *tag)
xs_html_text(handle))))); xs_html_text(handle)))));
} }
{
xs *l = tag ? xs_fmt(L("Search results for #%s"), tag) :
xs_dup(L("Recent posts by users in this instance"));
xs_html_add(body,
xs_html_tag("h2",
xs_html_attr("class", "snac-header"),
xs_html_text(l)));
}
return body; return body;
} }
@ -1265,8 +1255,8 @@ xs_html *html_entry_controls(snac *snac, char *actor, const xs_dict *msg, const
} }
if (is_msg_public(msg)) { if (is_msg_public(msg)) {
if (strcmp(actor, snac->actor) == 0 || xs_list_in(boosts, snac->md5) == -1) { if (xs_list_in(boosts, snac->md5) == -1) {
/* not already boosted or us; add button */ /* not already boosted; add button */
xs_html_add(form, xs_html_add(form,
html_button("boost", L("Boost"), L("Announce this post to your followers"))); html_button("boost", L("Boost"), L("Announce this post to your followers")));
} }
@ -1996,7 +1986,7 @@ xs_html *html_footer(void)
xs_str *html_timeline(snac *user, const xs_list *list, int read_only, xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
int skip, int show, int show_more, int skip, int show, int show_more,
char *tag, char *page, int utl) char *title, char *page, int utl)
/* returns the HTML for the timeline */ /* returns the HTML for the timeline */
{ {
xs_list *p = (xs_list *)list; xs_list *p = (xs_list *)list;
@ -2026,7 +2016,7 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
} }
else { else {
head = html_instance_head(); head = html_instance_head();
body = html_instance_body(tag); body = html_instance_body();
} }
xs_html *html = xs_html_tag("html", xs_html *html = xs_html_tag("html",
@ -2037,6 +2027,13 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
xs_html_add(body, xs_html_add(body,
html_top_controls(user)); html_top_controls(user));
if (title) {
xs_html_add(body,
xs_html_tag("h2",
xs_html_attr("class", "snac-header"),
xs_html_text(title)));
}
xs_html_add(body, xs_html_add(body,
xs_html_tag("a", xs_html_tag("a",
xs_html_attr("name", "snac-posts"))); xs_html_attr("name", "snac-posts")));
@ -2126,25 +2123,22 @@ xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
} }
if (show_more) { if (show_more) {
xs *t = NULL;
xs *m = NULL; xs *m = NULL;
xs *ss = xs_fmt("skip=%d&show=%d", skip + show, show); xs *ss = xs_fmt("skip=%d&show=%d", skip + show, show);
xs *url = page == NULL || user == NULL ? xs *url = xs_dup(user == NULL ? srv_baseurl : user->actor);
xs_dup(srv_baseurl) : xs_fmt("%s%s", user->actor, page);
if (tag) { if (page != NULL)
t = xs_fmt("%s?t=%s", url, tag); url = xs_str_cat(url, page);
m = xs_fmt("%s&%s", t, ss);
} if (xs_str_in(url, "?") != -1)
else { m = xs_fmt("%s&%s", url, ss);
t = xs_dup(url); else
m = xs_fmt("%s?%s", t, ss); m = xs_fmt("%s?%s", url, ss);
}
xs_html *more_links = xs_html_tag("p", xs_html *more_links = xs_html_tag("p",
xs_html_tag("a", xs_html_tag("a",
xs_html_attr("href", t), xs_html_attr("href", url),
xs_html_attr("name", "snac-more"), xs_html_attr("name", "snac-more"),
xs_html_text(L("Back to top"))), xs_html_text(L("Back to top"))),
xs_html_text(" - "), xs_html_text(" - "),
@ -2652,12 +2646,37 @@ int html_get_handler(const xs_dict *req, const char *q_path,
xs *next = timeline_instance_list(skip + show, 1); xs *next = timeline_instance_list(skip + show, 1);
*body = html_timeline(&snac, list, 0, skip, show, *body = html_timeline(&snac, list, 0, skip, show,
xs_list_len(next), NULL, "/instance", 0); xs_list_len(next), L("Showing instance timeline"), "/instance", 0);
*b_size = strlen(*body); *b_size = strlen(*body);
status = 200; status = 200;
} }
} }
else else
if (xs_startswith(p_path, "list/")) { /** list timelines **/
if (!login(&snac, req)) {
*body = xs_dup(uid);
status = 401;
}
else {
xs *l = xs_split(p_path, "/");
char *lid = xs_list_get(l, -1);
xs *list = list_timeline(&snac, lid, skip, show);
xs *next = list_timeline(&snac, lid, skip + show, 1);
if (list != NULL) {
xs *base = xs_fmt("/list/%s", lid);
xs *name = list_maint(&snac, lid, 3);
xs *title = xs_fmt(L("Showing timeline for list %s"), name);
*body = html_timeline(&snac, list, 0, skip, show,
xs_list_len(next), title, base, 1);
*b_size = strlen(*body);
status = 200;
}
}
}
else
if (xs_startswith(p_path, "p/")) { /** a timeline with just one entry **/ if (xs_startswith(p_path, "p/")) { /** a timeline with just one entry **/
if (xs_type(xs_dict_get(snac.config, "private")) == XSTYPE_TRUE) if (xs_type(xs_dict_get(snac.config, "private")) == XSTYPE_TRUE)
return 403; return 403;

10
httpd.c
View file

@ -200,14 +200,18 @@ int server_get_handler(xs_dict *req, const char *q_path,
*body = timeline_to_rss(NULL, tl, link, link, link); *body = timeline_to_rss(NULL, tl, link, link, link);
*ctype = "application/rss+xml; charset=utf-8"; *ctype = "application/rss+xml; charset=utf-8";
} }
else else {
*body = html_timeline(NULL, tl, 0, skip, show, more, t, NULL, 0); xs *page = xs_fmt("?t=%s", t);
xs *title = xs_fmt(L("Search results for #%s"), t);
*body = html_timeline(NULL, tl, 0, skip, show, more, title, page, 0);
}
} }
else else
if (xs_type(xs_dict_get(srv_config, "show_instance_timeline")) == XSTYPE_TRUE) { if (xs_type(xs_dict_get(srv_config, "show_instance_timeline")) == XSTYPE_TRUE) {
/** instance timeline **/ /** instance timeline **/
xs *tl = timeline_instance_list(0, 30); xs *tl = timeline_instance_list(0, 30);
*body = html_timeline(NULL, tl, 0, 0, 0, 0, NULL, NULL, 0); *body = html_timeline(NULL, tl, 0, 0, 0, 0,
L("Recent posts by users in this instance"), NULL, 0);
} }
else else
*body = greeting_html(); *body = greeting_html();

View file

@ -1669,7 +1669,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
xs *l = xs_split(cmd, "/"); xs *l = xs_split(cmd, "/");
char *list = xs_list_get(l, -1); char *list = xs_list_get(l, -1);
xs *timeline = list_content(&snac1, list, NULL, 3); xs *timeline = list_timeline(&snac1, list, 0, 2048);
xs *out = xs_list_new(); xs *out = xs_list_new();
int c = 0; int c = 0;
char *md5; char *md5;

3
snac.h
View file

@ -175,6 +175,7 @@ void tag_index(const char *id, const xs_dict *obj);
xs_list *tag_search(char *tag, int skip, int show); xs_list *tag_search(char *tag, int skip, int show);
xs_val *list_maint(snac *user, const char *list, int op); xs_val *list_maint(snac *user, const char *list, int op);
xs_list *list_timeline(snac *user, const char *list, int skip, int show);
xs_val *list_content(snac *user, const char *list_id, const char *actor_md5, int op); xs_val *list_content(snac *user, const char *list_id, const char *actor_md5, int op);
void list_distribute(snac *user, const char *who, const xs_dict *post); void list_distribute(snac *user, const char *who, const xs_dict *post);
@ -317,7 +318,7 @@ xs_str *encode_html(const char *str);
xs_str *html_timeline(snac *user, const xs_list *list, int read_only, xs_str *html_timeline(snac *user, const xs_list *list, int read_only,
int skip, int show, int show_more, int skip, int show, int show_more,
char *tag, char *page, int utl); char *title, char *page, int utl);
int html_get_handler(const xs_dict *req, const char *q_path, int html_get_handler(const xs_dict *req, const char *q_path,
char **body, int *b_size, char **ctype, xs_str **etag); char **body, int *b_size, char **ctype, xs_str **etag);