From 057112d1d6d250de9f4f9350bc3c20aa5c058ce1 Mon Sep 17 00:00:00 2001 From: "me@ow.nekobit.net" Date: Tue, 19 Apr 2022 18:25:59 +0000 Subject: [PATCH] Home timeline FossilOrigin-Name: 0845fa3c677309b6c570fcaf12a8a6ad9e21a5626b4c3c03e954e6f18d5ba7d7 --- src/index.c | 2 +- src/timeline.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/timeline.h | 2 ++ 3 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/index.c b/src/index.c index 21f2bb7..d85cd5b 100644 --- a/src/index.c +++ b/src/index.c @@ -22,5 +22,5 @@ void content_index(struct session* ssn, mastodont_t* api) { // Check logins - tl_public(ssn, api, 0, BASE_CAT_HOME); + content_tl_home(ssn, api, NULL); } diff --git a/src/timeline.c b/src/timeline.c index 36d2374..362a837 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -31,6 +31,74 @@ #include "../static/navigation.chtml" + +void tl_home(struct session* ssn, mastodont_t* api, int local) +{ + size_t status_count = 0, statuses_html_count = 0; + struct mstdnt_status* statuses = NULL; + struct mstdnt_storage storage = { 0 }; + char* status_format = NULL, + *post_box, + *navigation_box = NULL, + *output = NULL; + char* start_id; + + struct mstdnt_timeline_args args = { + .local = local, + .max_id = ssn->post.max_id, + .since_id = NULL, + .min_id = ssn->post.min_id, + .limit = 10, + }; + + try_post_status(ssn, api); + + if (mastodont_timeline_home(api, &args, &storage, &statuses, &status_count)) + { + status_format = construct_error(storage.error, E_ERROR, 1, NULL); + } + else { + // Construct statuses into HTML + status_format = construct_statuses(api, statuses, status_count, &statuses_html_count); + if (!status_format) + status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL); + } + + // Create post box + post_box = construct_post_box(NULL, "", NULL); + if (statuses) + { + // If not set, set it + start_id = ssn->post.start_id ? ssn->post.start_id : statuses[0].id; + navigation_box = construct_navigation_box(start_id, + statuses[0].id, + statuses[status_count-1].id, + NULL); + } + easprintf(&output, "%s%s%s", + post_box, + STR_NULL_EMPTY(status_format), + STR_NULL_EMPTY(navigation_box)); + + struct base_page b = { + .category = BASE_CAT_HOME, + .locale = L10N_EN_US, + .content = output, + .sidebar_left = NULL + }; + + // Output + render_base_page(&b, ssn, api); + + // Cleanup + mastodont_storage_cleanup(&storage); + mstdnt_cleanup_statuses(statuses, status_count); + if (status_format) free(status_format); + if (post_box) free(post_box); + if (navigation_box) free(navigation_box); + if (output) free(output); +} + void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_category cat) { size_t status_count = 0, statuses_html_count = 0; @@ -42,7 +110,7 @@ void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_categ *output = NULL; char* start_id; - struct mstdnt_args args = { + struct mstdnt_timeline_args args = { .local = local, .remote = 0, .only_media = 0, @@ -108,7 +176,7 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id) char* status_format, *post_box; char* output = NULL; - struct mstdnt_args args = { + struct mstdnt_timeline_args args = { .max_id = NULL, .since_id = NULL, .min_id = NULL, @@ -152,6 +220,15 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id) if (output) free(output); } +void content_tl_home(struct session* ssn, mastodont_t* api, char** data) +{ + (void)data; + if (ssn->cookies.logged_in) + tl_home(ssn, api, 0); + else + content_tl_federated(ssn, api, data); +} + void content_tl_federated(struct session* ssn, mastodont_t* api, char** data) { (void)data; diff --git a/src/timeline.h b/src/timeline.h index 2d58589..0f48e92 100644 --- a/src/timeline.h +++ b/src/timeline.h @@ -24,10 +24,12 @@ #include "base_page.h" // Federated and local are here +void tl_home(struct session* ssn, mastodont_t* api, int local); void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_category cat); void tl_list(struct session* ssn, mastodont_t* api, char* list_id); void content_tl_federated(struct session* ssn, mastodont_t* api, char** data); +void content_tl_home(struct session* ssn, mastodont_t* api, char** data); void content_tl_local(struct session* ssn, mastodont_t* api, char** data); void content_tl_list(struct session* ssn, mastodont_t* api, char** data);