summaryrefslogtreecommitdiff
path: root/mastoapi.c
diff options
context:
space:
mode:
authordefault <nobody@localhost>2024-08-09 16:57:14 +0200
committerdefault <nobody@localhost>2024-08-09 16:57:14 +0200
commit339dc1a3255f39087476fa511e94d98016b76338 (patch)
tree579b64294af9d701b7c6e4acc9f6127311245762 /mastoapi.c
parentf5332ec0164a3a92d58081700267fe86c7aaa5a1 (diff)
Use index_desc_first() / index_desc_next() in mastoapi_timeline().
Diffstat (limited to 'mastoapi.c')
-rw-r--r--mastoapi.c137
1 files changed, 75 insertions, 62 deletions
diff --git a/mastoapi.c b/mastoapi.c
index 7f9ec6c..4d920de 100644
--- a/mastoapi.c
+++ b/mastoapi.c
@@ -1261,9 +1261,20 @@ void credentials_get(char **body, char **ctype, int *status, snac snac)
}
-xs_list *mastoapi_timeline(snac *user, const xs_dict *args, const char *index)
+xs_list *mastoapi_timeline(snac *user, const xs_dict *args, int skip, const char *index_fn)
{
- xs_list *out = xs_list_new();
+ xs_list *out = xs_list_new();
+ FILE *f;
+ char md5[MD5_HEX_SIZE];
+
+ if (dbglevel) {
+ xs *js = xs_json_dumps(args, 0);
+ srv_log(xs_fmt("mastoapi_timeline args: %s", js));
+ }
+
+ if ((f = fopen(index_fn, "r")) == NULL)
+ return out;
+
const char *max_id = xs_dict_get(args, "max_id");
const char *since_id = xs_dict_get(args, "since_id");
const char *min_id = xs_dict_get(args, "min_id");
@@ -1277,85 +1288,86 @@ xs_list *mastoapi_timeline(snac *user, const xs_dict *args, const char *index)
if (limit == 0)
limit = 20;
- xs *timeline = timeline_simple_list(user, index, 0, 2048);
+ if (index_desc_first(f, md5, skip)) {
+ do {
+ xs *msg = NULL;
- xs_list *p = timeline;
- const xs_str *v;
+ /* only return entries older that max_id */
+ if (max_id) {
+ if (strcmp(md5, MID_TO_MD5(max_id)) == 0)
+ max_id = NULL;
- while (xs_list_iter(&p, &v) && cnt < limit) {
- xs *msg = NULL;
+ continue;
+ }
- /* only return entries older that max_id */
- if (max_id) {
- if (strcmp(v, MID_TO_MD5(max_id)) == 0)
- max_id = NULL;
+ /* only returns entries newer than since_id */
+ if (since_id) {
+ if (strcmp(md5, MID_TO_MD5(since_id)) == 0)
+ break;
+ }
- continue;
- }
+ /* only returns entries newer than min_id */
+ /* what does really "Return results immediately newer than ID" mean? */
+ if (min_id) {
+ if (strcmp(md5, MID_TO_MD5(min_id)) == 0)
+ break;
+ }
- /* only returns entries newer than since_id */
- if (since_id) {
- if (strcmp(v, MID_TO_MD5(since_id)) == 0)
- break;
- }
+ /* get the entry */
+ if (!valid_status(timeline_get_by_md5(user, md5, &msg)))
+ continue;
- /* only returns entries newer than min_id */
- /* what does really "Return results immediately newer than ID" mean? */
- if (min_id) {
- if (strcmp(v, MID_TO_MD5(min_id)) == 0)
- break;
- }
+ /* discard non-Notes */
+ const char *id = xs_dict_get(msg, "id");
+ const char *type = xs_dict_get(msg, "type");
+ if (!xs_match(type, POSTLIKE_OBJECT_TYPE))
+ continue;
- /* get the entry */
- if (!valid_status(timeline_get_by_md5(user, v, &msg)))
- continue;
+ const char *from = NULL;
+ if (strcmp(type, "Page") == 0)
+ from = xs_dict_get(msg, "audience");
- /* discard non-Notes */
- const char *id = xs_dict_get(msg, "id");
- const char *type = xs_dict_get(msg, "type");
- if (!xs_match(type, POSTLIKE_OBJECT_TYPE))
- continue;
+ if (from == NULL)
+ from = get_atto(msg);
- const char *from = NULL;
- if (strcmp(type, "Page") == 0)
- from = xs_dict_get(msg, "audience");
+ if (from == NULL)
+ continue;
- if (from == NULL)
- from = get_atto(msg);
+ /* is this message from a person we don't follow? */
+ if (strcmp(from, user->actor) && !following_check(user, from)) {
+ /* discard if it was not boosted */
+ xs *idx = object_announces(id);
- if (from == NULL)
- continue;
+ if (xs_list_len(idx) == 0)
+ continue;
+ }
- /* is this message from a person we don't follow? */
- if (strcmp(from, user->actor) && !following_check(user, from)) {
- /* discard if it was not boosted */
- xs *idx = object_announces(id);
+ /* discard notes from muted morons */
+ if (is_muted(user, from))
+ continue;
- if (xs_list_len(idx) == 0)
+ /* discard hidden notes */
+ if (is_hidden(user, id))
continue;
- }
- /* discard notes from muted morons */
- if (is_muted(user, from))
- continue;
+ /* if it has a name and it's not a Page or a Video,
+ it's a poll vote, so discard it */
+ if (!xs_is_null(xs_dict_get(msg, "name")) && !xs_match(type, "Page|Video"))
+ continue;
- /* discard hidden notes */
- if (is_hidden(user, id))
- continue;
+ /* convert the Note into a Mastodon status */
+ xs *st = mastoapi_status(user, msg);
- /* if it has a name and it's not a Page or a Video,
- it's a poll vote, so discard it */
- if (!xs_is_null(xs_dict_get(msg, "name")) && !xs_match(type, "Page|Video"))
- continue;
+ if (st != NULL)
+ out = xs_list_append(out, st);
- /* convert the Note into a Mastodon status */
- xs *st = mastoapi_status(user, msg);
+ cnt++;
+ } while (cnt < limit && index_desc_next(f, md5));
+ }
- if (st != NULL)
- out = xs_list_append(out, st);
+ fclose(f);
- cnt++;
- }
+ srv_debug(1, xs_fmt("mastoapi_timeline: %d %d", cnt, xs_list_len(out)));
return out;
}
@@ -1619,7 +1631,8 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
if (strcmp(cmd, "/v1/timelines/home") == 0) { /** **/
/* the private timeline */
if (logged_in) {
- xs *out = mastoapi_timeline(&snac1, args, "private");
+ xs *ifn = user_index_fn(&snac1, "private");
+ xs *out = mastoapi_timeline(&snac1, args, 0, ifn);
*body = xs_json_dumps(out, 4);
*ctype = "application/json";