From 5c2c7b27aca8bec59f90007481e5e2c6e961827f Mon Sep 17 00:00:00 2001 From: grunfink Date: Sat, 29 Nov 2025 06:08:37 +0100 Subject: New function is_msg_mine(). --- activitypub.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 2c0fa2e..65eed05 100644 --- a/activitypub.c +++ b/activitypub.c @@ -669,6 +669,20 @@ xs_list *recipient_list(snac *snac, const xs_dict *msg, int expand_public) } +int is_msg_mine(snac *user, const char *id) +/* returns true if a post id is by the given user */ +{ + int ret = 0; + + if (xs_is_string(id)) { + xs *s1 = xs_fmt("%s/", user->actor); + ret = xs_startswith(id, s1); + } + + return ret; +} + + int is_msg_public(const xs_dict *msg) /* checks if a message is public */ { -- cgit v1.2.3 From 46bb87c2b54c9b9d9a4cd462b47158ede1eec170 Mon Sep 17 00:00:00 2001 From: grunfink Date: Sat, 29 Nov 2025 06:17:27 +0100 Subject: Moved is_msg_mine() to data.c. --- activitypub.c | 14 -------------- 1 file changed, 14 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 65eed05..2c0fa2e 100644 --- a/activitypub.c +++ b/activitypub.c @@ -669,20 +669,6 @@ xs_list *recipient_list(snac *snac, const xs_dict *msg, int expand_public) } -int is_msg_mine(snac *user, const char *id) -/* returns true if a post id is by the given user */ -{ - int ret = 0; - - if (xs_is_string(id)) { - xs *s1 = xs_fmt("%s/", user->actor); - ret = xs_startswith(id, s1); - } - - return ret; -} - - int is_msg_public(const xs_dict *msg) /* checks if a message is public */ { -- cgit v1.2.3 From a45c1ce152011e8fe25eb1d25594ac5705f65404 Mon Sep 17 00:00:00 2001 From: rako Date: Fri, 28 Nov 2025 10:37:49 +0100 Subject: Fix user matching In order to be a proper prefix, the actor url must end with a '/' otherwise it can match another user that starts with the same prefix: for example 'testuser' will match anything made by 'testuser2' --- activitypub.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 2c0fa2e..90230d8 100644 --- a/activitypub.c +++ b/activitypub.c @@ -779,7 +779,7 @@ int is_msg_for_me(snac *snac, const xs_dict *c_msg) object_get(object, &obj); /* if it's about one of our posts, accept it */ - if (xs_startswith(object, snac->actor)) + if (is_msg_mine(snac, object)) return 2; /* blocked by hashtag? */ @@ -1242,7 +1242,7 @@ void notify(snac *snac, const char *type, const char *utype, const char *actor, if (xs_match(type, "Like|Announce|EmojiReact")) { /* if it's not an admiration about something by us, done */ - if (xs_is_null(objid) || !xs_startswith(objid, snac->actor)) + if (xs_is_null(objid) || !is_msg_mine(snac, objid)) return; /* if it's an announce by our own relay, done */ @@ -1267,7 +1267,7 @@ void notify(snac *snac, const char *type, const char *utype, const char *actor, return; /* if it's not ours and we didn't vote, discard */ - if (!xs_startswith(poll_id, snac->actor) && !was_question_voted(snac, poll_id)) + if (!is_msg_mine(snac, poll_id) && !was_question_voted(snac, poll_id)) return; } @@ -2792,10 +2792,10 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) if (xs_is_null(object)) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else - if (is_muted(snac, actor) && !xs_startswith(object, snac->actor)) + if (is_muted(snac, actor) && !is_msg_mine(snac, object)) snac_log(snac, xs_fmt("dropped 'Announce' from muted actor %s", actor)); else - if (is_limited(snac, actor) && !xs_startswith(object, snac->actor)) + if (is_limited(snac, actor) && !is_msg_mine(snac, object)) snac_log(snac, xs_fmt("dropped 'Announce' from limited actor %s", actor)); else { xs *a_msg = NULL; @@ -2903,7 +2903,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else if (object_here(object)) { - if (xs_startswith(object, srv_baseurl) && !xs_startswith(object, actor)) + if (xs_startswith(object, srv_baseurl) && !is_msg_mine(snac, object)) snac_log(snac, xs_fmt("ignored incorrect 'Delete' %s %s", actor, object)); else { timeline_del(snac, object); @@ -3716,7 +3716,7 @@ int activitypub_get_handler(const xs_dict *req, const char *q_path, const char *type = xs_dict_get(i, "type"); const char *id = xs_dict_get(i, "id"); - if (type && id && strcmp(type, "Note") == 0 && xs_startswith(id, snac.actor)) { + if (type && id && strcmp(type, "Note") == 0 && is_msg_mine(&snac, id)) { if (is_msg_public(i)) { xs *c_msg = msg_create(&snac, i); list = xs_list_append(list, c_msg); -- cgit v1.2.3 From 85ed0eb0d535700a5df837c37f51848811e461a0 Mon Sep 17 00:00:00 2001 From: violette Date: Thu, 18 Dec 2025 07:58:24 +0100 Subject: Added emoji reactions (contributed by violette). --- activitypub.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 156 insertions(+), 5 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 90230d8..19f0cc6 100644 --- a/activitypub.c +++ b/activitypub.c @@ -4,6 +4,7 @@ #include "xs.h" #include "xs_json.h" #include "xs_curl.h" +#include "xs_url.h" #include "xs_mime.h" #include "xs_openssl.h" #include "xs_regex.h" @@ -1530,11 +1531,24 @@ xs_dict *msg_update(snac *snac, const xs_dict *object) xs_dict *msg_admiration(snac *snac, const char *object, const char *type) -/* creates a Like or Announce message */ +/* creates a Like, Announce or EmojiReact message */ { xs *a_msg = NULL; xs_dict *msg = NULL; xs *wrk = NULL; + char t = 0; + + switch (*type) { + case 'L': + t = 'l'; + break; + case 'A': + t = 'a'; + break; + case 'E': + t = 'e'; + break; + } /* call the object */ timeline_request(snac, &object, &wrk, 0); @@ -1542,7 +1556,7 @@ xs_dict *msg_admiration(snac *snac, const char *object, const char *type) if (valid_status(object_get(object, &a_msg))) { xs *rcpts = xs_list_new(); xs *o_md5 = xs_md5_hex(object, strlen(object)); - xs *id = xs_fmt("%s/%s/%s", snac->actor, *type == 'L' ? "l" : "a", o_md5); + xs *id = xs_fmt("%s/%c/%s", snac->actor, t, o_md5); msg = msg_base(snac, type, id, snac->actor, "@now", object); @@ -1586,6 +1600,113 @@ xs_dict *msg_repulsion(snac *user, const char *id, const char *type) return msg; } +xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid) +/* creates an emoji reaction from a local user */ +{ + xs_dict *n_msg = msg_admiration(snac, mid, "EmojiReact"); + + eid = xs_strip_chars_i(xs_dup(eid), ":"); + xs *content = NULL; + xs *tag = xs_list_new(); + xs *dict = xs_dict_new(); + xs *icon = xs_dict_new(); + xs *accounts = xs_list_new(); + + /* may be a default emoji */ + xs *eidd = xs_dup(eid); + const char *eidda = eid; + + if (xs_is_emoji(xs_utf8_dec(&eidda))) + content = xs_dup(eid); + + else if (*eid == '%') { + content = xs_url_dec_emoji(xs_dup(eid)); + if (content == NULL) { + return NULL; + } + } + else if (xs_dict_get(emojis(), xs_fmt(":%s:", eid)) == NULL) + return NULL; + else { + content = xs_fmt(":%s:", eid); + icon = xs_dict_set(icon, "type", "Image"); + icon = xs_dict_set(icon, "url", xs_fmt("%s/s/%s.png", snac->actor, eid)); + dict = xs_dict_set(dict, "icon", icon); + + dict = xs_dict_set(dict, "id", xs_fmt("%s/s/%s.png", snac->actor, eid)); + dict = xs_dict_set(dict, "name", content); + dict = xs_dict_set(dict, "type", "Emoji"); + tag = xs_list_append(tag, dict); + } + + accounts = xs_list_append(accounts, snac->actor); + + n_msg = xs_dict_set(n_msg, "content", content); + n_msg = xs_dict_set(n_msg, "accounts", accounts); + n_msg = xs_dict_set(n_msg, "attributedTo", xs_list_get(xs_dup(xs_dict_get(n_msg, "to")), 1)); + n_msg = xs_dict_set(n_msg, "accountId", snac->uid); + n_msg = xs_dict_set(n_msg, "tag", tag); + + int ret = timeline_admire(snac, xs_dict_get(n_msg, "object"), snac->actor, 1, n_msg); + if (ret == 200 || ret == 201) { + enqueue_message(snac, n_msg); + return n_msg; + } + + return NULL; +} + +xs_dict *msg_emoji_unreact(snac *user, const char *mid, const char *eid) +/* creates an Undo + emoji reaction message */ +{ + xs *a_msg = NULL; + xs_dict *msg = NULL; + + if (valid_status(object_get(mid, &a_msg))) { + /* create a clone of the original admiration message */ + xs *object = msg_admiration(user, mid, "EmojiReact"); + + /* delete the published date */ + object = xs_dict_del(object, "published"); + + /* create an undo message for this object */ + msg = msg_undo(user, object); + + /* copy the 'to' field */ + msg = xs_dict_set(msg, "to", xs_dict_get(object, "to")); + } + + xs *emotes = object_get_emoji_reacts(mid); + const char *v; + int c = 0; + + /* may be a default emoji */ + if (strlen(eid) == 12 && *eid == '%') { + eid = xs_url_dec(eid); + if (eid == NULL) { + return NULL; + } + } + + /* lets get all emotes for this msg, and compare it to our content */ + while (xs_list_next(emotes, &v, &c)) { + xs_dict *e = NULL; + if (valid_status(object_get_by_md5(v, &e))) { + const char *content = xs_dict_get(e, "content"); + const char *id = xs_dict_get(e, "id"); + const char *actor = xs_dict_get(e, "actor"); + /* maybe formated as :{emoteName}: too */ + if (xs_str_in(eid, content) != -1) + if (strcmp(user->actor, actor) == 0) { + object_rm_emoji_react(mid, id); + return msg; + } + } + } + + return NULL; +} + xs_dict *msg_actor_place(snac *user, const char *label) /* creates a Place object, if the user has a location defined */ @@ -2605,6 +2726,16 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else if (strcmp(type, "Undo") == 0) { /** **/ const char *id = xs_dict_get(object, "object"); + const char *content = xs_dict_get(object, "content"); + /* misskey sends emojis as like + tag */ + xs *cd = xs_dup(content); + const char *sna = cd; + const xs_dict *tag = xs_dict_get(object, "tag"); + unsigned int utf = xs_utf8_dec((const char **)&sna); + + int isEmoji = 0; + if (xs_is_emoji(utf) || (tag && xs_list_len(tag) > 0)) + isEmoji = 1; if (xs_type(object) != XSTYPE_DICT) { snac_debug(snac, 1, xs_fmt("undo: overriding utype %s | %s | %s", @@ -2633,8 +2764,19 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) else snac_log(snac, xs_fmt("error deleting follower %s", actor)); } + /* *key emojis are like w/ Emoji tag */ + else + if ((isEmoji || strcmp(utype, "EmojiReact") == 0) && + (content && strcmp(content, "♥") != 0)) { + const xs_val *mid = xs_dict_get(object, "id"); + int status = object_rm_emoji_react((char *)id, mid); + /* ensure *key notifications type */ + utype = "EmojiReact"; + + snac_log(snac, xs_fmt("Undo 'EmojiReact' for %s %d", id, status)); + } else - if (strcmp(utype, "Like") == 0 || strcmp(utype, "EmojiReact") == 0) { /** **/ + if (strcmp(utype, "Like") == 0) { /** **/ int status = object_unadmire(id, actor, 1); snac_log(snac, xs_fmt("Undo '%s' for %s %d", utype, id, status)); @@ -2771,13 +2913,22 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) } else if (strcmp(type, "Like") == 0 || strcmp(type, "EmojiReact") == 0) { /** **/ + /* misskey sends emojis as Like + tag. + * It is easier to handle them both at the same time. */ + const char *sna = xs_dict_get(msg, "content"); + const xs_dict *tag = xs_dict_get(msg, "tag"); + unsigned int utf = xs_utf8_dec((const char **)&sna); + + if (xs_is_emoji(utf) || (tag && xs_list_len(tag) > 0)) + type = "EmojiReact"; + if (xs_type(object) == XSTYPE_DICT) object = xs_dict_get(object, "id"); if (xs_is_null(object)) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else - if (timeline_admire(snac, object, actor, 1) == HTTP_STATUS_CREATED) + if (timeline_admire(snac, object, actor, 1, xs_dup(msg)) == HTTP_STATUS_CREATED) snac_log(snac, xs_fmt("new '%s' %s %s", type, actor, object)); else snac_log(snac, xs_fmt("repeated '%s' from %s to %s", type, actor, object)); @@ -2818,7 +2969,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) xs *this_relay = xs_fmt("%s/relay", srv_baseurl); if (strcmp(actor, this_relay) != 0) { - if (valid_status(timeline_admire(snac, object, actor, 0))) + if (valid_status(timeline_admire(snac, object, actor, 0, a_msg))) snac_log(snac, xs_fmt("new 'Announce' %s %s", actor, object)); else snac_log(snac, xs_fmt("repeated 'Announce' from %s to %s", -- cgit v1.2.3 From 7c065cbc9879582985cef3d3ad8b2ae197b8b851 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 18 Dec 2025 08:09:10 +0100 Subject: Fixed some xs_dup() leaks. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 19f0cc6..d19a428 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1643,7 +1643,7 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid) n_msg = xs_dict_set(n_msg, "content", content); n_msg = xs_dict_set(n_msg, "accounts", accounts); - n_msg = xs_dict_set(n_msg, "attributedTo", xs_list_get(xs_dup(xs_dict_get(n_msg, "to")), 1)); + n_msg = xs_dict_set(n_msg, "attributedTo", xs_list_get(xs_dict_get(n_msg, "to"), 1)); n_msg = xs_dict_set(n_msg, "accountId", snac->uid); n_msg = xs_dict_set(n_msg, "tag", tag); -- cgit v1.2.3 From 2b1d108653bd8c37fb1c0962e860704783f309f0 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 18 Dec 2025 09:06:30 +0100 Subject: Use the emoji value from emojis.json instead of creating a link to the static storage. --- activitypub.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index d19a428..de3a4dc 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1600,17 +1600,18 @@ xs_dict *msg_repulsion(snac *user, const char *id, const char *type) return msg; } -xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid) +xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o) /* creates an emoji reaction from a local user */ { xs_dict *n_msg = msg_admiration(snac, mid, "EmojiReact"); - eid = xs_strip_chars_i(xs_dup(eid), ":"); + xs *eid = xs_strip_chars_i(xs_dup(eid_o), ":"); xs *content = NULL; xs *tag = xs_list_new(); xs *dict = xs_dict_new(); xs *icon = xs_dict_new(); xs *accounts = xs_list_new(); + xs *emjs = emojis(); /* may be a default emoji */ xs *eidd = xs_dup(eid); @@ -1625,15 +1626,18 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid) return NULL; } } - else if (xs_dict_get(emojis(), xs_fmt(":%s:", eid)) == NULL) - return NULL; else { content = xs_fmt(":%s:", eid); + const char *url = xs_dict_get(emjs, content); + + if (url == NULL) + return NULL; + icon = xs_dict_set(icon, "type", "Image"); - icon = xs_dict_set(icon, "url", xs_fmt("%s/s/%s.png", snac->actor, eid)); + icon = xs_dict_set(icon, "url", url); dict = xs_dict_set(dict, "icon", icon); - dict = xs_dict_set(dict, "id", xs_fmt("%s/s/%s.png", snac->actor, eid)); + dict = xs_dict_set(dict, "id", url); dict = xs_dict_set(dict, "name", content); dict = xs_dict_set(dict, "type", "Emoji"); tag = xs_list_append(tag, dict); -- cgit v1.2.3 From 765cd34527052970892ca33b80fd977c37b6b608 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 18 Dec 2025 09:24:39 +0100 Subject: Only generate an Image tag if the emoji is an URL. --- activitypub.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index de3a4dc..e1f3210 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1628,19 +1628,25 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o) } else { content = xs_fmt(":%s:", eid); - const char *url = xs_dict_get(emjs, content); + const char *emo = xs_dict_get(emjs, content); - if (url == NULL) + if (emo == NULL) return NULL; - icon = xs_dict_set(icon, "type", "Image"); - icon = xs_dict_set(icon, "url", url); - dict = xs_dict_set(dict, "icon", icon); + if (xs_match(emo, "https://*|http://*")) { /* emoji is an URL to an image */ + icon = xs_dict_set(icon, "type", "Image"); + icon = xs_dict_set(icon, "url", emo); + dict = xs_dict_set(dict, "icon", icon); - dict = xs_dict_set(dict, "id", url); - dict = xs_dict_set(dict, "name", content); - dict = xs_dict_set(dict, "type", "Emoji"); - tag = xs_list_append(tag, dict); + dict = xs_dict_set(dict, "id", emo); + dict = xs_dict_set(dict, "name", content); + dict = xs_dict_set(dict, "type", "Emoji"); + tag = xs_list_append(tag, dict); + } + else { + xs_free(content); + content = xs_dup(emo); + } } accounts = xs_list_append(accounts, snac->actor); -- cgit v1.2.3 From 4a56b57be746b828a67b621c7fd6c7c134f64e09 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 18 Dec 2025 09:36:16 +0100 Subject: If the emoji starts with &#, convert to an utf-8 string. --- activitypub.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index e1f3210..59df31a 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1643,7 +1643,22 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o) dict = xs_dict_set(dict, "type", "Emoji"); tag = xs_list_append(tag, dict); } + else + if (xs_startswith(emo, "&#")) { + /* snac default emoji as an HTML entity: decode */ + content = xs_free(content); + + xs *s1 = xs_strip_chars_i(xs_dup(emo), "&#"); + unsigned int cpoint = 0; + sscanf(s1, "%u;", &cpoint); + + if (cpoint) + content = xs_utf8_cat(xs_str_new(NULL), cpoint); + else + content = xs_dup(emo); + } else { + /* use as it is and hope for the best */ xs_free(content); content = xs_dup(emo); } -- cgit v1.2.3 From 11af00194e3e0ec15e17a23556dc2929f92e0210 Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 1 Jan 2026 17:01:03 +0100 Subject: Bumped copyright year. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 59df31a..617fd30 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1,5 +1,5 @@ /* snac - A simple, minimalistic ActivityPub instance */ -/* copyright (c) 2022 - 2025 grunfink et al. / MIT license */ +/* copyright (c) 2022 - 2026 grunfink et al. / MIT license */ #include "xs.h" #include "xs_json.h" -- cgit v1.2.3 From 6a2b4bbcecaadab41fd89d5219f328f3e5916ceb Mon Sep 17 00:00:00 2001 From: grunfink Date: Thu, 8 Jan 2026 08:40:18 +0100 Subject: If disable_emojireact is set to true in server.json, EmojiReacts are dropped on input. --- activitypub.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 617fd30..5e55b8a 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2578,6 +2578,11 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) return -1; } + if (strcmp(type, "EmojiReact") == 0 && xs_is_true(xs_dict_get(srv_config, "disable_emojireact"))) { + srv_log(xs_fmt("Dropping EmojiReact from %s due to admin configuration", actor)); + return -1; + } + const char *object, *utype; object = xs_dict_get(msg, "object"); -- cgit v1.2.3 From 6ad2365a41dd84ee925d7921a1c5756499d6fb17 Mon Sep 17 00:00:00 2001 From: byte Date: Mon, 12 Jan 2026 01:25:49 +0100 Subject: user-specified word mutes and matching --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 5e55b8a..829f6d5 100644 --- a/activitypub.c +++ b/activitypub.c @@ -2958,7 +2958,7 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req) if (xs_is_null(object)) snac_log(snac, xs_fmt("malformed message: no 'id' field")); else - if (timeline_admire(snac, object, actor, 1, xs_dup(msg)) == HTTP_STATUS_CREATED) + if (timeline_admire(snac, object, actor, 1, msg) == HTTP_STATUS_CREATED) snac_log(snac, xs_fmt("new '%s' %s %s", type, actor, object)); else snac_log(snac, xs_fmt("repeated '%s' from %s to %s", type, actor, object)); -- cgit v1.2.3 From de9d546d70cfcbf3b2450b70039470c9a68ecdc6 Mon Sep 17 00:00:00 2001 From: violette Date: Mon, 12 Jan 2026 06:03:04 +0100 Subject: Added emoji categories. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 829f6d5..1992b13 100644 --- a/activitypub.c +++ b/activitypub.c @@ -1611,7 +1611,7 @@ xs_dict *msg_emoji_init(snac *snac, const char *mid, const char *eid_o) xs *dict = xs_dict_new(); xs *icon = xs_dict_new(); xs *accounts = xs_list_new(); - xs *emjs = emojis(); + xs *emjs = emojis_rm_categories(); /* may be a default emoji */ xs *eidd = xs_dup(eid); -- cgit v1.2.3 From d8d40acfd17dfe28654f7acfac648a896033b63b Mon Sep 17 00:00:00 2001 From: grunfink Date: Mon, 19 Jan 2026 15:53:19 +0100 Subject: New command-line option 'refresh'. --- activitypub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activitypub.c') diff --git a/activitypub.c b/activitypub.c index 1992b13..c34e510 100644 --- a/activitypub.c +++ b/activitypub.c @@ -3395,7 +3395,7 @@ void process_user_queue_item(snac *user, xs_dict *q_item) actor_add(actor, actor_o); } else { - if (status == HTTP_STATUS_GONE) { + if (status == HTTP_STATUS_GONE || status == HTTP_STATUS_NOT_FOUND) { actor_failure(actor, 1); snac_log(user, xs_fmt("actor_refresh marking actor %s as broken %d", actor, status)); } -- cgit v1.2.3