New function html_msg_icon().

This commit is contained in:
default 2022-09-28 07:05:23 +02:00
parent b3b15cec29
commit fc6a125146
2 changed files with 149 additions and 1 deletions

147
html.c
View file

@ -142,9 +142,154 @@ int login(snac *snac, char *headers)
} }
d_char *html_msg_icon(snac *snac, d_char *s, char *msg)
{
char *actor_id;
xs *actor = NULL;
if ((actor_id = xs_dict_get(msg, "attributedTo")) == NULL)
actor_id = xs_dict_get(msg, "actor");
if (actor_id && valid_status(actor_get(snac, actor_id, &actor))) {
xs *name = NULL;
xs *avatar = NULL;
char *v;
/* get the name */
if ((v = xs_dict_get(actor, "name")) == NULL) {
if ((v = xs_dict_get(actor, "preferredUsername")) == NULL) {
v = "user";
}
}
name = xs_dup(v);
/* get the avatar */
if ((v = xs_dict_get(actor, "icon")) != NULL &&
(v = xs_dict_get(v, "url")) != NULL) {
avatar = xs_dup(v);
}
if (avatar == NULL)
avatar = xs_fmt("data:image/png;base64, %s", susie);
{
xs *s1 = xs_fmt("<p><img class=\"snac-avatar\" src=\"%s\"/>\n", avatar);
s = xs_str_cat(s, s1);
}
{
xs *s1 = xs_fmt("<a href=\"%s\" class=\"p-author h-card snac-author\">%s</a>",
actor, name);
s = xs_str_cat(s, s1);
}
if (strcmp(xs_dict_get(msg, "type"), "Note") == 0) {
xs *s1 = xs_fmt(" <a href=\"%s\">»</a>", xs_dict_get(msg, "id"));
s = xs_str_cat(s, s1);
}
if (!is_msg_public(snac, msg))
s = xs_str_cat(s, " <span title=\"private\">&#128274;</span>");
if ((v = xs_dict_get(msg, "published")) == NULL)
v = "&nbsp;";
{
xs *s1 = xs_fmt("<br>\n<time class=\"dt-published snac-pubdate\">%s</time>\n", v);
s = xs_str_cat(s, s1);
}
s = xs_str_cat(s, "</div>\n");
}
return s;
}
d_char *html_timeline(snac *snac, char *list, int local)
/* returns the HTML for the timeline */
{
d_char *s = xs_str_new(NULL);
s = xs_str_cat(s, "<!DOCTYPE html>\n<html>\n");
s = xs_str_cat(s, "<h1>HI</h1>\n");
s = xs_str_cat(s, xs_fmt("len() == %d\n", xs_list_len(list)));
{
char *i = xs_list_get(list, 0);
xs *msg = timeline_get(snac, i);
s = html_msg_icon(snac, s, msg);
}
s = xs_str_cat(s, "</html>\n");
return s;
}
int html_get_handler(d_char *req, char *q_path, char **body, int *b_size, char **ctype) int html_get_handler(d_char *req, char *q_path, char **body, int *b_size, char **ctype)
{ {
int status = 0; int status = 404;
snac snac;
char *uid, *p_path;
xs *l = xs_split_n(q_path, "/", 2);
uid = xs_list_get(l, 1);
if (!uid || !user_open(&snac, uid)) {
/* invalid user */
srv_log(xs_fmt("html_get_handler bad user %s", uid));
return 404;
}
p_path = xs_list_get(l, 2);
if (p_path == NULL) {
/* public timeline */
xs *list = local_list(&snac, 0xfffffff);
*body = html_timeline(&snac, list, 1);
*b_size = strlen(*body);
status = 200;
}
else
if (strcmp(p_path, "admin") == 0) {
/* private timeline */
if (!login(&snac, req))
status = 401;
else {
xs *list = timeline_list(&snac, 0xfffffff);
*body = html_timeline(&snac, list, 0);
*b_size = strlen(*body);
status = 200;
}
}
else
if (xs_startswith(p_path, "p/") == 0) {
/* a timeline with just one entry */
}
else
if (xs_startswith(p_path, "s/") == 0) {
/* a static file */
}
else
if (xs_startswith(p_path, "h/") == 0) {
/* an entry from the history */
}
else
status = 404;
user_free(&snac);
if (valid_status(status)) {
*ctype = "text/html; charset=utf-8";
}
return status; return status;
} }

3
snac.h
View file

@ -12,6 +12,8 @@ extern int srv_running;
extern int dbglevel; extern int dbglevel;
extern const char *susie;
#define valid_status(status) ((status) >= 200 && (status) <= 299) #define valid_status(status) ((status) >= 200 && (status) <= 299)
d_char *xs_time(char *fmt, int local); d_char *xs_time(char *fmt, int local);
@ -102,6 +104,7 @@ int activitypub_request(snac *snac, char *url, d_char **data);
int actor_request(snac *snac, char *actor, d_char **data); int actor_request(snac *snac, char *actor, d_char **data);
int send_to_inbox(snac *snac, char *inbox, char *msg, d_char **payload, int *p_size); int send_to_inbox(snac *snac, char *inbox, char *msg, d_char **payload, int *p_size);
int send_to_actor(snac *snac, char *actor, char *msg, d_char **payload, int *p_size); int send_to_actor(snac *snac, char *actor, char *msg, d_char **payload, int *p_size);
int is_msg_public(snac *snac, char *msg);
void process_queue(snac *snac); void process_queue(snac *snac);
void post(snac *snac, char *msg); void post(snac *snac, char *msg);
int activitypub_get_handler(d_char *req, char *q_path, int activitypub_get_handler(d_char *req, char *q_path,