From 4e3d596bee1cee2c4146265eb6ac827f09820c53 Mon Sep 17 00:00:00 2001 From: shtrophic Date: Mon, 20 Jan 2025 19:43:42 +0100 Subject: add xs_smtp_request --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 33947ff..b148ac7 100644 --- a/data.c +++ b/data.c @@ -3195,7 +3195,7 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg, } -void enqueue_email(const xs_str *msg, int retries) +void enqueue_email(const xs_dict *msg, int retries) /* enqueues an email message to be sent */ { xs *qmsg = _new_qmsg("email", msg, retries); -- cgit v1.2.3 From 2ca7735779e79dbe6fe62f0111a12c145f428d8f Mon Sep 17 00:00:00 2001 From: shtrophic Date: Wed, 19 Feb 2025 08:56:14 +0100 Subject: fix ownership-problem of mailinfo --- data.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index ae85aaf..d25a5d7 100644 --- a/data.c +++ b/data.c @@ -3174,7 +3174,7 @@ static xs_dict *_enqueue_put(const char *fn, xs_dict *msg) } -static xs_dict *_new_qmsg(const char *type, const xs_val *msg, int retries) +static xs_dict *_new_qmsg(const char *type, xs_dict *msg, int retries) /* creates a queue message */ { int qrt = xs_number_get(xs_dict_get(srv_config, "queue_retry_minutes")); @@ -3276,9 +3276,10 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg, } -void enqueue_email(const xs_dict *msg, int retries) +void enqueue_email(xs_dict *msg, int retries) /* enqueues an email message to be sent */ { + /* qmsg owns msg */ xs *qmsg = _new_qmsg("email", msg, retries); const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); -- cgit v1.2.3 From 59a34a9646e28cc9a63194ff55547de0005d0110 Mon Sep 17 00:00:00 2001 From: shtrophic Date: Thu, 20 Feb 2025 17:13:12 +0100 Subject: Revert "fix ownership-problem of mailinfo" This reverts commit 2ca7735779e79dbe6fe62f0111a12c145f428d8f. --- data.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index d25a5d7..ae85aaf 100644 --- a/data.c +++ b/data.c @@ -3174,7 +3174,7 @@ static xs_dict *_enqueue_put(const char *fn, xs_dict *msg) } -static xs_dict *_new_qmsg(const char *type, xs_dict *msg, int retries) +static xs_dict *_new_qmsg(const char *type, const xs_val *msg, int retries) /* creates a queue message */ { int qrt = xs_number_get(xs_dict_get(srv_config, "queue_retry_minutes")); @@ -3276,10 +3276,9 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg, } -void enqueue_email(xs_dict *msg, int retries) +void enqueue_email(const xs_dict *msg, int retries) /* enqueues an email message to be sent */ { - /* qmsg owns msg */ xs *qmsg = _new_qmsg("email", msg, retries); const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); -- cgit v1.2.3 From b50631c0f7253e35310a14012e4fa9432aedfb5a Mon Sep 17 00:00:00 2001 From: shtrophic Date: Thu, 20 Feb 2025 17:16:16 +0100 Subject: duplicate dict instead --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index ae85aaf..a84cb8d 100644 --- a/data.c +++ b/data.c @@ -3279,7 +3279,7 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg, void enqueue_email(const xs_dict *msg, int retries) /* enqueues an email message to be sent */ { - xs *qmsg = _new_qmsg("email", msg, retries); + xs *qmsg = _new_qmsg("email", xs_dup(msg), retries); const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); -- cgit v1.2.3 From ff06e7e3e019f5f960bc6875d1f027e5e304ee4a Mon Sep 17 00:00:00 2001 From: shtrophic Date: Thu, 20 Feb 2025 18:25:47 +0100 Subject: duping isn't necessary as xs_vals are copied anyway (right?) --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index a84cb8d..ae85aaf 100644 --- a/data.c +++ b/data.c @@ -3279,7 +3279,7 @@ void enqueue_output_by_actor(snac *snac, const xs_dict *msg, void enqueue_email(const xs_dict *msg, int retries) /* enqueues an email message to be sent */ { - xs *qmsg = _new_qmsg("email", xs_dup(msg), retries); + xs *qmsg = _new_qmsg("email", msg, retries); const char *ntid = xs_dict_get(qmsg, "ntid"); xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); -- cgit v1.2.3 From 770062def6f3e10bf56eae48e274709796fa6df6 Mon Sep 17 00:00:00 2001 From: default Date: Sat, 22 Mar 2025 08:50:08 +0100 Subject: Filter out block instances from inbox_list(). --- data.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index ce040dd..a192830 100644 --- a/data.c +++ b/data.c @@ -2619,10 +2619,9 @@ xs_list *inbox_list(void) xs_list *ibl = xs_list_new(); xs *spec = xs_fmt("%s/inbox/" "*", srv_basedir); xs *files = xs_glob(spec, 0, 0); - xs_list *p = files; const xs_val *v; - while (xs_list_iter(&p, &v)) { + xs_list_foreach(files, v) { FILE *f; if ((f = fopen(v, "r")) != NULL) { @@ -2630,7 +2629,9 @@ xs_list *inbox_list(void) if (line && *line) { line = xs_strip_i(line); - ibl = xs_list_append(ibl, line); + + if (!is_instance_blocked(line)) + ibl = xs_list_append(ibl, line); } fclose(f); -- cgit v1.2.3 From 5090e4e77489d7e4e2d358c417c83be8f76307cb Mon Sep 17 00:00:00 2001 From: default Date: Tue, 1 Apr 2025 06:14:46 +0200 Subject: Added more scheduling code. --- data.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index a192830..8f68ee2 100644 --- a/data.c +++ b/data.c @@ -1929,6 +1929,43 @@ xs_list *draft_list(snac *user) } +/** scheduled posts **/ + +int is_scheduled(snac *user, const char *id) +/* returns true if this note is scheduled for future sending */ +{ + return object_user_cache_in(user, id, "sched"); +} + + +void schedule_del(snac *user, const char *id) +/* deletes an scheduled post */ +{ + object_user_cache_del(user, id, "sched"); +} + + +void schedule_add(snac *user, const char *id, const xs_dict *msg) +/* schedules this post for later */ +{ + /* delete from the index, in case it was already there */ + schedule_del(user, id); + + /* overwrite object */ + object_add_ow(id, msg); + + /* [re]add to the index */ + object_user_cache_add(user, id, "sched"); +} + + +xs_list *scheduled_list(snac *user) +/* return the list of scheduled posts */ +{ + return object_user_cache_list(user, "sched", XS_ALL, 1); +} + + /** hiding **/ xs_str *_hidden_fn(snac *snac, const char *id) -- cgit v1.2.3 From 9b2d0381ba734102c20d2111f0a2b64a3c438ef7 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 1 Apr 2025 06:32:53 +0200 Subject: More scheduled post code. --- data.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 8f68ee2..6661472 100644 --- a/data.c +++ b/data.c @@ -1966,6 +1966,33 @@ xs_list *scheduled_list(snac *user) } +void scheduled_process(snac *user) +/* processes the scheduled list, sending those ready to be sent */ +{ + xs *posts = scheduled_list(user); + const char *md5; + xs *right_now = xs_str_utctime(0, ISO_DATE_SPEC); + + xs_list_foreach(posts, md5) { + xs *msg = NULL; + + if (valid_status(object_get_by_md5(md5, &msg))) { + if (strcmp(xs_dict_get(msg, "published"), right_now) < 0) { + /* due date! */ + const char *id = xs_dict_get(msg, "id"); + + timeline_add(user, id, msg); + + xs *c_msg = msg_create(user, msg); + enqueue_message(user, c_msg); + + schedule_del(user, id); + } + } + } +} + + /** hiding **/ xs_str *_hidden_fn(snac *snac, const char *id) @@ -3734,7 +3761,7 @@ void purge_user(snac *snac) _purge_user_subdir(snac, "public", pub_days); const char *idxs[] = { "followers.idx", "private.idx", "public.idx", - "pinned.idx", "bookmark.idx", "draft.idx", NULL }; + "pinned.idx", "bookmark.idx", "draft.idx", "sched.idx", NULL }; for (n = 0; idxs[n]; n++) { xs *idx = xs_fmt("%s/%s", snac->basedir, idxs[n]); -- cgit v1.2.3 From 848bd3e865fb2daf75d76cbb75a4a39f9b82b516 Mon Sep 17 00:00:00 2001 From: default Date: Sun, 13 Apr 2025 14:30:50 +0200 Subject: Cache the timezone inside the snac struct. --- data.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 6661472..440e9df 100644 --- a/data.c +++ b/data.c @@ -282,6 +282,8 @@ int user_open(snac *user, const char *uid) } else srv_log(xs_fmt("error parsing '%s'", cfg_file)); + + user->tz = xs_dict_get_def(user->config, "tz", "UTC"); } else srv_debug(2, xs_fmt("error opening '%s' %d", cfg_file, errno)); -- cgit v1.2.3 From d11d03787fa5f45926859e780d9c8c0bf56bf5ee Mon Sep 17 00:00:00 2001 From: default Date: Fri, 18 Apr 2025 08:44:47 +0200 Subject: New command-line options 'lists' and 'list_members'. --- data.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 440e9df..53f38e9 100644 --- a/data.c +++ b/data.c @@ -2340,6 +2340,19 @@ xs_val *list_maint(snac *user, const char *list, int op) } break; + + case 4: /** find list id by name **/ + if (xs_is_string(list)) { + xs *lol = list_maint(user, NULL, 0); + const xs_list *li; + + xs_list_foreach(lol, li) { + if (strcmp(list, xs_list_get(li, 1)) == 0) { + l = xs_dup(xs_list_get(li, 0)); + break; + } + } + } } return l; -- cgit v1.2.3 From 1ebf2a2d874f3ee589785e8175abdcb33a963d72 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 18 Apr 2025 09:08:48 +0200 Subject: New command-line option 'add_to_list'. --- data.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'data.c') diff --git a/data.c b/data.c index 53f38e9..88f1921 100644 --- a/data.c +++ b/data.c @@ -2404,7 +2404,7 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op break; case 1: /** append actor to list **/ - if (actor_md5 != NULL) { + if (xs_is_string(actor_md5) && xs_is_hex(actor_md5)) { if (!index_in_md5(fn, actor_md5)) index_add_md5(fn, actor_md5); } @@ -2412,7 +2412,7 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op break; case 2: /** delete actor from list **/ - if (actor_md5 != NULL) + if (xs_is_string(actor_md5) && xs_is_hex(actor_md5)) index_del_md5(fn, actor_md5); break; -- cgit v1.2.3 From ec21e1596ab285813d5774224dfed77cbb30d23e Mon Sep 17 00:00:00 2001 From: green Date: Thu, 24 Apr 2025 15:49:55 +0200 Subject: mastoapi: support lists for users --- data.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 88f1921..0d1bbc6 100644 --- a/data.c +++ b/data.c @@ -2265,7 +2265,8 @@ xs_val *list_maint(snac *user, const char *list, int op) xs *l2 = xs_split(v2, "/"); /* return [ list_id, list_title ] */ - l = xs_list_append(l, xs_list_append(xs_list_new(), xs_list_get(l2, -1), title)); + xs *tmp_list = xs_list_append(xs_list_new(), xs_list_get(l2, -1), title); + l = xs_list_append(l, tmp_list); } } } -- cgit v1.2.3 From 605b60c06ea882cd61df7f2d834c02cce6dd254d Mon Sep 17 00:00:00 2001 From: grunfink Date: Sat, 3 May 2025 19:16:21 +0200 Subject: New function enqueue_webmention(). The q_msg is queued, but nothing is done yet. --- data.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 7d33f77..73332ef 100644 --- a/data.c +++ b/data.c @@ -3473,6 +3473,19 @@ void enqueue_actor_refresh(snac *user, const char *actor, int forward_secs) } +void enqueue_webmention(const xs_dict *msg) +/* enqueues a webmention for the post */ +{ + xs *qmsg = _new_qmsg("webmention", msg, 0); + const char *ntid = xs_dict_get(qmsg, "ntid"); + xs *fn = xs_fmt("%s/queue/%s.json", srv_basedir, ntid); + + qmsg = _enqueue_put(fn, qmsg); + + srv_debug(1, xs_fmt("enqueue_webmention")); +} + + int was_question_voted(snac *user, const char *id) /* returns true if the user voted in this poll */ { -- cgit v1.2.3 From ee84140ecceb07dad8ea36cc5aa29b91bbb48a56 Mon Sep 17 00:00:00 2001 From: grunfink Date: Sun, 18 May 2025 08:23:48 +0200 Subject: Added a pending follow request count next to the "people" link. --- data.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index 73332ef..e3fa52d 100644 --- a/data.c +++ b/data.c @@ -1335,6 +1335,16 @@ xs_list *pending_list(snac *user) } +int pending_count(snac *user) +/* returns the number of pending follow confirmations */ +{ + xs *spec = xs_fmt("%s/pending/""*.json", user->basedir); + xs *l = xs_glob(spec, 0, 0); + + return xs_list_len(l); +} + + /** timeline **/ double timeline_mtime(snac *snac) -- cgit v1.2.3 From 00fd1a1c3eb99c9e441276a7ce8697a1582152b7 Mon Sep 17 00:00:00 2001 From: green Date: Sat, 29 Mar 2025 01:27:46 +0100 Subject: performance: functions to get the number of followers --- data.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'data.c') diff --git a/data.c b/data.c index e3fa52d..482a29c 100644 --- a/data.c +++ b/data.c @@ -1215,6 +1215,14 @@ int follower_check(snac *snac, const char *actor) } +int follower_list_len(snac *snac) +/* returns the number followers */ +{ + xs *list = object_user_cache_list(snac, "followers", XS_ALL, 0); + return xs_list_len(list); +} + + xs_list *follower_list(snac *snac) /* returns the list of followers */ { @@ -1709,6 +1717,15 @@ int following_get(snac *snac, const char *actor, xs_dict **data) } +int following_list_len(snac *snac) +/* returns number of people being followed */ +{ + xs *spec = xs_fmt("%s/following/" "*_a.json", snac->basedir); + xs *glist = xs_glob(spec, 0, 0); + return xs_list_len(glist); +} + + xs_list *following_list(snac *snac) /* returns the list of people being followed */ { -- cgit v1.2.3 From 321f64ed70d039dea510c8a7d7aee7dc9577737a Mon Sep 17 00:00:00 2001 From: green Date: Mon, 19 May 2025 15:25:11 +0200 Subject: performance: use following_list_len in more places --- data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'data.c') diff --git a/data.c b/data.c index 482a29c..f9d27f9 100644 --- a/data.c +++ b/data.c @@ -1216,7 +1216,7 @@ int follower_check(snac *snac, const char *actor) int follower_list_len(snac *snac) -/* returns the number followers */ +/* returns the number of followers */ { xs *list = object_user_cache_list(snac, "followers", XS_ALL, 0); return xs_list_len(list); -- cgit v1.2.3