From 45357b8e6e36f973fc09c0a82a633e2d08b34eda Mon Sep 17 00:00:00 2001 From: default Date: Sun, 5 May 2024 11:00:29 +0200 Subject: [PATCH] New function timeline_to_rss(). --- html.c | 111 ++++++++++++++++++++++++++++++++------------------------- snac.h | 1 + 2 files changed, 63 insertions(+), 49 deletions(-) diff --git a/html.c b/html.c index 9de1cca..fe070c1 100644 --- a/html.c +++ b/html.c @@ -2728,55 +2728,7 @@ int html_get_handler(const xs_dict *req, const char *q_path, xs_dict_get(srv_config, "host")); xs *rss_link = xs_fmt("%s.rss", snac.actor); - xs_html *rss = xs_html_tag("rss", - xs_html_attr("version", "0.91")); - - xs_html *channel = xs_html_tag("channel", - xs_html_tag("title", - xs_html_text(rss_title)), - xs_html_tag("language", - xs_html_text("en")), - xs_html_tag("link", - xs_html_text(rss_link)), - xs_html_tag("description", - xs_html_text(bio))); - - xs_html_add(rss, channel); - - xs_list *p = elems; - char *v; - - while (xs_list_iter(&p, &v)) { - xs *msg = NULL; - - if (!valid_status(timeline_get_by_md5(&snac, v, &msg))) - continue; - - char *id = xs_dict_get(msg, "id"); - char *content = xs_dict_get(msg, "content"); - - if (!xs_startswith(id, snac.actor)) - continue; - - /* create a title with the first line of the content */ - xs *es_title = xs_replace(content, "
", "\n"); - xs *title = xs_str_new(NULL); - int i; - - for (i = 0; es_title[i] && es_title[i] != '\n' && es_title[i] != '&' && i < 50; i++) - title = xs_append_m(title, &es_title[i], 1); - - xs_html_add(channel, - xs_html_tag("item", - xs_html_tag("title", - xs_html_text(title)), - xs_html_tag("link", - xs_html_text(id)), - xs_html_tag("description", - xs_html_text(content)))); - } - - *body = xs_html_render_s(rss, "\n"); + *body = timeline_to_rss(&snac, elems, rss_title, rss_link, bio); *b_size = strlen(*body); *ctype = "application/rss+xml; charset=utf-8"; status = 200; @@ -3336,3 +3288,64 @@ int html_post_handler(const xs_dict *req, const char *q_path, return status; } + + +xs_str *timeline_to_rss(snac *user, const xs_list *timeline, char *title, char *link, char *desc) +/* converts a timeline to rss */ +{ + xs_html *rss = xs_html_tag("rss", + xs_html_attr("version", "0.91")); + + xs_html *channel = xs_html_tag("channel", + xs_html_tag("title", + xs_html_text(title)), + xs_html_tag("language", + xs_html_text("en")), + xs_html_tag("link", + xs_html_text(link)), + xs_html_tag("description", + xs_html_text(desc))); + + xs_html_add(rss, channel); + + int c = 0; + char *v; + + while (xs_list_next(timeline, &v, &c)) { + xs *msg = NULL; + + if (user) { + if (!valid_status(timeline_get_by_md5(user, v, &msg))) + continue; + } + else { + if (!valid_status(object_get_by_md5(v, &msg))) + continue; + } + + char *id = xs_dict_get(msg, "id"); + char *content = xs_dict_get(msg, "content"); + + if (user && !xs_startswith(id, user->actor)) + continue; + + /* create a title with the first line of the content */ + xs *es_title = xs_replace(content, "
", "\n"); + xs *title = xs_str_new(NULL); + int i; + + for (i = 0; es_title[i] && es_title[i] != '\n' && es_title[i] != '&' && i < 50; i++) + title = xs_append_m(title, &es_title[i], 1); + + xs_html_add(channel, + xs_html_tag("item", + xs_html_tag("title", + xs_html_text(title)), + xs_html_tag("link", + xs_html_text(id)), + xs_html_tag("description", + xs_html_text(content)))); + } + + return xs_html_render_s(rss, "\n"); +} diff --git a/snac.h b/snac.h index 721d088..ae6e975 100644 --- a/snac.h +++ b/snac.h @@ -324,6 +324,7 @@ int html_get_handler(const xs_dict *req, const char *q_path, int html_post_handler(const xs_dict *req, const char *q_path, char *payload, int p_size, char **body, int *b_size, char **ctype); +xs_str *timeline_to_rss(snac *user, const xs_list *timeline, char *title, char *link, char *desc); int snac_init(const char *_basedir); int adduser(const char *uid);