diff --git a/html.c b/html.c
index 8745c8b..7f8e990 100644
--- a/html.c
+++ b/html.c
@@ -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("
\n", avatar);
+ s = xs_str_cat(s, s1);
+ }
+
+ {
+ xs *s1 = xs_fmt("%s",
+ actor, name);
+ s = xs_str_cat(s, s1);
+ }
+
+ if (strcmp(xs_dict_get(msg, "type"), "Note") == 0) {
+ xs *s1 = xs_fmt(" ยป", xs_dict_get(msg, "id"));
+ s = xs_str_cat(s, s1);
+ }
+
+ if (!is_msg_public(snac, msg))
+ s = xs_str_cat(s, " 🔒");
+
+ if ((v = xs_dict_get(msg, "published")) == NULL)
+ v = " ";
+
+ {
+ xs *s1 = xs_fmt("
\n\n", v);
+ s = xs_str_cat(s, s1);
+ }
+
+ s = xs_str_cat(s, "\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, "\n\n");
+
+ s = xs_str_cat(s, "
HI
\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, "\n");
+
+ return s;
+}
+
+
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;
}
diff --git a/snac.h b/snac.h
index 904f947..b5a5a76 100644
--- a/snac.h
+++ b/snac.h
@@ -12,6 +12,8 @@ extern int srv_running;
extern int dbglevel;
+extern const char *susie;
+
#define valid_status(status) ((status) >= 200 && (status) <= 299)
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 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 is_msg_public(snac *snac, char *msg);
void process_queue(snac *snac);
void post(snac *snac, char *msg);
int activitypub_get_handler(d_char *req, char *q_path,